/ Hex Artifact Content
Login

Artifact 8dd4cb208b9b70beeb9da7dbcd9b8b8b08261ed7:


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 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e  Cur && pTerm->u.
8670: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
8680: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
8690: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
86a0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49  erator & WO_EQUI
86b0: 56 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  V)!=0.          
86c0: 20 26 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69   && pScan->nEqui
86d0: 76 3c 41 72 72 61 79 53 69 7a 65 28 70 53 63 61  v<ArraySize(pSca
86e0: 6e 2d 3e 61 45 71 75 69 76 29 0a 20 20 20 20 20  n->aEquiv).     
86f0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
8700: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
8710: 20 20 20 20 20 20 20 70 58 20 3d 20 73 71 6c 69         pX = sqli
8720: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
8730: 74 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  te(pTerm->pExpr-
8740: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
8750: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
8760: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
8770: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
8780: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d  or(j=0; j<pScan-
8790: 3e 6e 45 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a  >nEquiv; j+=2){.
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
87b0: 28 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  ( pScan->aEquiv[
87c0: 6a 5d 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20  j]==pX->iTable. 
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
87e0: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a   pScan->aEquiv[j
87f0: 2b 31 5d 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e  +1]==pX->iColumn
8800: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8810: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8820: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8830: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8840: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 53         if( j==pS
8850: 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20  can->nEquiv ){. 
8860: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63               pSc
8870: 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20  an->aEquiv[j] = 
8880: 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pX->iTable;.    
8890: 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d            pScan-
88a0: 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70  >aEquiv[j+1] = p
88b0: 58 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  X->iColumn;.    
88c0: 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d            pScan-
88d0: 3e 6e 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20  >nEquiv += 2;.  
88e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
88f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8900: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
8910: 70 65 72 61 74 6f 72 20 26 20 70 53 63 61 6e 2d  perator & pScan-
8920: 3e 6f 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20  >opMask)!=0 ){. 
8930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65             /* Ve
8940: 72 69 66 79 20 74 68 65 20 61 66 66 69 6e 69 74  rify the affinit
8950: 79 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  y and collating 
8960: 73 65 71 75 65 6e 63 65 20 6d 61 74 63 68 20 2a  sequence match *
8970: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
8980: 28 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61  ( pScan->zCollNa
8990: 6d 65 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f  me && (pTerm->eO
89a0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
89b0: 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)==0 ){.     
89c0: 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
89d0: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20   *pColl;.       
89e0: 20 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 50         Parse *pP
89f0: 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e  arse = pWC->pWIn
8a00: 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  fo->pParse;.    
8a10: 20 20 20 20 20 20 20 20 20 20 70 58 20 3d 20 70            pX = p
8a20: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
8a30: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
8a40: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
8a50: 6e 69 74 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e  nityOk(pX, pScan
8a60: 2d 3e 69 64 78 61 66 66 29 20 29 7b 0a 20 20 20  ->idxaff) ){.   
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
8a80: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
8a90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8aa0: 20 20 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e       assert(pX->
8ab0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
8ac0: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
8ad0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
8ae0: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
8af0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b20: 20 20 20 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70      pX->pLeft, p
8b30: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
8b40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
8b50: 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d  oll==0 ) pColl =
8b60: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
8b70: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
8b80: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
8b90: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
8ba0: 7a 4e 61 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43  zName, pScan->zC
8bb0: 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  ollName) ){.    
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
8bd0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
8be0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8bf0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
8c00: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
8c10: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 21 3d  rator & WO_EQ)!=
8c20: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  0.             &
8c30: 26 20 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  & (pX = pTerm->p
8c40: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f  Expr->pRight)->o
8c50: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
8c60: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d            && pX-
8c70: 3e 69 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e  >iTable==pScan->
8c80: 61 45 71 75 69 76 5b 30 5d 0a 20 20 20 20 20 20  aEquiv[0].      
8c90: 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 43         && pX->iC
8ca0: 6f 6c 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 45  olumn==pScan->aE
8cb0: 71 75 69 76 5b 31 5d 0a 20 20 20 20 20 20 20 20  quiv[1].        
8cc0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
8cd0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
8ce0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8cf0: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
8d00: 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20  k = k+1;.       
8d10: 20 20 20 20 20 72 65 74 75 72 6e 20 70 54 65 72       return pTer
8d20: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  m;.          }. 
8d30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8d40: 0a 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 57  .      pScan->pW
8d50: 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 2d 3e  C = pScan->pWC->
8d60: 70 4f 75 74 65 72 3b 0a 20 20 20 20 20 20 6b 20  pOuter;.      k 
8d70: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
8d80: 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61  Scan->pWC = pSca
8d90: 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a 20 20 20 20  n->pOrigWC;.    
8da0: 6b 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e  k = 0;.    pScan
8db0: 2d 3e 69 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20  ->iEquiv += 2;. 
8dc0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
8dd0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
8de0: 7a 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ze a WHERE claus
8df0: 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74  e scanner object
8e00: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
8e10: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69  ter to the.** fi
8e20: 72 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74 75  rst match.  Retu
8e30: 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  rn NULL if there
8e40: 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e   are no matches.
8e50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e  .**.** The scann
8e60: 65 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  er will be searc
8e70: 68 69 6e 67 20 74 68 65 20 57 48 45 52 45 20 63  hing the WHERE c
8e80: 6c 61 75 73 65 20 70 57 43 2e 20 20 49 74 20 77  lause pWC.  It w
8e90: 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20  ill look.** for 
8ea0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  terms of the for
8eb0: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
8ec0: 22 20 77 68 65 72 65 20 58 20 69 73 20 63 6f 6c  " where X is col
8ed0: 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74  umn iColumn of t
8ee0: 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54  able.** iCur.  T
8ef0: 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20  he <op> must be 
8f00: 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  one of the opera
8f10: 74 6f 72 73 20 64 65 73 63 72 69 62 65 64 20 62  tors described b
8f20: 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20  y opMask..**.** 
8f30: 49 66 20 74 68 65 20 73 65 61 72 63 68 20 69 73  If the search is
8f40: 20 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20 57   for X and the W
8f50: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
8f60: 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74 68  ains terms of th
8f70: 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68  e.** form X=Y th
8f80: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
8f90: 6d 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75 72  might also retur
8fa0: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  n terms of the f
8fb0: 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c  orm.** "Y <op> <
8fc0: 65 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d  expr>".  The num
8fd0: 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66  ber of levels of
8fe0: 20 74 72 61 6e 73 69 74 69 76 69 74 79 20 69 73   transitivity is
8ff0: 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74   limited,.** but
9000: 20 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68 61   is enough to ha
9010: 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e  ndle most common
9020: 6c 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51 4c  ly occurring SQL
9030: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
9040: 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20 74  ** If X is not t
9050: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
9060: 52 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d 75  RY KEY then X mu
9070: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
9080: 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70   with.** index p
9090: 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  Idx..*/.static W
90a0: 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53  hereTerm *whereS
90b0: 63 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72 65  canInit(.  Where
90c0: 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20  Scan *pScan,    
90d0: 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 53     /* The WhereS
90e0: 63 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e 67  can object being
90f0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a   initialized */.
9100: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
9110: 57 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  WC,       /* The
9120: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
9130: 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20   be scanned */. 
9140: 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20   int iCur,      
9150: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
9160: 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  or to scan for *
9170: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
9180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
9190: 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f  olumn to scan fo
91a0: 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73  r */.  u32 opMas
91b0: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
91c0: 2a 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74 6f  * Operator(s) to
91d0: 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49   scan for */.  I
91e0: 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
91f0: 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
9200: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
9210: 68 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a  h this index */.
9220: 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f  ){.  int j;..  /
9230: 2a 20 6d 65 6d 73 65 74 28 70 53 63 61 6e 2c 20  * memset(pScan, 
9240: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 63 61 6e  0, sizeof(*pScan
9250: 29 29 3b 20 2a 2f 0a 20 20 70 53 63 61 6e 2d 3e  )); */.  pScan->
9260: 70 4f 72 69 67 57 43 20 3d 20 70 57 43 3b 0a 20  pOrigWC = pWC;. 
9270: 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57   pScan->pWC = pW
9280: 43 3b 0a 20 20 69 66 28 20 70 49 64 78 20 26 26  C;.  if( pIdx &&
9290: 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20   iColumn>=0 ){. 
92a0: 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66     pScan->idxaff
92b0: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
92c0: 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61  >aCol[iColumn].a
92d0: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 66 6f 72  ffinity;.    for
92e0: 28 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f  (j=0; pIdx->aiCo
92f0: 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e  lumn[j]!=iColumn
9300: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
9310: 28 20 4e 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d  ( NEVER(j>=pIdx-
9320: 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20 72 65 74 75  >nColumn) ) retu
9330: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
9340: 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65  pScan->zCollName
9350: 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
9360: 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  j];.  }else{.   
9370: 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d   pScan->idxaff =
9380: 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a   0;.    pScan->z
9390: 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  CollName = 0;.  
93a0: 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73  }.  pScan->opMas
93b0: 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53  k = opMask;.  pS
93c0: 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53  can->k = 0;.  pS
93d0: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d  can->aEquiv[0] =
93e0: 20 69 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e   iCur;.  pScan->
93f0: 61 45 71 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c  aEquiv[1] = iCol
9400: 75 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45  umn;.  pScan->nE
9410: 71 75 69 76 20 3d 20 32 3b 0a 20 20 70 53 63 61  quiv = 2;.  pSca
9420: 6e 2d 3e 69 45 71 75 69 76 20 3d 20 32 3b 0a 20  n->iEquiv = 2;. 
9430: 20 72 65 74 75 72 6e 20 77 68 65 72 65 53 63 61   return whereSca
9440: 6e 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a  nNext(pScan);.}.
9450: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
9460: 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  r a term in the 
9470: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
9480: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
9490: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
94a0: 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61  .** where X is a
94b0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
94c0: 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  e iColumn of tab
94d0: 6c 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e  le iCur and <op>
94e0: 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68   is one of.** th
94f0: 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72  e WO_xx operator
9500: 20 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64   codes specified
9510: 20 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d   by the op param
9520: 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  eter..** Return 
9530: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
9540: 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30   term.  Return 0
9550: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
9560: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 72 65  *.** The term re
9570: 74 75 72 6e 65 64 20 6d 69 67 68 74 20 62 79 20  turned might by 
9580: 59 3d 3c 65 78 70 72 3e 20 69 66 20 74 68 65 72  Y=<expr> if ther
9590: 65 20 69 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e  e is another con
95a0: 73 74 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68  straint in.** th
95b0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
95c0: 68 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68  hat specifies th
95d0: 61 74 20 58 3d 59 2e 20 20 41 6e 79 20 73 75 63  at X=Y.  Any suc
95e0: 68 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69  h constraints wi
95f0: 6c 6c 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66  ll be.** identif
9600: 69 65 64 20 62 79 20 74 68 65 20 57 4f 5f 45 51  ied by the WO_EQ
9610: 55 49 56 20 62 69 74 20 69 6e 20 74 68 65 20 70  UIV bit in the p
9620: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
9630: 66 69 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61  field.  The.** a
9640: 45 71 75 69 76 5b 5d 20 61 72 72 61 79 20 68 6f  Equiv[] array ho
9650: 6c 64 73 20 58 20 61 6e 64 20 61 6c 6c 20 69 74  lds X and all it
9660: 73 20 65 71 75 69 76 61 6c 65 6e 74 73 2c 20 77  s equivalents, w
9670: 69 74 68 20 65 61 63 68 20 53 51 4c 20 76 61 72  ith each SQL var
9680: 69 61 62 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20  iable.** taking 
9690: 75 70 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20  up two slots in 
96a0: 61 45 71 75 69 76 5b 5d 2e 20 20 54 68 65 20 66  aEquiv[].  The f
96b0: 69 72 73 74 20 73 6c 6f 74 20 69 73 20 66 6f 72  irst slot is for
96c0: 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
96d0: 65 72 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65  er.** and the se
96e0: 63 6f 6e 64 20 69 73 20 66 6f 72 20 74 68 65 20  cond is for the 
96f0: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20  column number.  
9700: 54 68 65 72 65 20 61 72 65 20 32 32 20 73 6c 6f  There are 22 slo
9710: 74 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a  ts in aEquiv[].*
9720: 2a 20 73 6f 20 74 68 61 74 20 6d 65 61 6e 73 20  * so that means 
9730: 77 65 20 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20  we can look for 
9740: 58 20 70 6c 75 73 20 75 70 20 74 6f 20 31 30 20  X plus up to 10 
9750: 6f 74 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74  other equivalent
9760: 20 76 61 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63   values..** Henc
9770: 65 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 58  e a search for X
9780: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78   will return <ex
9790: 70 72 3e 20 69 66 20 58 3d 41 31 20 61 6e 64 20  pr> if X=A1 and 
97a0: 41 31 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 0a  A1=A2 and A2=A3.
97b0: 2a 2a 20 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41  ** and ... and A
97c0: 39 3d 41 31 30 20 61 6e 64 20 41 31 30 3d 3c 65  9=A10 and A10=<e
97d0: 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  xpr>..**.** If t
97e0: 68 65 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c  here are multipl
97f0: 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57  e terms in the W
9800: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
9810: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
9820: 3c 65 78 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20  <expr>".** then 
9830: 74 72 79 20 66 6f 72 20 74 68 65 20 6f 6e 65 20  try for the one 
9840: 77 69 74 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e  with no dependen
9850: 63 69 65 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d  cies on <expr> -
9860: 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20   in other words 
9870: 77 68 65 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20  where.** <expr> 
9880: 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  is a constant ex
9890: 70 72 65 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65  pression of some
98a0: 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74   kind.  Only ret
98b0: 75 72 6e 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a  urn entries of.*
98c0: 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  * the form "X <o
98d0: 70 3e 20 59 22 20 77 68 65 72 65 20 59 20 69 73  p> Y" where Y is
98e0: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f   a column in ano
98f0: 74 68 65 72 20 74 61 62 6c 65 20 69 66 20 6e 6f  ther table if no
9900: 20 74 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65   terms of.** the
9910: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63   form "X <op> <c
9920: 6f 6e 73 74 2d 65 78 70 72 3e 22 20 65 78 69 73  onst-expr>" exis
9930: 74 2e 20 20 20 49 66 20 6e 6f 20 74 65 72 6d 73  t.   If no terms
9940: 20 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74   with a constant
9950: 20 52 48 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74   RHS.** exist, t
9960: 72 79 20 74 6f 20 72 65 74 75 72 6e 20 61 20 74  ry to return a t
9970: 65 72 6d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  erm that does no
9980: 74 20 75 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a  t use WO_EQUIV..
9990: 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54  */.static WhereT
99a0: 65 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20  erm *findTerm(. 
99b0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
99c0: 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  C,     /* The WH
99d0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
99e0: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69   searched */.  i
99f0: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
9a00: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
9a10: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
9a20: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
9a30: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
9a40: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  n number of LHS 
9a50: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
9a60: 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48  Ready,     /* RH
9a70: 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c  S must not overl
9a80: 61 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73  ap with this mas
9a90: 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20  k */.  u32 op,  
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9ab0: 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61  Mask of WO_xx va
9ac0: 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20  lues describing 
9ad0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e  operator */.  In
9ae0: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
9af0: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
9b00: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
9b10: 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f  his index, if no
9b20: 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57  t NULL */.){.  W
9b30: 68 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c  hereTerm *pResul
9b40: 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65  t = 0;.  WhereTe
9b50: 72 6d 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63  rm *p;.  WhereSc
9b60: 61 6e 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20  an scan;..  p = 
9b70: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
9b80: 63 61 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20  can, pWC, iCur, 
9b90: 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64  iColumn, op, pId
9ba0: 78 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  x);.  while( p )
9bb0: 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  {.    if( (p->pr
9bc0: 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52  ereqRight & notR
9bd0: 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eady)==0 ){.    
9be0: 20 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52    if( p->prereqR
9bf0: 69 67 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65  ight==0 && (p->e
9c00: 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21  Operator&WO_EQ)!
9c10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
9c20: 74 75 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a  turn p;.      }.
9c30: 20 20 20 20 20 20 69 66 28 20 70 52 65 73 75 6c        if( pResul
9c40: 74 3d 3d 30 20 29 20 70 52 65 73 75 6c 74 20 3d  t==0 ) pResult =
9c50: 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20   p;.    }.    p 
9c60: 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28  = whereScanNext(
9c70: 26 73 63 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65  &scan);.  }.  re
9c80: 74 75 72 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a  turn pResult;.}.
9c90: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
9ca0: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
9cb0: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
9cc0: 28 53 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65  (SrcList*, Where
9cd0: 43 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a  Clause*, int);..
9ce0: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41  /*.** Call exprA
9cf0: 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65  nalyze on all te
9d00: 72 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20 63  rms in a WHERE c
9d10: 6c 61 75 73 65 2e 20 20 0a 2a 2f 0a 73 74 61 74  lause.  .*/.stat
9d20: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
9d30: 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73  yzeAll(.  SrcLis
9d40: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
9d50: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
9d60: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
9d70: 43 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20  Clause *pWC     
9d80: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
9d90: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e   clause to be an
9da0: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  alyzed */.){.  i
9db0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57  nt i;.  for(i=pW
9dc0: 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30  C->nTerm-1; i>=0
9dd0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72  ; i--){.    expr
9de0: 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74  Analyze(pTabList
9df0: 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d  , pWC, i);.  }.}
9e00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
9e10: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
9e20: 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68  IZATION./*.** Ch
9e30: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
9e40: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
9e50: 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20  on is a LIKE or 
9e60: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68  GLOB operator th
9e70: 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74  at.** can be opt
9e80: 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65  imized using ine
9e90: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
9ea0: 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55  nts.  Return TRU
9eb0: 45 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f  E if it is.** so
9ec0: 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f   and false if no
9ed0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65  t..**.** In orde
9ee0: 72 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74  r for the operat
9ef0: 6f 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a  or to be optimiz
9f00: 69 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75  ible, the RHS mu
9f10: 73 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a  st be a string.*
9f20: 2a 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64  * literal that d
9f30: 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69  oes not begin wi
9f40: 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20  th a wildcard.  
9f50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
9f60: 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50  sLikeOrGlob(.  P
9f70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
9f80: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
9f90: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
9fa0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
9fb0: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
9fc0: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
9fd0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ession */.  Expr
9fe0: 20 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a   **ppPrefix,  /*
9ff0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53   Pointer to TK_S
a000: 54 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  TRING expression
a010: 20 77 69 74 68 20 70 61 74 74 65 72 6e 20 70 72   with pattern pr
a020: 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  efix */.  int *p
a030: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54  isComplete, /* T
a040: 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20  rue if the only 
a050: 77 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e  wildcard is % in
a060: 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   the last charac
a070: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ter */.  int *pn
a080: 6f 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72  oCase      /* Tr
a090: 75 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20  ue if uppercase 
a0a0: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
a0b0: 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b   lowercase */.){
a0c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
a0d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
a0e0: 20 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f   String on RHS o
a0f0: 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  f LIKE operator 
a100: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
a110: 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  t, *pLeft;      
a120: 2f 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66  /* Right and lef
a130: 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f  t size of LIKE o
a140: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70  perator */.  Exp
a150: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
a160: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
a170: 6f 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74  of operands to t
a180: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
a190: 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20   */.  int c;    
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1b0: 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65   /* One characte
a1c0: 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e  r in z[] */.  in
a1d0: 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  t cnt;          
a1e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a1f0: 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61  er of non-wildca
a200: 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63  rd prefix charac
a210: 74 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77  ters */.  char w
a220: 63 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20  c[3];           
a230: 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64       /* Wildcard
a240: 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20   characters */. 
a250: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
a260: 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
a270: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
a280: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
a290: 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b  value *pVal = 0;
a2a0: 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a2c0: 20 4f 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68   Opcode of pRigh
a2d0: 74 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c  t */..  if( !sql
a2e0: 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69  ite3IsLikeFuncti
a2f0: 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e  on(db, pExpr, pn
a300: 6f 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20  oCase, wc) ){.  
a310: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
a320: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42  #ifdef SQLITE_EB
a330: 43 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43  CDIC.  if( *pnoC
a340: 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ase ) return 0;.
a350: 23 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d  #endif.  pList =
a360: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
a370: 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74  .  pLeft = pList
a380: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
a390: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54  if( pLeft->op!=T
a3a0: 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20  K_COLUMN .   || 
a3b0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
a3c0: 69 74 79 28 70 4c 65 66 74 29 21 3d 53 51 4c 49  ity(pLeft)!=SQLI
a3d0: 54 45 5f 41 46 46 5f 54 45 58 54 20 0a 20 20 20  TE_AFF_TEXT .   
a3e0: 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 4c 65  || IsVirtual(pLe
a3f0: 66 74 2d 3e 70 54 61 62 29 0a 20 20 29 7b 0a 20  ft->pTab).  ){. 
a400: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30     /* IMP: R-020
a410: 36 35 2d 34 39 34 36 35 20 54 68 65 20 6c 65 66  65-49465 The lef
a420: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
a430: 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20  he LIKE or GLOB 
a440: 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 0a 20 20  operator must.  
a450: 20 20 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d 65    ** be the name
a460: 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63   of an indexed c
a470: 6f 6c 75 6d 6e 20 77 69 74 68 20 54 45 58 54 20  olumn with TEXT 
a480: 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20  affinity. */.   
a490: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a4a0: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e   assert( pLeft->
a4b0: 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b  iColumn!=(-1) );
a4c0: 20 2f 2a 20 42 65 63 61 75 73 65 20 49 50 4b 20   /* Because IPK 
a4d0: 6e 65 76 65 72 20 68 61 73 20 41 46 46 5f 54 45  never has AFF_TE
a4e0: 58 54 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20  XT */..  pRight 
a4f0: 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  = pList->a[0].pE
a500: 78 70 72 3b 0a 20 20 6f 70 20 3d 20 70 52 69 67  xpr;.  op = pRig
a510: 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70  ht->op;.  if( op
a520: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b  ==TK_REGISTER ){
a530: 0a 20 20 20 20 6f 70 20 3d 20 70 52 69 67 68 74  .    op = pRight
a540: 2d 3e 6f 70 32 3b 0a 20 20 7d 0a 20 20 69 66 28  ->op2;.  }.  if(
a550: 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45   op==TK_VARIABLE
a560: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52   ){.    Vdbe *pR
a570: 65 70 72 65 70 61 72 65 20 3d 20 70 50 61 72 73  eprepare = pPars
a580: 65 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20  e->pReprepare;. 
a590: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52     int iCol = pR
a5a0: 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  ight->iColumn;. 
a5b0: 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
a5c0: 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c  3VdbeGetBoundVal
a5d0: 75 65 28 70 52 65 70 72 65 70 61 72 65 2c 20 69  ue(pReprepare, i
a5e0: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  Col, SQLITE_AFF_
a5f0: 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70  NONE);.    if( p
a600: 56 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76  Val && sqlite3_v
a610: 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d  alue_type(pVal)=
a620: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
a630: 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20        z = (char 
a640: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
a650: 74 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20  text(pVal);.    
a660: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
a670: 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72  eSetVarmask(pPar
a680: 73 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29  se->pVdbe, iCol)
a690: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
a6a0: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  ight->op==TK_VAR
a6b0: 49 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d  IABLE || pRight-
a6c0: 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
a6d0: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
a6e0: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b  op==TK_STRING ){
a6f0: 0a 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d  .    z = pRight-
a700: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20  >u.zToken;.  }. 
a710: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e   if( z ){.    cn
a720: 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  t = 0;.    while
a730: 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20  ( (c=z[cnt])!=0 
a740: 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63  && c!=wc[0] && c
a750: 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63  !=wc[1] && c!=wc
a760: 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  [2] ){.      cnt
a770: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
a780: 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21  ( cnt!=0 && 255!
a790: 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b  =(u8)z[cnt-1] ){
a7a0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72  .      Expr *pPr
a7b0: 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73  efix;.      *pis
a7c0: 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63  Complete = c==wc
a7d0: 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d  [0] && z[cnt+1]=
a7e0: 3d 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69  =0;.      pPrefi
a7f0: 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  x = sqlite3Expr(
a800: 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a  db, TK_STRING, z
a810: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  );.      if( pPr
a820: 65 66 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e  efix ) pPrefix->
a830: 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20  u.zToken[cnt] = 
a840: 30 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66  0;.      *ppPref
a850: 69 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20  ix = pPrefix;.  
a860: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56      if( op==TK_V
a870: 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20  ARIABLE ){.     
a880: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
a890: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
a8a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
a8b0: 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69  etVarmask(v, pRi
a8c0: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  ght->iColumn);. 
a8d0: 20 20 20 20 20 20 20 69 66 28 20 2a 70 69 73 43         if( *pisC
a8e0: 6f 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67 68  omplete && pRigh
a8f0: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29  t->u.zToken[1] )
a900: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
a910: 66 20 74 68 65 20 72 68 73 20 6f 66 20 74 68 65  f the rhs of the
a920: 20 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e   LIKE expression
a930: 20 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20   is a variable, 
a940: 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a  and the current.
a950: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c            ** val
a960: 75 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 62  ue of the variab
a970: 6c 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69  le means there i
a980: 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76  s no need to inv
a990: 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20  oke the LIKE.   
a9a0: 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
a9b0: 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56  on, then no OP_V
a9c0: 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  ariable will be 
a9d0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f  added to the pro
a9e0: 67 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20  gram..          
a9f0: 2a 2a 20 54 68 69 73 20 63 61 75 73 65 73 20 70  ** This causes p
aa00: 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20  roblems for the 
aa10: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
aa20: 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20  ameter_name().  
aa30: 20 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20          ** API. 
aa40: 54 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68  To workaround th
aa50: 65 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20  em, add a dummy 
aa60: 4f 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65  OP_Variable here
aa70: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a  ..          */ .
aa80: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
aa90: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
aaa0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
aab0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
aac0: 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
aad0: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31  arse, pRight, r1
aae0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
aaf0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
ab00: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
ab10: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
ab20: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
ab30: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
ab40: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
ab50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ab60: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
ab70: 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20       z = 0;.    
ab80: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
ab90: 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
aba0: 0a 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29  .  return (z!=0)
abb0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
abc0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
abd0: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
abe0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
abf0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
ac00: 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  E./*.** Check to
ac10: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
ac20: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
ac30: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a  of the form.**.*
ac40: 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
ac50: 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a   MATCH expr.**.*
ac60: 2a 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20  * If it is then 
ac70: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66  return TRUE.  If
ac80: 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c   not, return FAL
ac90: 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SE..*/.static in
aca0: 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d  t isMatchOfColum
acb0: 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  n(.  Expr *pExpr
acc0: 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68        /* Test th
acd0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
ace0: 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
acf0: 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45  pList;..  if( pE
ad00: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43  xpr->op!=TK_FUNC
ad10: 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  TION ){.    retu
ad20: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
ad30: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
ad40: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22  Expr->u.zToken,"
ad50: 6d 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20  match")!=0 ){.  
ad60: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
ad70: 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d    pList = pExpr-
ad80: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20  >x.pList;.  if( 
ad90: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20  pList->nExpr!=2 
ada0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
adb0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
adc0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[1].pExpr->op
add0: 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b   != TK_COLUMN ){
ade0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
adf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
ae00: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ae10: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
ae20: 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  BLE */../*.** If
ae30: 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65   the pBase expre
ae40: 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64  ssion originated
ae50: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
ae60: 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a  ING clause of.**
ae70: 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72   a join, then tr
ae80: 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f  ansfer the appro
ae90: 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20  priate markings 
aea0: 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e  over to derived.
aeb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
aec0: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
aed0: 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69  ings(Expr *pDeri
aee0: 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65  ved, Expr *pBase
aef0: 29 7b 0a 20 20 69 66 28 20 70 44 65 72 69 76 65  ){.  if( pDerive
af00: 64 20 29 7b 0a 20 20 20 20 70 44 65 72 69 76 65  d ){.    pDerive
af10: 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61 73  d->flags |= pBas
af20: 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 72  e->flags & EP_Fr
af30: 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70 44 65 72  omJoin;.    pDer
af40: 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  ived->iRightJoin
af50: 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69  Table = pBase->i
af60: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
af70: 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69    }.}..#if !defi
af80: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
af90: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
afa0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
afb0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
afc0: 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  Y)./*.** Analyze
afd0: 20 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e   a term that con
afe0: 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20  sists of two or 
aff0: 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  more OR-connecte
b000: 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20  d.** subterms.  
b010: 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  So in:.**.**    
b020: 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35   ... WHERE  (a=5
b030: 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d  ) AND (b=7 OR c=
b040: 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28  9 OR d=13) AND (
b050: 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20  d=13).**        
b060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b070: 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e    ^^^^^^^^^^^^^^
b080: 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69  ^^^^^^.**.** Thi
b090: 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a  s routine analyz
b0a0: 65 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73  es terms such as
b0b0: 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d   the middle term
b0c0: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78   in the above ex
b0d0: 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72  ample..** A Wher
b0e0: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69  eOrTerm object i
b0f0: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61  s computed and a
b100: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
b110: 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61  erm under.** ana
b120: 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73  lysis, regardles
b130: 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65  s of the outcome
b140: 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73   of the analysis
b150: 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20  .  Hence:.**.** 
b160: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74      WhereTerm.wt
b170: 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d  Flags   |=  TERM
b180: 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57  _ORINFO.**     W
b190: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
b1a0: 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63  fo  =  a dynamic
b1b0: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57  ally allocated W
b1c0: 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63  hereOrTerm objec
b1d0: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  t.**.** The term
b1e0: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
b1f0: 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72  must have two or
b200: 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e   more of OR-conn
b210: 65 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a  ected subterms..
b220: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74  ** A single subt
b230: 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73  erm might be a s
b240: 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63  et of AND-connec
b250: 74 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73  ted sub-subterms
b260: 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66  ..** Examples of
b270: 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61   terms under ana
b280: 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lysis:.**.**    
b290: 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32   (A)     t1.x=t2
b2a0: 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20  .y OR t1.x=t2.z 
b2b0: 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31  OR t1.y=15 OR t1
b2c0: 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20  .z=t3.a+5.**    
b2d0: 20 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31   (B)     x=expr1
b2e0: 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78   OR expr2=x OR x
b2f0: 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43  =expr3.**     (C
b300: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
b310: 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e  OR (t1.x=t2.z AN
b320: 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20  D t1.y=15).**   
b330: 20 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72    (D)     x=expr
b340: 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79  1 OR (y>11 AND y
b350: 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27  <22 AND z LIKE '
b360: 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20  *hello*').**    
b370: 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20   (E)     (p.a=1 
b380: 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e  AND q.b=2 AND r.
b390: 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41  c=3) OR (p.x=4 A
b3a0: 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a  ND q.y=5 AND r.z
b3b0: 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31  =6).**.** CASE 1
b3c0: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
b3d0: 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74  ubterms are of t
b3e0: 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72  he form T.C=expr
b3f0: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
b400: 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64   column of C and
b410: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62  .** a single tab
b420: 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69  le T (as shown i
b430: 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76  n example B abov
b440: 65 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  e) then create a
b450: 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20   new virtual.** 
b460: 74 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20  term that is an 
b470: 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78  equivalent IN ex
b480: 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74  pression.  In ot
b490: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
b4a0: 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20  e term.** being 
b4b0: 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a  analyzed is:.**.
b4c0: 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72  **      x = expr
b4d0: 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78  1  OR  expr2 = x
b4e0: 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a    OR  x = expr3.
b4f0: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  **.** then creat
b500: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  e a new virtual 
b510: 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a  term like this:.
b520: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
b530: 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70  (expr1,expr2,exp
b540: 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32  r3).**.** CASE 2
b550: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
b560: 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65  ubterms are inde
b570: 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c  xable by a singl
b580: 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20  e table T, then 
b590: 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  set.**.**     Wh
b5a0: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
b5b0: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  r              =
b5c0: 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57    WO_OR.**     W
b5d0: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
b5e0: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c  fo->indexable  |
b5f0: 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  =  the cursor nu
b600: 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54  mber for table T
b610: 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  .**.** A subterm
b620: 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20   is "indexable" 
b630: 69 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20  if it is of the 
b640: 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70  form.** "T.C <op
b650: 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20  > <expr>" where 
b660: 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  C is any column 
b670: 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a  of table T and .
b680: 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  ** <op> is one o
b690: 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22  f "=", "<", "<="
b6a0: 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53  , ">", ">=", "IS
b6b0: 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e   NULL", or "IN".
b6c0: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73  .** A subterm is
b6d0: 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20   also indexable 
b6e0: 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20  if it is an AND 
b6f0: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  of two or more.*
b700: 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74  * subsubterms at
b710: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68   least one of wh
b720: 69 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65  ich is indexable
b730: 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44  .  Indexable AND
b740: 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61   .** subterms ha
b750: 76 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74  ve their eOperat
b760: 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44  or set to WO_AND
b770: 20 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a   and they have.*
b780: 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74  * u.pAndInfo set
b790: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
b7a0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
b7b0: 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e  eAndTerm object.
b7c0: 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74  .**.** From anot
b7d0: 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65  her point of vie
b7e0: 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d  w, "indexable" m
b7f0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75  eans that the su
b800: 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70  bterm could.** p
b810: 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73  otentially be us
b820: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
b830: 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61   if an appropria
b840: 74 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e  te index exists.
b850: 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69  .** This analysi
b860: 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69  s does not consi
b870: 64 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e  der whether or n
b880: 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69  ot the index exi
b890: 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20  sts; that.** is 
b8a0: 64 65 63 69 64 65 64 20 65 6c 73 65 77 68 65 72  decided elsewher
b8b0: 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69  e.  This analysi
b8c0: 73 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20  s only looks at 
b8d0: 77 68 65 74 68 65 72 20 73 75 62 74 65 72 6d 73  whether subterms
b8e0: 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20  .** appropriate 
b8f0: 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69  for indexing exi
b900: 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78  st..**.** All ex
b910: 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68  amples A through
b920: 20 45 20 61 62 6f 76 65 20 73 61 74 69 73 66 79   E above satisfy
b930: 20 63 61 73 65 20 32 2e 20 20 42 75 74 20 69 66   case 2.  But if
b940: 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20   a term.** also 
b950: 73 74 61 74 69 73 66 69 65 73 20 63 61 73 65 20  statisfies case 
b960: 31 20 28 73 75 63 68 20 61 73 20 42 29 20 77 65  1 (such as B) we
b970: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
b980: 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a  ptimizer will.**
b990: 20 61 6c 77 61 79 73 20 70 72 65 66 65 72 20 63   always prefer c
b9a0: 61 73 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61  ase 1, so in tha
b9b0: 74 20 63 61 73 65 20 77 65 20 70 72 65 74 65 6e  t case we preten
b9c0: 64 20 74 68 61 74 20 63 61 73 65 20 32 20 69 73  d that case 2 is
b9d0: 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65   not.** satisfie
b9e0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68  d..**.** It migh
b9f0: 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  t be the case th
ba00: 61 74 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c  at multiple tabl
ba10: 65 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65  es are indexable
ba20: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a  .  For example,.
ba30: 2a 2a 20 28 45 29 20 61 62 6f 76 65 20 69 73 20  ** (E) above is 
ba40: 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62  indexable on tab
ba50: 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e  les P, Q, and R.
ba60: 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61  .**.** Terms tha
ba70: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32  t satisfy case 2
ba80: 20 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20   are candidates 
ba90: 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73  for lookup by us
baa0: 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  ing.** separate 
bab0: 69 6e 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20  indices to find 
bac0: 72 6f 77 69 64 73 20 66 6f 72 20 65 61 63 68 20  rowids for each 
bad0: 73 75 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70  subterm and comp
bae0: 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69  osing.** the uni
baf0: 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73  on of all rowids
bb00: 20 75 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20   using a RowSet 
bb10: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73  object.  This is
bb20: 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22   similar.** to "
bb30: 62 69 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20  bitmap indices" 
bb40: 69 6e 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  in other databas
bb50: 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a  e engines..**.**
bb60: 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a   OTHERWISE:.**.*
bb70: 2a 20 49 66 20 6e 65 69 74 68 65 72 20 63 61 73  * If neither cas
bb80: 65 20 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61  e 1 nor case 2 a
bb90: 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65  pply, then leave
bba0: 20 74 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73   the eOperator s
bbb0: 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20  et to.** zero.  
bbc0: 54 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74  This term is not
bbd0: 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72   useful for sear
bbe0: 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ch..*/.static vo
bbf0: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72  id exprAnalyzeOr
bc00: 54 65 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20  Term(.  SrcList 
bc10: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20  *pSrc,          
bc20: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
bc30: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
bc40: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
bc50: 20 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c      /* the compl
bc60: 65 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ete WHERE clause
bc70: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72   */.  int idxTer
bc80: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
bc90: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
bca0: 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  OR-term to be an
bcb0: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
bcc0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
bcd0: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20   = pWC->pWInfo; 
bce0: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
bcf0: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
bd00: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  g context */.  P
bd10: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
bd20: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
bd30: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
bd40: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
bd50: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
bd60: 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20  se->db;         
bd70: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
bd80: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
bd90: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
bda0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
bdb0: 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65  Term];    /* The
bdc0: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
bdd0: 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  yzed */.  Expr *
bde0: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
bdf0: 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
be00: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
be10: 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20  ion of the term 
be20: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
be50: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
be60: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
be70: 70 4f 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20  pOrWc;       /* 
be80: 42 72 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d  Breakup of pTerm
be90: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
bea0: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
beb0: 4f 72 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a  OrTerm;       /*
bec0: 20 41 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68   A Sub-term with
bed0: 69 6e 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a  in the pOrWc */.
bee0: 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70    WhereOrInfo *p
bef0: 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41  OrInfo;     /* A
bf00: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
bf10: 61 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64  ation associated
bf20: 20 77 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20   with pTerm */. 
bf30: 20 42 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49   Bitmask chngToI
bf40: 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  N;         /* Ta
bf50: 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20  bles that might 
bf60: 73 61 74 69 73 66 79 20 63 61 73 65 20 31 20 2a  satisfy case 1 *
bf70: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
bf80: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a  xable;        /*
bf90: 20 54 61 62 6c 65 73 20 74 68 61 74 20 61 72 65   Tables that are
bfa0: 20 69 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69   indexable, sati
bfb0: 73 66 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f  sfying case 2 */
bfc0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61  ..  /*.  ** Brea
bfd0: 6b 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  k the OR clause 
bfe0: 69 6e 74 6f 20 69 74 73 20 73 65 70 61 72 61 74  into its separat
bff0: 65 20 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65  e subterms.  The
c000: 20 73 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20   subterms are.  
c010: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57  ** stored in a W
c020: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
c030: 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
c040: 77 69 74 68 69 6e 20 74 68 65 20 57 68 65 72 65  within the Where
c050: 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65  OrInfo.  ** obje
c060: 63 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63  ct that is attac
c070: 68 65 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69  hed to the origi
c080: 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65  nal OR clause te
c090: 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  rm..  */.  asser
c0a0: 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  t( (pTerm->wtFla
c0b0: 67 73 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d  gs & (TERM_DYNAM
c0c0: 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54  IC|TERM_ORINFO|T
c0d0: 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30  ERM_ANDINFO))==0
c0e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
c0f0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29  xpr->op==TK_OR )
c100: 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  ;.  pTerm->u.pOr
c110: 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d  Info = pOrInfo =
c120: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
c130: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
c140: 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66  *pOrInfo));.  if
c150: 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72  ( pOrInfo==0 ) r
c160: 65 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e  eturn;.  pTerm->
c170: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
c180: 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20  ORINFO;.  pOrWc 
c190: 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  = &pOrInfo->wc;.
c1a0: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
c1b0: 74 28 70 4f 72 57 63 2c 20 70 57 49 6e 66 6f 29  t(pOrWc, pWInfo)
c1c0: 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 70  ;.  whereSplit(p
c1d0: 4f 72 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f  OrWc, pExpr, TK_
c1e0: 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79  OR);.  exprAnaly
c1f0: 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57  zeAll(pSrc, pOrW
c200: 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  c);.  if( db->ma
c210: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
c220: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
c230: 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29  OrWc->nTerm>=2 )
c240: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d  ;..  /*.  ** Com
c250: 70 75 74 65 20 74 68 65 20 73 65 74 20 6f 66 20  pute the set of 
c260: 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68  tables that migh
c270: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 73 20  t satisfy cases 
c280: 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69  1 or 2..  */.  i
c290: 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28 42 69 74  ndexable = ~(Bit
c2a0: 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f  mask)0;.  chngTo
c2b0: 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  IN = ~(Bitmask)0
c2c0: 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d  ;.  for(i=pOrWc-
c2d0: 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72  >nTerm-1, pOrTer
c2e0: 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30  m=pOrWc->a; i>=0
c2f0: 20 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69   && indexable; i
c300: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
c310: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
c320: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
c330: 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20  _SINGLE)==0 ){. 
c340: 20 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66       WhereAndInf
c350: 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20  o *pAndInfo;.   
c360: 20 20 20 61 73 73 65 72 74 28 20 28 70 4f 72 54     assert( (pOrT
c370: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
c380: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52  TERM_ANDINFO|TER
c390: 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b  M_ORINFO))==0 );
c3a0: 0a 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20  .      chngToIN 
c3b0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 6e 64 49  = 0;.      pAndI
c3c0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
c3d0: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
c3e0: 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b  eof(*pAndInfo));
c3f0: 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 49  .      if( pAndI
c400: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 57  nfo ){.        W
c410: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64  hereClause *pAnd
c420: 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72  WC;.        Wher
c430: 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b  eTerm *pAndTerm;
c440: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
c450: 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
c460: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  b = 0;.        p
c470: 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e  OrTerm->u.pAndIn
c480: 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20  fo = pAndInfo;. 
c490: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
c4a0: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
c4b0: 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20  ANDINFO;.       
c4c0: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
c4d0: 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20  tor = WO_AND;.  
c4e0: 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d 20 26        pAndWC = &
c4f0: 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  pAndInfo->wc;.  
c500: 20 20 20 20 20 20 77 68 65 72 65 43 6c 61 75 73        whereClaus
c510: 65 49 6e 69 74 28 70 41 6e 64 57 43 2c 20 70 57  eInit(pAndWC, pW
c520: 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  C->pWInfo);.    
c530: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
c540: 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e  AndWC, pOrTerm->
c550: 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a  pExpr, TK_AND);.
c560: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
c570: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e  yzeAll(pSrc, pAn
c580: 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41  dWC);.        pA
c590: 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70  ndWC->pOuter = p
c5a0: 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  WC;.        test
c5b0: 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  case( db->malloc
c5c0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
c5d0: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
c5e0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
c5f0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41       for(j=0, pA
c600: 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61  ndTerm=pAndWC->a
c610: 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72  ; j<pAndWC->nTer
c620: 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d  m; j++, pAndTerm
c630: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
c640: 20 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72   assert( pAndTer
c650: 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  m->pExpr );.    
c660: 20 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f          if( allo
c670: 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e  wedOp(pAndTerm->
c680: 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20  pExpr->op) ){.  
c690: 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d              b |=
c6a0: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
c6b0: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64  ->sMaskSet, pAnd
c6c0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
c6d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
c6e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
c6f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
c700: 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20  ndexable &= b;. 
c710: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
c720: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
c730: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
c740: 49 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  IED ){.      /* 
c750: 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 66  Skip this term f
c760: 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69  or now.  We revi
c770: 73 69 74 20 69 74 20 77 68 65 6e 20 77 65 20 70  sit it when we p
c780: 72 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20 20  rocess the.     
c790: 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e   ** correspondin
c7a0: 67 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74  g TERM_VIRTUAL t
c7b0: 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  erm */.    }else
c7c0: 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
c7d0: 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74  b;.      b = get
c7e0: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
c7f0: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
c800: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
c810: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
c820: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
c830: 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20  VIRTUAL ){.     
c840: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
c850: 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61  ther = &pOrWc->a
c860: 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e  [pOrTerm->iParen
c870: 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d  t];.        b |=
c880: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
c890: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68  ->sMaskSet, pOth
c8a0: 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b  er->leftCursor);
c8b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
c8c0: 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20  ndexable &= b;. 
c8d0: 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
c8e0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
c8f0: 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20 20 20 20  O_EQ)==0 ){.    
c900: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30      chngToIN = 0
c910: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c920: 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20         chngToIN 
c930: 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &= b;.      }.  
c940: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
c950: 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73 65  ** Record the se
c960: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
c970: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e   satisfy case 2.
c980: 20 20 54 68 65 20 73 65 74 20 6d 69 67 68 74 20    The set might 
c990: 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20  be.  ** empty.. 
c9a0: 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69   */.  pOrInfo->i
c9b0: 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78  ndexable = index
c9c0: 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65  able;.  pTerm->e
c9d0: 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78  Operator = index
c9e0: 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f  able==0 ? 0 : WO
c9f0: 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  _OR;..  /*.  ** 
ca00: 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61  chngToIN holds a
ca10: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
ca20: 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69  hat *might* sati
ca30: 73 66 79 20 63 61 73 65 20 31 2e 20 20 42 75 74  sfy case 1.  But
ca40: 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f  .  ** we have to
ca50: 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f   do some additio
ca60: 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  nal checking to 
ca70: 73 65 65 20 69 66 20 63 61 73 65 20 31 20 72 65  see if case 1 re
ca80: 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74  ally.  ** is sat
ca90: 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  isfied..  **.  *
caa0: 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20  * chngToIN will 
cab0: 68 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31  hold either 0, 1
cac0: 2c 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68  , or 2 bits.  Th
cad0: 65 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61  e 0-bit case mea
cae0: 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  ns.  ** that the
caf0: 72 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69  re is no possibi
cb00: 6c 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72  lity of transfor
cb10: 6d 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75  ming the OR clau
cb20: 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20  se into an.  ** 
cb30: 49 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61  IN operator beca
cb40: 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  use one or more 
cb50: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20  terms in the OR 
cb60: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20  clause contain. 
cb70: 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74   ** something ot
cb80: 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61  her than == on a
cb90: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73   column in the s
cba0: 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68  ingle table.  Th
cbb0: 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73  e 1-bit.  ** cas
cbc0: 65 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65  e means that eve
cbd0: 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f  ry term of the O
cbe0: 52 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74  R clause is of t
cbf0: 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61  he form.  ** "ta
cc00: 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22  ble.column=expr"
cc10: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
cc20: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65   table.  The one
cc30: 20 62 69 74 20 74 68 61 74 20 69 73 20 73 65 74   bit that is set
cc40: 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65  .  ** will corre
cc50: 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d  spond to the com
cc60: 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73  mon table.  We s
cc70: 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65  till need to che
cc80: 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20  ck to make.  ** 
cc90: 73 75 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f  sure the same co
cca0: 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20  lumn is used on 
ccb0: 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20  all terms.  The 
ccc0: 32 2d 62 69 74 20 63 61 73 65 20 69 73 20 77 68  2-bit case is wh
ccd0: 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20  en.  ** the all 
cce0: 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65  terms are of the
ccf0: 20 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f   form "table1.co
cd00: 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75  lumn=table2.colu
cd10: 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69  mn".  It.  ** mi
cd20: 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  ght be possible 
cd30: 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70  to form an IN op
cd40: 65 72 61 74 6f 72 20 77 69 74 68 20 65 69 74 68  erator with eith
cd50: 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e  er table1.column
cd60: 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e  .  ** or table2.
cd70: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48  column as the LH
cd80: 53 20 69 66 20 65 69 74 68 65 72 20 69 73 20 63  S if either is c
cd90: 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74  ommon to every t
cda0: 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  erm of.  ** the 
cdb0: 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  OR clause..  **.
cdc0: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
cdd0: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
cde0: 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d   "table.column1=
cdf0: 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28  table.column2" (
ce00: 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61  the.  ** same ta
ce10: 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65  ble on both size
ce20: 73 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e  s of the ==) can
ce30: 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  not be optimized
ce40: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e  ..  */.  if( chn
ce50: 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74  gToIN ){.    int
ce60: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
ce70: 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  0;     /* True i
ce80: 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e  f the conversion
ce90: 20 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20   to IN is valid 
cea0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75  */.    int iColu
ceb0: 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  mn = -1;        
cec0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78   /* Column index
ced0: 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70   on lhs of IN op
cee0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e  erator */.    in
cef0: 74 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20  t iCursor = -1; 
cf00: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
cf10: 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74   cursor common t
cf20: 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20  o all terms */. 
cf30: 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20     int j = 0;   
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cf50: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
cf60: 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66  .    /* Search f
cf70: 6f 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63  or a table and c
cf80: 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61  olumn that appea
cf90: 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f  rs on one side o
cfa0: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68  r the.    ** oth
cfb0: 65 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65  er of the == ope
cfc0: 72 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73  rator in every s
cfd0: 75 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61  ubterm.  That ta
cfe0: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20  ble and column. 
cff0: 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
d000: 63 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f  corded in iCurso
d010: 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20  r and iColumn.  
d020: 54 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20  There might not 
d030: 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75  be any.    ** su
d040: 63 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  ch table and col
d050: 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68  umn.  Set okToCh
d060: 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70  ngToIN if an app
d070: 72 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20  ropriate table. 
d080: 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e     ** and column
d090: 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65   is found but le
d0a0: 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  ave okToChngToIN
d0b0: 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f   false if not fo
d0c0: 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  und..    */.    
d0d0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20  for(j=0; j<2 && 
d0e0: 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a  !okToChngToIN; j
d0f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65  ++){.      pOrTe
d100: 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20  rm = pOrWc->a;. 
d110: 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63       for(i=pOrWc
d120: 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  ->nTerm-1; i>=0;
d130: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
d140: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
d150: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
d160: 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
d170: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
d180: 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52  >wtFlags &= ~TER
d190: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
d1a0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
d1b0: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f  ftCursor==iCurso
d1c0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
d1d0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 32 2d  * This is the 2-
d1e0: 62 69 74 20 63 61 73 65 20 61 6e 64 20 77 65 20  bit case and we 
d1f0: 61 72 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  are on the secon
d200: 64 20 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a  d iteration and.
d210: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72            ** cur
d220: 72 65 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f  rent term is fro
d230: 6d 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  m the first iter
d240: 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20  ation.  So skip 
d250: 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  this term. */.  
d260: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d270: 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  j==1 );.        
d280: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
d290: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
d2a0: 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65  ( (chngToIN & ge
d2b0: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
d2c0: 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d  MaskSet, pOrTerm
d2d0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d  ->leftCursor))==
d2e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
d2f0: 2a 20 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74  * This term must
d300: 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   be of the form 
d310: 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65  t1.a==t2.b where
d320: 20 74 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20   t2 is in the.  
d330: 20 20 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54          ** chngT
d340: 6f 49 4e 20 73 65 74 20 62 75 74 20 74 31 20 69  oIN set but t1 i
d350: 73 20 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72  s not.  This ter
d360: 6d 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72  m will be either
d370: 20 70 72 65 63 65 65 64 65 64 0a 20 20 20 20 20   preceeded.     
d380: 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77       ** or follw
d390: 65 64 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65  ed by an inverte
d3a0: 64 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31  d copy (t2.b==t1
d3b0: 2e 61 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20  .a).  Skip this 
d3c0: 74 65 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20  term .          
d3d0: 2a 2a 20 61 6e 64 20 75 73 65 20 69 74 73 20 69  ** and use its i
d3e0: 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20  nversion. */.   
d3f0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
d400: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
d410: 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  s & TERM_COPIED 
d420: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
d430: 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e  tcase( pOrTerm->
d440: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
d450: 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
d460: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
d470: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
d480: 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d  TERM_COPIED|TERM
d490: 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20  _VIRTUAL) );.   
d4a0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
d4b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d4c0: 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72     iColumn = pOr
d4d0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
d4e0: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72  mn;.        iCur
d4f0: 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c  sor = pOrTerm->l
d500: 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  eftCursor;.     
d510: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d520: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 30 20  }.      if( i<0 
d530: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ){.        /* No
d540: 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65   candidate table
d550: 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e  +column was foun
d560: 64 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  d.  This can onl
d570: 79 20 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20  y occur.        
d580: 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  ** on the second
d590: 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   iteration */.  
d5a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d        assert( j=
d5b0: 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =1 );.        as
d5c0: 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
d5d0: 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a  wo(chngToIN) );.
d5e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d5f0: 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73  chngToIN==getMas
d600: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
d610: 53 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b  Set, iCursor) );
d620: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
d630: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
d640: 73 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a  stcase( j==1 );.
d650: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76  .      /* We hav
d660: 65 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64  e found a candid
d670: 61 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  ate table and co
d680: 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20  lumn.  Check to 
d690: 73 65 65 20 69 66 20 74 68 61 74 0a 20 20 20 20  see if that.    
d6a0: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63    ** table and c
d6b0: 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20  olumn is common 
d6c0: 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
d6d0: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a   the OR clause *
d6e0: 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67  /.      okToChng
d6f0: 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20  ToIN = 1;.      
d700: 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b  for(; i>=0 && ok
d710: 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c  ToChngToIN; i--,
d720: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
d730: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
d740: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
d750: 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
d760: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
d770: 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72  leftCursor!=iCur
d780: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
d790: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
d7a0: 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b  s &= ~TERM_OR_OK
d7b0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
d7c0: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  if( pOrTerm->u.l
d7d0: 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75  eftColumn!=iColu
d7e0: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
d7f0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
d800: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
d810: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61  .          int a
d820: 66 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74  ffLeft, affRight
d830: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;.          /* I
d840: 66 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  f the right-hand
d850: 20 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20   side is also a 
d860: 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65  column, then the
d870: 20 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20   affinities.    
d880: 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68        ** of both
d890: 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20   right and left 
d8a0: 73 69 64 65 73 20 6d 75 73 74 20 62 65 20 73 75  sides must be su
d8b0: 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a  ch that no type.
d8c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
d8d0: 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71  versions are req
d8e0: 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67  uired on the rig
d8f0: 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32  ht.  (Ticket #22
d900: 34 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  49).          */
d910: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 52 69  .          affRi
d920: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
d930: 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72  rAffinity(pOrTer
d940: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
d950: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  );.          aff
d960: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
d970: 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65  prAffinity(pOrTe
d980: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  rm->pExpr->pLeft
d990: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
d9a0: 20 61 66 66 52 69 67 68 74 21 3d 30 20 26 26 20   affRight!=0 && 
d9b0: 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66  affRight!=affLef
d9c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
d9d0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
d9e0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
d9f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
da00: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
da10: 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a   |= TERM_OR_OK;.
da20: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
da30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
da40: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
da50: 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43  his point, okToC
da60: 68 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20  hngToIN is true 
da70: 69 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72  if original pTer
da80: 6d 20 73 61 74 69 73 66 69 65 73 0a 20 20 20 20  m satisfies.    
da90: 2a 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74  ** case 1.  In t
daa0: 68 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72  hat case, constr
dab0: 75 63 74 20 61 20 6e 65 77 20 76 69 72 74 75 61  uct a new virtua
dac0: 6c 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a  l term that is .
dad0: 20 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e      ** pTerm con
dae0: 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49  verted into an I
daf0: 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20  N operator..    
db00: 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43  */.    if( okToC
db10: 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20  hngToIN ){.     
db20: 20 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20   Expr *pDup;    
db30: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61          /* A tra
db40: 6e 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65  nsient duplicate
db50: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
db60: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
db70: 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54  List = 0;   /* T
db80: 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
db90: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
dba0: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
dbb0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65   0;       /* The
dbc0: 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
dbd0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
dbe0: 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20   Expr *pNew;    
dbf0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
dc00: 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61  omplete IN opera
dc10: 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f  tor */..      fo
dc20: 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  r(i=pOrWc->nTerm
dc30: 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57  -1, pOrTerm=pOrW
dc40: 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  c->a; i>=0; i--,
dc50: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
dc60: 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
dc70: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
dc80: 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f  M_OR_OK)==0 ) co
dc90: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
dca0: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
dcb0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
dcc0: 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EQ );.        as
dcd0: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c  sert( pOrTerm->l
dce0: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73  eftCursor==iCurs
dcf0: 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  or );.        as
dd00: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75  sert( pOrTerm->u
dd10: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  .leftColumn==iCo
dd20: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
dd30: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
dd40: 70 72 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72  prDup(db, pOrTer
dd50: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
dd60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  , 0);.        pL
dd70: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
dd80: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 57 49 6e  rListAppend(pWIn
dd90: 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73  fo->pParse, pLis
dda0: 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  t, pDup);.      
ddb0: 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54 65 72    pLeft = pOrTer
ddc0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  m->pExpr->pLeft;
ddd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
dde0: 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20  ssert( pLeft!=0 
ddf0: 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20  );.      pDup = 
de00: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
de10: 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  b, pLeft, 0);.  
de20: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
de30: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
de40: 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20  TK_IN, pDup, 0, 
de50: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  0);.      if( pN
de60: 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ew ){.        in
de70: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
de80: 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61    transferJoinMa
de90: 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78  rkings(pNew, pEx
dea0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  pr);.        ass
deb0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
dec0: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78  perty(pNew, EP_x
ded0: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
dee0: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69       pNew->x.pLi
def0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  st = pList;.    
df00: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
df10: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
df20: 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56  WC, pNew, TERM_V
df30: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
df40: 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65  MIC);.        te
df50: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
df60: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  0 );.        exp
df70: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
df80: 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20  WC, idxNew);.   
df90: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
dfa0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
dfb0: 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64         pWC->a[id
dfc0: 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20  xNew].iParent = 
dfd0: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  idxTerm;.       
dfe0: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
dff0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
e000: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e010: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
e020: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  b, pList);.     
e030: 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e   }.      pTerm->
e040: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e  eOperator = WO_N
e050: 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20 31 20  OOP;  /* case 1 
e060: 74 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f  trumps case 2 */
e070: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
e080: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
e090: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
e0a0: 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  ION && !SQLITE_O
e0b0: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
e0c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  ./*.** The input
e0d0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
e0e0: 20 69 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d   is an WhereTerm
e0f0: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
e100: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78  only the.** "pEx
e110: 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64  pr" field filled
e120: 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66   in.  The job of
e130: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
e140: 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a   to analyze the.
e150: 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
e160: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c   and populate al
e170: 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c  l the other fiel
e180: 64 73 20 6f 66 20 74 68 65 20 57 68 65 72 65 54  ds of the WhereT
e190: 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  erm.** structure
e1a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
e1b0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
e1c0: 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e  the form "<expr>
e1d0: 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73   <op> X" it gets
e1e0: 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20   commuted.** to 
e1f0: 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72  the standard for
e200: 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78  m of "X <op> <ex
e210: 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pr>"..**.** If t
e220: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
e230: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
e240: 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f  <op> Y" where bo
e250: 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a  th X and Y are.*
e260: 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  * columns, then 
e270: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70  the original exp
e280: 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61  ression is uncha
e290: 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76  nged and a new v
e2a0: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f  irtual.** term o
e2b0: 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f  f the form "Y <o
e2c0: 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74  p> X" is added t
e2d0: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
e2e0: 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a  se and.** analyz
e2f0: 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20  ed separately.  
e300: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  The original ter
e310: 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  m is marked with
e320: 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20   TERM_COPIED.** 
e330: 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d  and the new term
e340: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
e350: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65  TERM_DYNAMIC (be
e360: 63 61 75 73 65 20 69 74 27 73 20 70 45 78 70 72  cause it's pExpr
e370: 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
e380: 66 72 65 65 64 20 77 69 74 68 20 74 68 65 20 57  freed with the W
e390: 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20  hereClause) and 
e3a0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65  TERM_VIRTUAL (be
e3b0: 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61  cause it.** is a
e3c0: 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f   commuted copy o
e3d0: 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29  f a prior term.)
e3e0: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
e3f0: 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31  erm has nChild=1
e400: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79  .** and the copy
e410: 20 68 61 73 20 69 64 78 50 61 72 65 6e 74 20 73   has idxParent s
e420: 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
e430: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
e440: 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  term..*/.static 
e450: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
e460: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
e470: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
e480: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
e490: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
e4a0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
e4b0: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
e4c0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
e4d0: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
e4e0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
e4f0: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
e500: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
e510: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
e520: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20   = pWC->pWInfo; 
e530: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
e540: 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65  processing conte
e550: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
e560: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
e570: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e580: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
e590: 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  zed */.  WhereMa
e5a0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
e5b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
e5c0: 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65 78 20   of table index 
e5d0: 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20  masks */.  Expr 
e5e0: 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  *pExpr;         
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e600: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
e610: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
e620: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
e630: 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20  Left;           
e640: 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69     /* Prerequesi
e650: 74 65 73 20 6f 66 20 74 68 65 20 70 45 78 70 72  tes of the pExpr
e660: 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74  ->pLeft */.  Bit
e670: 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20  mask prereqAll; 
e680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e690: 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f   Prerequesites o
e6a0: 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42 69 74  f pExpr */.  Bit
e6b0: 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68 74 20  mask extraRight 
e6c0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
e6d0: 20 45 78 74 72 61 20 64 65 70 65 6e 64 65 6e 63   Extra dependenc
e6e0: 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e  ies on LEFT JOIN
e6f0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74 72   */.  Expr *pStr
e700: 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
e710: 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66         /* RHS of
e720: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
e730: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  tor */.  int isC
e740: 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 20  omplete = 0;    
e750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53            /* RHS
e760: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e   of LIKE/GLOB en
e770: 64 73 20 77 69 74 68 20 77 69 6c 64 63 61 72 64  ds with wildcard
e780: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65   */.  int noCase
e790: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
e7a0: 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 2f 47         /* LIKE/G
e7b0: 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73 68 65  LOB distinguishe
e7c0: 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  s case */.  int 
e7d0: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e7f0: 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74  Top-level operat
e800: 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a  or.  pExpr->op *
e810: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
e820: 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
e830: 73 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  se;  /* Parsing 
e840: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
e850: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
e860: 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 2f 2a  e->db;        /*
e870: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
e880: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64  tion */..  if( d
e890: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e8a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
e8b0: 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57   }.  pTerm = &pW
e8c0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
e8d0: 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49   pMaskSet = &pWI
e8e0: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20  nfo->sMaskSet;. 
e8f0: 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e   pExpr = pTerm->
e900: 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  pExpr;.  assert(
e910: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
e920: 53 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d  S && pExpr->op!=
e930: 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20  TK_COLLATE );.  
e940: 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70  prereqLeft = exp
e950: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
e960: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  kSet, pExpr->pLe
e970: 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70  ft);.  op = pExp
e980: 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  r->op;.  if( op=
e990: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73  =TK_IN ){.    as
e9a0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
e9b0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ght==0 );.    if
e9c0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
e9d0: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
e9e0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
e9f0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
ea00: 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54  ht = exprSelectT
ea10: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
ea20: 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  et, pExpr->x.pSe
ea30: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
ea40: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
ea50: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
ea60: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
ea70: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
ea80: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
ea90: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
eaa0: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
eab0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
eac0: 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ight = 0;.  }els
ead0: 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  e{.    pTerm->pr
eae0: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
eaf0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
eb00: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Set, pExpr->pRig
eb10: 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65  ht);.  }.  prere
eb20: 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65  qAll = exprTable
eb30: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
eb40: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78  pExpr);.  if( Ex
eb50: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
eb60: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
eb70: 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  ) ){.    Bitmask
eb80: 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   x = getMask(pMa
eb90: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52  skSet, pExpr->iR
eba0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a  ightJoinTable);.
ebb0: 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d      prereqAll |=
ebc0: 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67   x;.    extraRig
ebd0: 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e  ht = x-1;  /* ON
ebe0: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61   clause terms ma
ebf0: 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69  y not be used wi
ec00: 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20  th an index.    
ec10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec20: 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61     ** on left ta
ec30: 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ble of a LEFT JO
ec40: 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  IN.  Ticket #301
ec50: 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d  5 */.  }.  pTerm
ec60: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
ec70: 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d  ereqAll;.  pTerm
ec80: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d  ->leftCursor = -
ec90: 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  1;.  pTerm->iPar
eca0: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  ent = -1;.  pTer
ecb0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30  m->eOperator = 0
ecc0: 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f  ;.  if( allowedO
ecd0: 70 28 6f 70 29 20 29 7b 0a 20 20 20 20 45 78 70  p(op) ){.    Exp
ece0: 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r *pLeft = sqlit
ecf0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
ed00: 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  e(pExpr->pLeft);
ed10: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
ed20: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  t = sqlite3ExprS
ed30: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72  kipCollate(pExpr
ed40: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 75  ->pRight);.    u
ed50: 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65  16 opMask = (pTe
ed60: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
ed70: 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30  & prereqLeft)==0
ed80: 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45   ? WO_ALL : WO_E
ed90: 51 55 49 56 3b 0a 20 20 20 20 69 66 28 20 70 4c  QUIV;.    if( pL
eda0: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
edb0: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  MN ){.      pTer
edc0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
edd0: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
ede0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65       pTerm->u.le
edf0: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
ee00: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
ee10: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
ee20: 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  r = operatorMask
ee30: 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20  (op) & opMask;. 
ee40: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69     }.    if( pRi
ee50: 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f  ght && pRight->o
ee60: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
ee70: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
ee80: 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70  *pNew;.      Exp
ee90: 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 75  r *pDup;.      u
eea0: 31 36 20 65 45 78 74 72 61 4f 70 20 3d 20 30 3b  16 eExtraOp = 0;
eeb0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
eec0: 20 62 69 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e   bits for pNew->
eed0: 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20  eOperator */.   
eee0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
eef0: 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20  ftCursor>=0 ){. 
ef00: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
ef10: 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  w;.        pDup 
ef20: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
ef30: 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
ef40: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
ef50: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
ef60: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ef70: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
ef80: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20  pDup);.         
ef90: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
efa0: 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65   }.        idxNe
efb0: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
efc0: 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c  nsert(pWC, pDup,
efd0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
efe0: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
eff0: 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d       if( idxNew=
f000: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
f010: 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43       pNew = &pWC
f020: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
f030: 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65       pNew->iPare
f040: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
f050: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
f060: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
f070: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e          pTerm->n
f080: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
f090: 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
f0a0: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
f0b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
f0c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20  xpr->op==TK_EQ. 
f0d0: 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72          && !Expr
f0e0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
f0f0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
f100: 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69           && Opti
f110: 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
f120: 64 62 2c 20 53 51 4c 49 54 45 5f 54 72 61 6e 73  db, SQLITE_Trans
f130: 69 74 69 76 65 29 0a 20 20 20 20 20 20 20 20 29  itive).        )
f140: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72  {.          pTer
f150: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c 3d 20  m->eOperator |= 
f160: 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20  WO_EQUIV;.      
f170: 20 20 20 20 65 45 78 74 72 61 4f 70 20 3d 20 57      eExtraOp = W
f180: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20  O_EQUIV;.       
f190: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
f1a0: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70          pDup = p
f1b0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e  Expr;.        pN
f1c0: 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  ew = pTerm;.    
f1d0: 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f    }.      exprCo
f1e0: 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44  mmute(pParse, pD
f1f0: 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74  up);.      pLeft
f200: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
f210: 69 70 43 6f 6c 6c 61 74 65 28 70 44 75 70 2d 3e  ipCollate(pDup->
f220: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 70 4e  pLeft);.      pN
f230: 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  ew->leftCursor =
f240: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
f250: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65        pNew->u.le
f260: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
f270: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
f280: 20 74 65 73 74 63 61 73 65 28 20 28 70 72 65 72   testcase( (prer
f290: 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69  eqLeft | extraRi
f2a0: 67 68 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65  ght) != prereqLe
f2b0: 66 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ft );.      pNew
f2c0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
f2d0: 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74  prereqLeft | ext
f2e0: 72 61 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70  raRight;.      p
f2f0: 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  New->prereqAll =
f300: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20   prereqAll;.    
f310: 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f    pNew->eOperato
f320: 72 20 3d 20 28 6f 70 65 72 61 74 6f 72 4d 61 73  r = (operatorMas
f330: 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45  k(pDup->op) + eE
f340: 78 74 72 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b  xtraOp) & opMask
f350: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
f360: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f370: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
f380: 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20  ATION.  /* If a 
f390: 74 65 72 6d 20 69 73 20 74 68 65 20 42 45 54 57  term is the BETW
f3a0: 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72  EEN operator, cr
f3b0: 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72  eate two new vir
f3c0: 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20  tual terms.  ** 
f3d0: 74 68 61 74 20 64 65 66 69 6e 65 20 74 68 65 20  that define the 
f3e0: 72 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 42  range that the B
f3f0: 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74  ETWEEN implement
f400: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
f410: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
f420: 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20  a BETWEEN b AND 
f430: 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63  c.  **.  ** is c
f440: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20  onverted into:. 
f450: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28 61   **.  **      (a
f460: 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63   BETWEEN b AND c
f470: 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44  ) AND (a>=b) AND
f480: 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a   (a<=c).  **.  *
f490: 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74 65  * The two new te
f4a0: 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f 6e  rms are added on
f4b0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
f4c0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
f4d0: 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e  ject..  ** The n
f4e0: 65 77 20 74 65 72 6d 73 20 61 72 65 20 22 64 79  ew terms are "dy
f4f0: 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20 63  namic" and are c
f500: 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20 6f  hildren of the o
f510: 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a  riginal BETWEEN.
f520: 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61 74    ** term.  That
f530: 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74   means that if t
f540: 68 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  he BETWEEN term 
f550: 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63 68  is coded, the ch
f560: 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20  ildren are.  ** 
f570: 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69 66  skipped.  Or, if
f580: 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72   the children ar
f590: 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20 61  e satisfied by a
f5a0: 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 69  n index, the ori
f5b0: 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45  ginal.  ** BETWE
f5c0: 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70 70  EN term is skipp
f5d0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
f5e0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
f5f0: 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57 43  K_BETWEEN && pWC
f600: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
f610: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
f620: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
f630: 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  List;.    int i;
f640: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
f650: 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b  t u8 ops[] = {TK
f660: 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20  _GE, TK_LE};.   
f670: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
f680: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
f690: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32   pList->nExpr==2
f6a0: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
f6b0: 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
f6c0: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
f6d0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e  ;.      int idxN
f6e0: 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78  ew;.      pNewEx
f6f0: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
f700: 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d  r(pParse, ops[i]
f710: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
f740: 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
f750: 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
f760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f770: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
f780: 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
f790: 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a  .pExpr, 0), 0);.
f7a0: 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f        transferJo
f7b0: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45  inMarkings(pNewE
f7c0: 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  xpr, pExpr);.   
f7d0: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
f7e0: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
f7f0: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
f800: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
f810: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74  YNAMIC);.      t
f820: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
f830: 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
f840: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
f850: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20  C, idxNew);.    
f860: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
f870: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
f880: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d    pWC->a[idxNew]
f890: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
f8a0: 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  rm;.    }.    pT
f8b0: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b  erm->nChild = 2;
f8c0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
f8d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
f8e0: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  EN_OPTIMIZATION 
f8f0: 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
f900: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  (SQLITE_OMIT_OR_
f910: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26  OPTIMIZATION) &&
f920: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
f930: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
f940: 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74    /* Analyze a t
f950: 65 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70  erm that is comp
f960: 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d  osed of two or m
f970: 6f 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e  ore subterms con
f980: 6e 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61  nected by.  ** a
f990: 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n OR operator.. 
f9a0: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70   */.  else if( p
f9b0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20  Expr->op==TK_OR 
f9c0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
f9d0: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
f9e0: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
f9f0: 65 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57  eOrTerm(pSrc, pW
fa00: 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20  C, idxTerm);.   
fa10: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
fa20: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23  [idxTerm];.  }.#
fa30: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
fa40: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
fa50: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TION */..#ifndef
fa60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
fa70: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  E_OPTIMIZATION. 
fa80: 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69   /* Add constrai
fa90: 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68  nts to reduce th
faa0: 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f  e search space o
fab0: 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  n a LIKE or GLOB
fac0: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  .  ** operator..
fad0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65    **.  ** A like
fae0: 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20   pattern of the 
faf0: 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62  form "x LIKE 'ab
fb00: 63 25 27 22 20 69 73 20 63 68 61 6e 67 65 64 20  c%'" is changed 
fb10: 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73  into constraints
fb20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
fb30: 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44      x>='abc' AND
fb40: 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c   x<'abd' AND x L
fb50: 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a  IKE 'abc%'.  **.
fb60: 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68    ** The last ch
fb70: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 70  aracter of the p
fb80: 72 65 66 69 78 20 22 61 62 63 22 20 69 73 20 69  refix "abc" is i
fb90: 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f  ncremented to fo
fba0: 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d  rm the.  ** term
fbb0: 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f  ination conditio
fbc0: 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20  n "abd"..  */.  
fbd0: 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f  if( pWC->op==TK_
fbe0: 41 4e 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b  AND .   && isLik
fbf0: 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20  eOrGlob(pParse, 
fc00: 70 45 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26  pExpr, &pStr1, &
fc10: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43  isComplete, &noC
fc20: 61 73 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78  ase).  ){.    Ex
fc30: 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  pr *pLeft;      
fc40: 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f   /* LHS of LIKE/
fc50: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
fc60: 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 32  .    Expr *pStr2
fc70: 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ;       /* Copy 
fc80: 6f 66 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f  of pStr1 - RHS o
fc90: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72  f LIKE/GLOB oper
fca0: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72  ator */.    Expr
fcb0: 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20   *pNewExpr1;.   
fcc0: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32   Expr *pNewExpr2
fcd0: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
fce0: 31 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  1;.    int idxNe
fcf0: 77 32 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 73 43  w2;.    Token sC
fd00: 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 2f 2a 20  ollSeqName;  /* 
fd10: 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  Name of collatin
fd20: 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20  g sequence */.. 
fd30: 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
fd40: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
fd50: 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32  pExpr;.    pStr2
fd60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
fd70: 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b  p(db, pStr1, 0);
fd80: 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  .    if( !db->ma
fd90: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
fda0: 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20 20      u8 c, *pC;  
fdb0: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68 61       /* Last cha
fdc0: 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
fdd0: 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64  e first wildcard
fde0: 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28   */.      pC = (
fdf0: 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54  u8*)&pStr2->u.zT
fe00: 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c  oken[sqlite3Strl
fe10: 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54  en30(pStr2->u.zT
fe20: 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20  oken)-1];.      
fe30: 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69  c = *pC;.      i
fe40: 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20  f( noCase ){.   
fe50: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
fe60: 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e  t is to incremen
fe70: 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  t the last chara
fe80: 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20  cter before the 
fe90: 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  first.        **
fea0: 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74 20   wildcard.  But 
feb0: 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74 20  if we increment 
fec0: 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20 70  '@', that will p
fed0: 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65 0a  ush it into the.
fee0: 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68 61          ** alpha
fef0: 62 65 74 69 63 20 72 61 6e 67 65 20 77 68 65 72  betic range wher
ff00: 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f  e case conversio
ff10: 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70 20  ns will mess up 
ff20: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
ff30: 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f 20  inequality.  To 
ff40: 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b 65  avoid this, make
ff50: 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72 75   sure to also ru
ff60: 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20 20  n the full.     
ff70: 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c     ** LIKE on al
ff80: 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78 70 72  l candidate expr
ff90: 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61 72  essions by clear
ffa0: 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c 65  ing the isComple
ffb0: 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20 20  te flag.        
ffc0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  */.        if( c
ffd0: 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d 70  =='A'-1 ) isComp
ffe0: 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  lete = 0;.      
fff0: 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70    c = sqlite3Upp
10000 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20  erToLower[c];.  
10010 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43 20      }.      *pC 
10020 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  = c + 1;.    }. 
10030 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e     sCollSeqName.
10040 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f  z = noCase ? "NO
10050 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22  CASE" : "BINARY"
10060 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61  ;.    sCollSeqNa
10070 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20 70 4e  me.n = 6;.    pN
10080 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
10090 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
100a0 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77  ft, 0);.    pNew
100b0 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50  Expr1 = sqlite3P
100c0 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
100d0 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  GE, .           
100e0 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
100f0 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
10100 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73 43 6f  e,pNewExpr1,&sCo
10110 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20  llSeqName),.    
10120 20 20 20 20 20 20 20 70 53 74 72 31 2c 20 30 29         pStr1, 0)
10130 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f  ;.    transferJo
10140 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45  inMarkings(pNewE
10150 78 70 72 31 2c 20 70 45 78 70 72 29 3b 0a 20 20  xpr1, pExpr);.  
10160 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72    idxNew1 = wher
10170 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
10180 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45  C, pNewExpr1, TE
10190 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
101a0 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65  DYNAMIC);.    te
101b0 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d  stcase( idxNew1=
101c0 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  =0 );.    exprAn
101d0 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
101e0 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70   idxNew1);.    p
101f0 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74  NewExpr2 = sqlit
10200 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
10210 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65  eft, 0);.    pNe
10220 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33  wExpr2 = sqlite3
10230 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
10240 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _LT,.           
10250 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
10260 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
10270 65 2c 70 4e 65 77 45 78 70 72 32 2c 26 73 43 6f  e,pNewExpr2,&sCo
10280 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20  llSeqName),.    
10290 20 20 20 20 20 20 20 70 53 74 72 32 2c 20 30 29         pStr2, 0)
102a0 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f  ;.    transferJo
102b0 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45  inMarkings(pNewE
102c0 78 70 72 32 2c 20 70 45 78 70 72 29 3b 0a 20 20  xpr2, pExpr);.  
102d0 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72    idxNew2 = wher
102e0 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
102f0 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45  C, pNewExpr2, TE
10300 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
10310 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65  DYNAMIC);.    te
10320 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 32 3d  stcase( idxNew2=
10330 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  =0 );.    exprAn
10340 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
10350 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70   idxNew2);.    p
10360 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
10370 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28  dxTerm];.    if(
10380 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20   isComplete ){. 
10390 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
103a0 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  ew1].iParent = i
103b0 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57  dxTerm;.      pW
103c0 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50  C->a[idxNew2].iP
103d0 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
103e0 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43  .      pTerm->nC
103f0 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a  hild = 2;.    }.
10400 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
10410 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
10420 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
10430 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10440 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
10450 0a 20 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d  .  /* Add a WO_M
10460 41 54 43 48 20 61 75 78 69 6c 69 61 72 79 20 74  ATCH auxiliary t
10470 65 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74  erm to the const
10480 72 61 69 6e 74 20 73 65 74 20 69 66 20 74 68 65  raint set if the
10490 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78  .  ** current ex
104a0 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
104b0 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e  he form:  column
104c0 20 4d 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a   MATCH expr..  *
104d0 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  * This informati
104e0 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68  on is used by th
104f0 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  e xBestIndex met
10500 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72  hods of.  ** vir
10510 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68  tual tables.  Th
10520 65 20 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f  e native query o
10530 70 74 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f  ptimizer does no
10540 74 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74  t attempt.  ** t
10550 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69  o do anything wi
10560 74 68 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f  th MATCH functio
10570 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ns..  */.  if( i
10580 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70  sMatchOfColumn(p
10590 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74  Expr) ){.    int
105a0 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70   idxNew;.    Exp
105b0 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66  r *pRight, *pLef
105c0 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  t;.    WhereTerm
105d0 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20   *pNewTerm;.    
105e0 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f  Bitmask prereqCo
105f0 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72  lumn, prereqExpr
10600 3b 0a 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20  ;..    pRight = 
10610 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
10620 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
10630 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78  pLeft = pExpr->x
10640 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
10650 70 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78  pr;.    prereqEx
10660 70 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  pr = exprTableUs
10670 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
10680 69 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65  ight);.    prere
10690 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61  qColumn = exprTa
106a0 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
106b0 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  t, pLeft);.    i
106c0 66 28 20 28 70 72 65 72 65 71 45 78 70 72 20 26  f( (prereqExpr &
106d0 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d   prereqColumn)==
106e0 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
106f0 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20  *pNewExpr;.     
10700 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69   pNewExpr = sqli
10710 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
10720 20 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20   TK_MATCH, .    
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10740 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c            0, sql
10750 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
10760 70 52 69 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a  pRight, 0), 0);.
10770 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
10780 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
10790 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
107a0 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
107b0 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
107c0 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
107d0 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ew==0 );.      p
107e0 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e  NewTerm = &pWC->
107f0 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20  a[idxNew];.     
10800 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
10810 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 45  qRight = prereqE
10820 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  xpr;.      pNewT
10830 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
10840 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
10850 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
10860 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
10870 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
10880 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
10890 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d  eOperator = WO_M
108a0 41 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77  ATCH;.      pNew
108b0 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
108c0 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
108d0 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
108e0 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70  dxTerm];.      p
108f0 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31  Term->nChild = 1
10900 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
10910 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
10920 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65  OPIED;.      pNe
10930 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  wTerm->prereqAll
10940 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   = pTerm->prereq
10950 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  All;.    }.  }.#
10960 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10970 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
10980 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  E */..#ifdef SQL
10990 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
109a0 5f 4f 52 5f 53 54 41 54 34 0a 20 20 2f 2a 20 57  _OR_STAT4.  /* W
109b0 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 33  hen sqlite_stat3
109c0 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20   histogram data 
109d0 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 20  is available an 
109e0 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65 0a  operator of the.
109f0 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53 20    ** form "x IS 
10a00 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73 6f  NOT NULL" can so
10a10 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c 75  metimes be evalu
10a20 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63 69  ated more effici
10a30 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22 78  ently.  ** as "x
10a40 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20 6e  >NULL" if x is n
10a50 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
10a60 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20 63  IMARY KEY.  So c
10a70 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a 20  onstruct a.  ** 
10a80 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66 20  virtual term of 
10a90 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a  that form..  **.
10aa0 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
10ab0 68 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  he virtual term 
10ac0 6d 75 73 74 20 62 65 20 74 61 67 67 65 64 20 77  must be tagged w
10ad0 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20  ith TERM_VNULL. 
10ae0 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d 5f   This.  ** TERM_
10af0 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20 73  VNULL tag will s
10b00 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f 74 2d  uppress the not-
10b10 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20 74 68  null check at th
10b20 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a  e beginning.  **
10b30 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 57   of the loop.  W
10b40 69 74 68 6f 75 74 20 74 68 65 20 54 45 52 4d 5f  ithout the TERM_
10b50 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65 20  VNULL flag, the 
10b60 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61  not-null check a
10b70 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74  t.  ** the start
10b80 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c   of the loop wil
10b90 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20 72 65  l prevent any re
10ba0 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e 67  sults from being
10bb0 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a   returned..  */.
10bc0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
10bd0 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26  =TK_NOTNULL.   &
10be0 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  & pExpr->pLeft->
10bf0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
10c00 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   && pExpr->pLeft
10c10 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20  ->iColumn>=0.   
10c20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
10c30 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
10c40 45 5f 53 74 61 74 33 29 0a 20 20 29 7b 0a 20 20  E_Stat3).  ){.  
10c50 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
10c60 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  ;.    Expr *pLef
10c70 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
10c80 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
10c90 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
10ca0 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20  *pNewTerm;..    
10cb0 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
10cc0 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
10cd0 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20  TK_GT,.         
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cf0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
10d00 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c  p(db, pLeft, 0),
10d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10d20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
10d30 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
10d40 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c  , TK_NULL, 0, 0,
10d50 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64   0), 0);..    id
10d60 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
10d70 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
10d80 65 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  ewExpr,.        
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10da0 20 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55        TERM_VIRTU
10db0 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c  AL|TERM_DYNAMIC|
10dc0 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20  TERM_VNULL);.   
10dd0 20 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20   if( idxNew ){. 
10de0 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20       pNewTerm = 
10df0 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b  &pWC->a[idxNew];
10e00 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
10e10 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30  >prereqRight = 0
10e20 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
10e30 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
10e40 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
10e50 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e      pNewTerm->u.
10e60 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
10e70 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
10e80 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70     pNewTerm->eOp
10e90 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a  erator = WO_GT;.
10ea0 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
10eb0 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
10ec0 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  m;.      pTerm =
10ed0 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
10ee0 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
10ef0 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
10f00 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
10f10 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
10f20 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
10f30 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
10f40 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
10f50 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
10f60 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
10f70 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
10f80 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74  */..  /* Prevent
10f90 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
10fa0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
10fb0 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20  from being used 
10fc0 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e  to drive.  ** an
10fd0 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65   index for table
10fe0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
10ff0 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a   the join..  */.
11000 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
11010 69 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67  ight |= extraRig
11020 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ht;.}../*.** Thi
11030 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63  s function searc
11040 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20 61 20  hes pList for a 
11050 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68  entry that match
11060 65 73 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  es the iCol-th c
11070 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65  olumn.** of inde
11080 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66  x pIdx..**.** If
11090 20 73 75 63 68 20 61 6e 20 65 78 70 72 65 73 73   such an express
110a0 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74  ion is found, it
110b0 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  s index in pList
110c0 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65  ->a[] is returne
110d0 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72  d. If.** no expr
110e0 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
110f0 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
11100 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
11110 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50  indIndexCol(.  P
11120 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11140 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
11150 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
11160 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
11170 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
11180 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63  on list to searc
11190 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65  h */.  int iBase
111a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
111b0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
111c0 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63   for table assoc
111d0 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20  iated with pIdx 
111e0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
111f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11200 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
11210 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66   match column of
11220 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20   */.  int iCol  
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11240 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
11250 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63  of index to matc
11260 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
11270 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11280 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
11290 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f  oll[iCol];..  fo
112a0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
112b0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
112c0 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
112d0 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
112e0 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  e(pList->a[i].pE
112f0 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  xpr);.    if( p-
11300 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
11310 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d      && p->iColum
11320 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
11330 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20  n[iCol].     && 
11340 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
11350 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f  .    ){.      Co
11360 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
11370 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
11380 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  q(pParse, pList-
11390 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
113a0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
113b0 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69  Coll) && 0==sqli
113c0 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
113d0 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20  ->zName, zColl) 
113e0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
113f0 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n i;.      }.   
11400 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
11410 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   -1;.}../*.** Re
11420 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
11430 20 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73   DISTINCT expres
11440 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64  sion-list passed
11450 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
11460 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64  gument.** is red
11470 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20  undant..**.** A 
11480 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73  DISTINCT list is
11490 20 72 65 64 75 6e 64 61 6e 74 20 69 66 20 74 68   redundant if th
114a0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
114b0 69 6e 73 20 73 6f 6d 65 20 73 75 62 73 65 74 20  ins some subset 
114c0 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68  of.** columns th
114d0 61 74 20 61 72 65 20 75 6e 69 71 75 65 20 61 6e  at are unique an
114e0 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73  d non-null..*/.s
114f0 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73 74  tatic int isDist
11500 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a 20  inctRedundant(. 
11510 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
11520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
11530 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
11540 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
11550 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
11560 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
11570 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
11580 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
11590 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
115a0 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
115b0 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20 20   *pDistinct     
115c0 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
115d0 73 65 74 20 74 68 61 74 20 6e 65 65 64 73 20 74  set that needs t
115e0 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a 2f  o be DISTINCT */
115f0 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
11600 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
11610 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  ;.  int i;      
11620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11630 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73 65      .  int iBase
11640 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
11650 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   is more than on
11660 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d 73  e table or sub-s
11670 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f  elect in the FRO
11680 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a  M clause of.  **
11690 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65   this query, the
116a0 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  n it will not be
116b0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68 6f   possible to sho
116c0 77 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49  w that the DISTI
116d0 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65  NCT .  ** clause
116e0 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
116f0 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  /.  if( pTabList
11700 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
11710 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d 20  rn 0;.  iBase = 
11720 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
11730 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d  Cursor;.  pTab =
11740 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
11750 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  pTab;..  /* If a
11760 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ny of the expres
11770 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b 20  sions is an IPK 
11780 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20  column on table 
11790 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74 75  iBase, then retu
117a0 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e  rn .  ** true. N
117b0 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54 61  ote: The (p->iTa
117c0 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72 74  ble==iBase) part
117d0 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d 61   of this test ma
117e0 79 20 62 65 20 66 61 6c 73 65 20 69 66 20 74 68  y be false if th
117f0 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 53  e.  ** current S
11800 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72 65  ELECT is a corre
11810 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e  lated sub-query.
11820 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
11830 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45   i<pDistinct->nE
11840 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
11850 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
11860 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
11870 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e  pDistinct->a[i].
11880 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
11890 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
118a0 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
118b0 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75  Base && p->iColu
118c0 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  mn<0 ) return 1;
118d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  .  }..  /* Loop 
118e0 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69  through all indi
118f0 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ces on the table
11900 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20  , checking each 
11910 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b  to see if it mak
11920 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54  es.  ** the DIST
11930 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 72  INCT qualifier r
11940 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65  edundant. It doe
11950 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20  s so if:.  **.  
11960 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65  **   1. The inde
11970 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51  x is itself UNIQ
11980 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a  UE, and.  **.  *
11990 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68  *   2. All of th
119a0 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
119b0 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68 65   index are eithe
119c0 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 44  r part of the pD
119d0 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20  istinct.  **    
119e0 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20    list, or else 
119f0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
11a00 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d   contains a term
11a10 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f   of the form "co
11a20 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20  l=X",.  **      
11a30 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e  where X is a con
11a40 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65  stant value. The
11a50 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
11a60 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  nces of the.  **
11a70 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e        comparison
11a80 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74   and select-list
11a90 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73   expressions mus
11aa0 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66  t match those of
11ab0 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a   the index..  **
11ac0 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f  .  **   3. All o
11ad0 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f  f those index co
11ae0 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20  lumns for which 
11af0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
11b00 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20   does not.  **  
11b10 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63      contain a "c
11b20 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73  ol=X" term are s
11b30 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20  ubject to a NOT 
11b40 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e  NULL constraint.
11b50 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78  .  */.  for(pIdx
11b60 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
11b70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
11b80 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
11b90 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
11ba0 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75  E_None ) continu
11bb0 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e;.    for(i=0; 
11bc0 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
11bd0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
11be0 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69   iCol = pIdx->ai
11bf0 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
11c00 20 69 66 28 20 30 3d 3d 66 69 6e 64 54 65 72 6d   if( 0==findTerm
11c10 28 70 57 43 2c 20 69 42 61 73 65 2c 20 69 43 6f  (pWC, iBase, iCo
11c20 6c 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20  l, ~(Bitmask)0, 
11c30 57 4f 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a  WO_EQ, pIdx) ){.
11c40 20 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78          int iIdx
11c50 43 6f 6c 20 3d 20 66 69 6e 64 49 6e 64 65 78 43  Col = findIndexC
11c60 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74  ol(pParse, pDist
11c70 69 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64  inct, iBase, pId
11c80 78 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69  x, i);.        i
11c90 66 28 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20  f( iIdxCol<0 || 
11ca0 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d  pTab->aCol[pIdx-
11cb0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f  >aiColumn[i]].no
11cc0 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  tNull==0 ){.    
11cd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11ce0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
11cf0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
11d00 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  pIdx->nColumn ){
11d10 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
11d20 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74 68 61  ndex implies tha
11d30 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71  t the DISTINCT q
11d40 75 61 6c 69 66 69 65 72 20 69 73 20 72 65 64 75  ualifier is redu
11d50 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  ndant. */.      
11d60 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
11d70 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b    }..  return 0;
11d80 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  .}.../*.** Estim
11d90 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69 74 68  ate the logarith
11da0 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76  m of the input v
11db0 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32 2e 0a  alue to base 2..
11dc0 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
11dd0 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73 74 20 4e   estLog(LogEst N
11de0 29 7b 0a 20 20 4c 6f 67 45 73 74 20 78 20 3d 20  ){.  LogEst x = 
11df0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 4e 29  sqlite3LogEst(N)
11e00 3b 0a 20 20 72 65 74 75 72 6e 20 78 3e 33 33 20  ;.  return x>33 
11e10 3f 20 78 20 2d 20 33 33 20 3a 20 30 3b 0a 7d 0a  ? x - 33 : 0;.}.
11e20 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69  ./*.** Two routi
11e30 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67  nes for printing
11e40 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
11e50 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  an sqlite3_index
11e60 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75  _info.** structu
11e70 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65  re.  Used for te
11e80 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
11e90 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65  ing only.  If ne
11ea0 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f  ither.** SQLITE_
11eb0 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44  TEST or SQLITE_D
11ec0 45 42 55 47 20 61 72 65 20 64 65 66 69 6e 65 64  EBUG are defined
11ed0 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75  , then these rou
11ee0 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d  tines.** are no-
11ef0 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ops..*/.#if !def
11f00 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
11f10 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26  _VIRTUALTABLE) &
11f20 26 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54  & defined(WHERET
11f30 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74  RACE_ENABLED).st
11f40 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f  atic void TRACE_
11f50 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74  IDX_INPUTS(sqlit
11f60 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
11f70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
11f80 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54  ( !sqlite3WhereT
11f90 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  race ) return;. 
11fa0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
11fb0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
11fc0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
11fd0 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73  ugPrintf("  cons
11fe0 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d  traint[%d]: col=
11ff0 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d  %d termid=%d op=
12000 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22  %d usabled=%d\n"
12010 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
12020 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
12030 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  t[i].iColumn,.  
12040 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
12050 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73  int[i].iTermOffs
12060 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  et,.       p->aC
12070 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c  onstraint[i].op,
12080 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
12090 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65  traint[i].usable
120a0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
120b0 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b  ; i<p->nOrderBy;
120c0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
120d0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
120e0 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f   orderby[%d]: co
120f0 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c  l=%d desc=%d\n",
12100 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
12110 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d    p->aOrderBy[i]
12120 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  .iColumn,.      
12130 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e   p->aOrderBy[i].
12140 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  desc);.  }.}.sta
12150 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49  tic void TRACE_I
12160 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74  DX_OUTPUTS(sqlit
12170 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
12180 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
12190 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54  ( !sqlite3WhereT
121a0 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  race ) return;. 
121b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
121c0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
121d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
121e0 75 67 50 72 69 6e 74 66 28 22 20 20 75 73 61 67  ugPrintf("  usag
121f0 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25  e[%d]: argvIdx=%
12200 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20  d omit=%d\n",.  
12210 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
12220 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
12230 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c  ge[i].argvIndex,
12240 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
12250 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f  traintUsage[i].o
12260 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  mit);.  }.  sqli
12270 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
12280 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20    idxNum=%d\n", 
12290 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71  p->idxNum);.  sq
122a0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
122b0 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22  ("  idxStr=%s\n"
122c0 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  , p->idxStr);.  
122d0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
122e0 74 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e  tf("  orderByCon
122f0 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e  sumed=%d\n", p->
12300 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29  orderByConsumed)
12310 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
12320 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61  Printf("  estima
12330 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70  tedCost=%g\n", p
12340 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29  ->estimatedCost)
12350 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
12360 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  e TRACE_IDX_INPU
12370 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52  TS(A).#define TR
12380 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
12390 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  A).#endif..#ifnd
123a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
123b0 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
123c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
123d0 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
123e0 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20  ause term pTerm 
123f0 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65  is of a form whe
12400 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62  re it.** could b
12410 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69  e used with an i
12420 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20 70  ndex to access p
12430 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e  Src, assuming an
12440 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
12450 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a  index existed..*
12460 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 72  /.static int ter
12470 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a  mCanDriveIndex(.
12480 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
12490 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
124a0 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
124b0 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a   term to check *
124c0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
124d0 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
124e0 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61     /* Table we a
124f0 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63  re trying to acc
12500 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ess */.  Bitmask
12510 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20 20   notReady       
12520 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
12530 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s in outer loops
12540 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
12550 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20  ){.  char aff;. 
12560 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
12570 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43  Cursor!=pSrc->iC
12580 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30  ursor ) return 0
12590 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  ;.  if( (pTerm->
125a0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
125b0 51 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  Q)==0 ) return 0
125c0 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  ;.  if( (pTerm->
125d0 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f  prereqRight & no
125e0 74 52 65 61 64 79 29 21 3d 30 20 29 20 72 65 74  tReady)!=0 ) ret
125f0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54 65  urn 0;.  if( pTe
12600 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
12610 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  <0 ) return 0;. 
12620 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61   aff = pSrc->pTa
12630 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75  b->aCol[pTerm->u
12640 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66  .leftColumn].aff
12650 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71  inity;.  if( !sq
12660 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
12670 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70  tyOk(pTerm->pExp
12680 72 2c 20 61 66 66 29 20 29 20 72 65 74 75 72 6e  r, aff) ) return
12690 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   0;.  return 1;.
126a0 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
126b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
126c0 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
126d0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
126e0 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  de to construct 
126f0 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
12700 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69   for an automati
12710 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  c index.** and t
12720 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65  o set up the Whe
12730 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70  reLevel object p
12740 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68  Level so that th
12750 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
12760 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66  .** makes use of
12770 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
12780 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
12790 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75  void constructAu
127a0 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20  tomaticIndex(.  
127b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
127c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
127d0 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
127e0 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
127f0 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
12800 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
12810 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
12820 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
12830 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
12840 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
12850 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74   to get the next
12860 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d   index */.  Bitm
12870 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
12880 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
12890 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  of cursors that 
128a0 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
128b0 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  e */.  WhereLeve
128c0 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20  l *pLevel       
128d0 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
128e0 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b  index here */.){
128f0 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20  .  int nColumn; 
12900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12910 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
12920 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  mns in the const
12930 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a  ructed index */.
12940 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
12950 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rm;           /*
12960 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
12970 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
12980 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
12990 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20  m *pWCEnd;      
129a0 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57      /* End of pW
129b0 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  C->a[] */.  int 
129c0 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
129d0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
129e0 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64  of memory needed
129f0 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 49   for pIdx */.  I
12a00 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
12a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
12a20 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67 20  ject describing 
12a30 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e  the transient in
12a40 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  dex */.  Vdbe *v
12a50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12a60 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64       /* Prepared
12a70 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
12a80 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
12a90 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74 3b  .  int addrInit;
12aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12ab0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
12ac0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
12ad0 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20  bypass jump */. 
12ae0 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20   Table *pTable; 
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12b00 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
12b10 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 4b 65 79  indexed */.  Key
12b20 49 6e 66 6f 20 2a 70 4b 65 79 69 6e 66 6f 3b 20  Info *pKeyinfo; 
12b30 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20           /* Key 
12b40 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
12b50 74 68 65 20 69 6e 64 65 78 20 2a 2f 20 20 20 0a  the index */   .
12b60 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
12b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12b80 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65   Top of the inde
12b90 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20  x fill loop */. 
12ba0 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20   int regRecord; 
12bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12bc0 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
12bd0 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64   an index record
12be0 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c00 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e    /* Column coun
12c10 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ter */.  int i; 
12c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c30 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
12c40 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  nter */.  int mx
12c50 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  BitCol;         
12c60 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
12c70 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d   column in pSrc-
12c80 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f  >colUsed */.  Co
12c90 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
12ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
12cb0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
12cc0 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a  to on a column *
12cd0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
12ce0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
12cf0 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65  /* The Loop obje
12d00 63 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ct */.  Bitmask 
12d10 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  idxCols;        
12d20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
12d30 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f   columns used fo
12d40 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20  r indexing */.  
12d50 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c  Bitmask extraCol
12d60 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  s;          /* B
12d70 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f  itmap of additio
12d80 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  nal columns */. 
12d90 20 75 38 20 73 65 6e 74 57 61 72 6e 69 6e 67 20   u8 sentWarning 
12da0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
12db0 54 72 75 65 20 69 66 20 61 20 77 61 72 6e 6e 69  True if a warnni
12dc0 6e 67 20 68 61 73 20 62 65 65 6e 20 69 73 73 75  ng has been issu
12dd0 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65  ed */..  /* Gene
12de0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69  rate code to ski
12df0 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74  p over the creat
12e00 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ion and initiali
12e10 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  zation of the.  
12e20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  ** transient ind
12e30 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75  ex on 2nd and su
12e40 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
12e50 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
12e60 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
12e70 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
12e80 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64  t( v!=0 );.  add
12e90 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43  rInit = sqlite3C
12ea0 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
12eb0 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
12ec0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
12ed0 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
12ee0 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 64  added to the ind
12ef0 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65 64  ex.  ** and used
12f00 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45 20   to match WHERE 
12f10 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
12f20 74 73 20 2a 2f 0a 20 20 6e 43 6f 6c 75 6d 6e 20  ts */.  nColumn 
12f30 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20  = 0;.  pTable = 
12f40 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57  pSrc->pTab;.  pW
12f50 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70  CEnd = &pWC->a[p
12f60 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c  WC->nTerm];.  pL
12f70 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
12f80 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73 20  Loop;.  idxCols 
12f90 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
12fa0 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
12fb0 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
12fc0 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e  .    if( termCan
12fd0 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
12fe0 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
12ff0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
13000 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  Col = pTerm->u.l
13010 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
13020 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d   Bitmask cMask =
13030 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53   iCol>=BMS ? MAS
13040 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41  KBIT(BMS-1) : MA
13050 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20  SKBIT(iCol);.   
13060 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
13070 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
13080 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
13090 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69  BMS-1 );.      i
130a0 66 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67 20  f( !sentWarning 
130b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
130c0 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
130d0 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 2c  RNING_AUTOINDEX,
130e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61 75  .            "au
130f0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f 6e  tomatic index on
13100 20 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c 65   %s(%s)", pTable
13110 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
13120 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
13130 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a  l[iCol].zName);.
13140 20 20 20 20 20 20 20 20 73 65 6e 74 57 61 72 6e          sentWarn
13150 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ing = 1;.      }
13160 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43  .      if( (idxC
13170 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20  ols & cMask)==0 
13180 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  ){.        if( w
13190 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70  hereLoopResize(p
131a0 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70  Parse->db, pLoop
131b0 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 29 20 29 20 72  , nColumn+1) ) r
131c0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70  eturn;.        p
131d0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 43 6f  Loop->aLTerm[nCo
131e0 6c 75 6d 6e 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b  lumn++] = pTerm;
131f0 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73  .        idxCols
13200 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20   |= cMask;.     
13210 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
13220 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3e 30  ssert( nColumn>0
13230 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62   );.  pLoop->u.b
13240 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70  tree.nEq = pLoop
13250 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 43 6f 6c 75  ->nLTerm = nColu
13260 6d 6e 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  mn;.  pLoop->wsF
13270 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
13280 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f 49  UMN_EQ | WHERE_I
13290 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f  DX_ONLY | WHERE_
132a0 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20 20 20  INDEXED.        
132b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 57               | W
132c0 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b  HERE_AUTO_INDEX;
132d0 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
132e0 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69 74   number of addit
132f0 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65  ional columns ne
13300 65 64 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  eded to create a
13310 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69  .  ** covering i
13320 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72 69  ndex.  A "coveri
13330 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e 20  ng index" is an 
13340 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
13350 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c  ins all.  ** col
13360 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e 65  umns that are ne
13370 65 64 65 64 20 62 79 20 74 68 65 20 71 75 65 72  eded by the quer
13380 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65 72  y.  With a cover
13390 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a 20  ing index, the. 
133a0 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
133b0 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74  le never needs t
133c0 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e 20 20  o be accessed.  
133d0 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63 65  Automatic indice
133e0 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61  s must.  ** be a
133f0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
13400 62 65 63 61 75 73 65 20 74 68 65 20 69 6e 64 65  because the inde
13410 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70  x will not be up
13420 64 61 74 65 64 20 69 66 20 74 68 65 0a 20 20 2a  dated if the.  *
13430 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65  * original table
13440 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68 65   changes and the
13450 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65   index and table
13460 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20   cannot both be 
13470 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68 65  used.  ** if the
13480 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63  y go out of sync
13490 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f  ..  */.  extraCo
134a0 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73  ls = pSrc->colUs
134b0 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c  ed & (~idxCols |
134c0 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 29   MASKBIT(BMS-1))
134d0 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20 28  ;.  mxBitCol = (
134e0 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20  pTable->nCol >= 
134f0 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20 3a  BMS-1) ? BMS-1 :
13500 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20   pTable->nCol;. 
13510 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c   testcase( pTabl
13520 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e->nCol==BMS-1 )
13530 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  ;.  testcase( pT
13540 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d  able->nCol==BMS-
13550 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  2 );.  for(i=0; 
13560 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29  i<mxBitCol; i++)
13570 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43  {.    if( extraC
13580 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29  ols & MASKBIT(i)
13590 20 29 20 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20   ) nColumn++;.  
135a0 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f  }.  if( pSrc->co
135b0 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28  lUsed & MASKBIT(
135c0 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e 43  BMS-1) ){.    nC
135d0 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61 62 6c 65 2d  olumn += pTable-
135e0 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b  >nCol - BMS + 1;
135f0 0a 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  .  }.  pLoop->ws
13600 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
13610 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45  OLUMN_EQ | WHERE
13620 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 2f 2a  _IDX_ONLY;..  /*
13630 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   Construct the I
13640 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64  ndex object to d
13650 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64  escribe this ind
13660 65 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20  ex */.  nByte = 
13670 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b 0a 20  sizeof(Index);. 
13680 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d   nByte += nColum
13690 6e 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b 20 20  n*sizeof(int);  
136a0 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f     /* Index.aiCo
136b0 6c 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74 65 20  lumn */.  nByte 
136c0 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f  += nColumn*sizeo
136d0 66 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a 20 49  f(char*);   /* I
136e0 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20  ndex.azColl */. 
136f0 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d   nByte += nColum
13700 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
13710 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72     /* Index.aSor
13720 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49 64 78  tOrder */.  pIdx
13730 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
13740 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
13750 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  b, nByte);.  if(
13760 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72   pIdx==0 ) retur
13770 6e 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  n;.  pLoop->u.bt
13780 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64  ree.pIndex = pId
13790 78 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  x;.  pIdx->azCol
137a0 6c 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 49 64  l = (char**)&pId
137b0 78 5b 31 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 69  x[1];.  pIdx->ai
137c0 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26  Column = (int*)&
137d0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f  pIdx->azColl[nCo
137e0 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn];.  pIdx->a
137f0 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
13800 29 26 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  )&pIdx->aiColumn
13810 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64  [nColumn];.  pId
13820 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f  x->zName = "auto
13830 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d  -index";.  pIdx-
13840 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75  >nColumn = nColu
13850 6d 6e 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62  mn;.  pIdx->pTab
13860 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e  le = pTable;.  n
13870 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20   = 0;.  idxCols 
13880 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
13890 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
138a0 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
138b0 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e  .    if( termCan
138c0 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
138d0 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
138e0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
138f0 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  Col = pTerm->u.l
13900 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
13910 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d   Bitmask cMask =
13920 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53   iCol>=BMS ? MAS
13930 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41  KBIT(BMS-1) : MA
13940 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20  SKBIT(iCol);.   
13950 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
13960 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  l==BMS-1 );.    
13970 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
13980 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69  ==BMS );.      i
13990 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
139a0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
139b0 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54     Expr *pX = pT
139c0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
139d0 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63      idxCols |= c
139e0 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49  Mask;.        pI
139f0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
13a00 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
13a10 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70  olumn;.        p
13a20 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  Coll = sqlite3Bi
13a30 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
13a40 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
13a50 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
13a60 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  );.        pIdx-
13a70 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57  >azColl[n] = ALW
13a80 41 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f  AYS(pColl) ? pCo
13a90 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e  ll->zName : "BIN
13aa0 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b  ARY";.        n+
13ab0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
13ac0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
13ad0 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e  u32)n==pLoop->u.
13ae0 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20  btree.nEq );..  
13af0 2f 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61  /* Add additiona
13b00 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64  l columns needed
13b10 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74   to make the aut
13b20 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74  omatic index int
13b30 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e  o.  ** a coverin
13b40 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72  g index */.  for
13b50 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c  (i=0; i<mxBitCol
13b60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
13b70 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b  extraCols & MASK
13b80 42 49 54 28 69 29 20 29 7b 0a 20 20 20 20 20 20  BIT(i) ){.      
13b90 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
13ba0 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64  ] = i;.      pId
13bb0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22  x->azColl[n] = "
13bc0 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e  BINARY";.      n
13bd0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
13be0 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  if( pSrc->colUse
13bf0 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d  d & MASKBIT(BMS-
13c00 31 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  1) ){.    for(i=
13c10 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d  BMS-1; i<pTable-
13c20 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
13c30 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
13c40 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  n[n] = i;.      
13c50 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
13c60 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  = "BINARY";.    
13c70 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
13c80 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 43  .  assert( n==nC
13c90 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 2f 2a 20 43  olumn );..  /* C
13ca0 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61  reate the automa
13cb0 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70  tic index */.  p
13cc0 4b 65 79 69 6e 66 6f 20 3d 20 73 71 6c 69 74 65  Keyinfo = sqlite
13cd0 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
13ce0 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 61  arse, pIdx);.  a
13cf0 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69  ssert( pLevel->i
13d00 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 70  IdxCur>=0 );.  p
13d10 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
13d20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
13d30 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13d40 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 41  dOp4(v, OP_OpenA
13d50 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c  utoindex, pLevel
13d60 2d 3e 69 49 64 78 43 75 72 2c 20 6e 43 6f 6c 75  ->iIdxCur, nColu
13d70 6d 6e 2b 31 2c 20 30 2c 0a 20 20 20 20 20 20 20  mn+1, 0,.       
13d80 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
13d90 61 72 2a 29 70 4b 65 79 69 6e 66 6f 2c 20 50 34  ar*)pKeyinfo, P4
13da0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
13db0 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
13dc0 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70  ((v, "for %s", p
13dd0 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Table->zName));.
13de0 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61  .  /* Fill the a
13df0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77  utomatic index w
13e00 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ith content */. 
13e10 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
13e20 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
13e30 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65  OP_Rewind, pLeve
13e40 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20 72  l->iTabCur);.  r
13e50 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
13e60 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
13e70 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 47  rse);.  sqlite3G
13e80 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
13e90 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c  pParse, pIdx, pL
13ea0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72  evel->iTabCur, r
13eb0 65 67 52 65 63 6f 72 64 2c 20 31 2c 20 30 29 3b  egRecord, 1, 0);
13ec0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13ed0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
13ee0 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  sert, pLevel->iI
13ef0 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64  dxCur, regRecord
13f00 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13f10 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
13f20 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
13f30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13f40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
13f50 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  t, pLevel->iTabC
13f60 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a  ur, addrTop+1);.
13f70 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
13f80 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
13f90 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49  STMTSTATUS_AUTOI
13fa0 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33  NDEX);.  sqlite3
13fb0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
13fc0 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
13fd0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
13fe0 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
13ff0 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75  ord);.  .  /* Ju
14000 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69  mp here when ski
14010 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  pping the initia
14020 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  lization */.  sq
14030 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
14040 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a  e(v, addrInit);.
14050 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
14060 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
14070 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e  C_INDEX */..#ifn
14080 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14090 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
140a0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
140b0 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69  populate an sqli
140c0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
140d0 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20  tructure. It is 
140e0 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
140f0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
14100 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
14110 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20 73  ly release the s
14120 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70  tructure.** by p
14130 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74  assing the point
14140 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
14150 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
14160 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
14170 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
14180 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c  3_index_info *al
14190 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28  locateIndexInfo(
141a0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
141b0 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ,.  WhereClause 
141c0 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53  *pWC,.  struct S
141d0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
141e0 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c,.  ExprList *p
141f0 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74  OrderBy.){.  int
14200 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65   i, j;.  int nTe
14210 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  rm;.  struct sql
14220 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
14230 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
14240 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
14250 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20  3_index_orderby 
14260 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20  *pIdxOrderBy;.  
14270 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
14280 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
14290 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
142a0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
142b0 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  m;.  int nOrderB
142c0 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  y;.  sqlite3_ind
142d0 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
142e0 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  o;..  /* Count t
142f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73  he number of pos
14300 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  sible WHERE clau
14310 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  se constraints r
14320 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f  eferring.  ** to
14330 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61   this virtual ta
14340 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ble */.  for(i=n
14350 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57  Term=0, pTerm=pW
14360 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
14370 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
14380 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
14390 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
143a0 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
143b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
143c0 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
143d0 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  wo(pTerm->eOpera
143e0 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29  tor & ~WO_EQUIV)
143f0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
14400 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
14410 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
14420 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
14430 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
14440 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
14450 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
14460 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c  ator & (WO_ISNUL
14470 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
14480 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
14490 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
144a0 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
144b0 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a     nTerm++;.  }.
144c0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44  .  /* If the ORD
144d0 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e  ER BY clause con
144e0 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d  tains only colum
144f0 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ns in the curren
14500 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  t .  ** virtual 
14510 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63  table then alloc
14520 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
14530 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20  e aOrderBy part 
14540 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  of.  ** the sqli
14550 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
14560 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20  tructure..  */. 
14570 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   nOrderBy = 0;. 
14580 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
14590 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72  .    int n = pOr
145a0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
145b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
145c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
145d0 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72   *pExpr = pOrder
145e0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
145f0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
14600 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
14610 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  | pExpr->iTable!
14620 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
14630 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14640 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20    if( i==n){.   
14650 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b     nOrderBy = n;
14660 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
14670 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
14680 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
14690 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a   structure.  */.
146a0 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c    pIdxInfo = sql
146b0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
146c0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
146d0 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20  eof(*pIdxInfo). 
146e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146f0 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a            + (siz
14700 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b  eof(*pIdxCons) +
14710 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29   sizeof(*pUsage)
14720 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20  )*nTerm.        
14730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14740 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64     + sizeof(*pId
14750 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72  xOrderBy)*nOrder
14760 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78  By );.  if( pIdx
14770 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Info==0 ){.    s
14780 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14790 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d  Parse, "out of m
147a0 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74  emory");.    ret
147b0 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
147c0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
147d0 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
147e0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
147f0 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  fo structure con
14800 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20  tains.  ** many 
14810 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20  fields that are 
14820 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22  declared "const"
14830 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73   to prevent xBes
14840 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a  tIndex from.  **
14850 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20   changing them. 
14860 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73   We have to do s
14870 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e  ome funky castin
14880 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20  g in order to.  
14890 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** initialize th
148a0 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f  ose fields..  */
148b0 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73  .  pIdxCons = (s
148c0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
148d0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29  dex_constraint*)
148e0 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20  &pIdxInfo[1];.  
148f0 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73  pIdxOrderBy = (s
14900 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
14910 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49  dex_orderby*)&pI
14920 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20  dxCons[nTerm];. 
14930 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63   pUsage = (struc
14940 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
14950 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
14960 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e  *)&pIdxOrderBy[n
14970 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e  OrderBy];.  *(in
14980 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  t*)&pIdxInfo->nC
14990 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72  onstraint = nTer
149a0 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  m;.  *(int*)&pId
149b0 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
149c0 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28  = nOrderBy;.  *(
149d0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
149e0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
149f0 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
14a00 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43  nstraint = pIdxC
14a10 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  ons;.  *(struct 
14a20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
14a30 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66  derby**)&pIdxInf
14a40 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49  o->aOrderBy = pI
14a50 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73  dxOrderBy;.  *(s
14a60 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
14a70 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
14a80 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f  sage**)&pIdxInfo
14a90 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
14aa0 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ge =.           
14ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ae0 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a          pUsage;.
14af0 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54  .  for(i=j=0, pT
14b00 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
14b10 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
14b20 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20  Term++){.    u8 
14b30 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  op;.    if( pTer
14b40 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
14b50 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
14b60 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
14b70 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
14b80 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  Two(pTerm->eOper
14b90 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56  ator & ~WO_EQUIV
14ba0 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
14bb0 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
14bc0 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
14bd0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
14be0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
14bf0 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
14c00 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
14c10 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55  rator & (WO_ISNU
14c20 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  LL) ) continue;.
14c30 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
14c40 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
14c50 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
14c60 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
14c70 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d  iColumn = pTerm-
14c80 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
14c90 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
14ca0 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a  TermOffset = i;.
14cb0 20 20 20 20 6f 70 20 3d 20 28 75 38 29 70 54 65      op = (u8)pTe
14cc0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
14cd0 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20  WO_ALL;.    if( 
14ce0 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d  op==WO_IN ) op =
14cf0 20 57 4f 5f 45 51 3b 0a 20 20 20 20 70 49 64 78   WO_EQ;.    pIdx
14d00 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b  Cons[j].op = op;
14d10 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65  .    /* The dire
14d20 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e  ct assignment in
14d30 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69   the previous li
14d40 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f  ne is possible o
14d50 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20 20  nly because.    
14d60 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53  ** the WO_ and S
14d70 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
14d80 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72  TRAINT_ codes ar
14d90 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68  e identical.  Th
14da0 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  e.    ** followi
14db0 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69 66  ng asserts verif
14dc0 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  y this fact. */.
14dd0 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45      assert( WO_E
14de0 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  Q==SQLITE_INDEX_
14df0 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b  CONSTRAINT_EQ );
14e00 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
14e10 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  LT==SQLITE_INDEX
14e20 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29  _CONSTRAINT_LT )
14e30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
14e40 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LE==SQLITE_INDE
14e50 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20  X_CONSTRAINT_LE 
14e60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
14e70 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_GT==SQLITE_IND
14e80 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54  EX_CONSTRAINT_GT
14e90 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
14ea0 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GE==SQLITE_IN
14eb0 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
14ec0 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
14ed0 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54   WO_MATCH==SQLIT
14ee0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
14ef0 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20  NT_MATCH );.    
14f00 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65  assert( pTerm->e
14f10 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
14f20 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f  N|WO_EQ|WO_LT|WO
14f30 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  _LE|WO_GT|WO_GE|
14f40 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20 20  WO_MATCH) );.   
14f50 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   j++;.  }.  for(
14f60 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
14f70 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
14f80 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
14f90 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
14fa0 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
14fb0 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ].iColumn = pExp
14fc0 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
14fd0 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64  pIdxOrderBy[i].d
14fe0 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  esc = pOrderBy->
14ff0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
15000 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49    }..  return pI
15010 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dxInfo;.}../*.**
15020 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63   The table objec
15030 74 20 72 65 66 65 72 65 6e 63 65 20 70 61 73 73  t reference pass
15040 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
15050 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
15060 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  s function.** mu
15070 73 74 20 72 65 70 72 65 73 65 6e 74 20 61 20 76  st represent a v
15080 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68  irtual table. Th
15090 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f  is function invo
150a0 6b 65 73 20 74 68 65 20 78 42 65 73 74 49 6e 64  kes the xBestInd
150b0 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f  ex().** method o
150c0 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
150d0 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 71 6c  ble with the sql
150e0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
150f0 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 63  object that.** c
15100 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20 33  omes in as the 3
15110 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  rd argument to t
15120 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
15130 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
15140 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20 69  occurs, pParse i
15150 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
15160 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
15170 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a  e and a.** non-z
15180 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74  ero value is ret
15190 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
151a0 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20  , 0 is returned 
151b0 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  and the output.*
151c0 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 71  * part of the sq
151d0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
151e0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c 65   structure is le
151f0 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a  ft populated..**
15200 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
15210 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  ot an error is r
15220 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74  eturned, it is t
15230 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
15240 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  y of the.** call
15250 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
15260 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20   free p->idxStr 
15270 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65  if p->needToFree
15280 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65 73  IdxStr indicates
15290 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 73  .** that this is
152a0 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
152b0 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65 73  atic int vtabBes
152c0 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  tIndex(Parse *pP
152d0 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
152e0 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  b, sqlite3_index
152f0 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c  _info *p){.  sql
15300 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
15310 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61   = sqlite3GetVTa
15320 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
15330 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20  pTab)->pVtab;.  
15340 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b  int i;.  int rc;
15350 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  ..  TRACE_IDX_IN
15360 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d 20  PUTS(p);.  rc = 
15370 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e  pVtab->pModule->
15380 78 42 65 73 74 49 6e 64 65 78 28 70 56 74 61 62  xBestIndex(pVtab
15390 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49 44  , p);.  TRACE_ID
153a0 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a 20  X_OUTPUTS(p);.. 
153b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
153c0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
153d0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
153e0 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
153f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
15400 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
15410 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72  if( !pVtab->zErr
15420 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Msg ){.      sql
15430 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15440 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74  rse, "%s", sqlit
15450 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20  e3ErrStr(rc));. 
15460 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15470 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15480 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56  pParse, "%s", pV
15490 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
154a0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
154b0 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a  e3_free(pVtab->z
154c0 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62  ErrMsg);.  pVtab
154d0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a  ->zErrMsg = 0;..
154e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
154f0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
15500 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 61  ){.    if( !p->a
15510 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73  Constraint[i].us
15520 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73  able && p->aCons
15530 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61  traintUsage[i].a
15540 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20  rgvIndex>0 ){.  
15550 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
15560 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
15570 20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25 73         "table %s
15580 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72 65 74  : xBestIndex ret
15590 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64  urned an invalid
155a0 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e   plan", pTab->zN
155b0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
155c0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
155d0 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66  ->nErr;.}.#endif
155e0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
155f0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
15600 54 41 42 4c 45 29 20 2a 2f 0a 0a 0a 23 69 66 64  TABLE) */...#ifd
15610 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
15620 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
15630 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
15640 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61  he location of a
15650 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20   particular key 
15660 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69  among all keys i
15670 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20  n an.** index.  
15680 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
15690 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f  s in aStat as fo
156a0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
156b0 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73  aStat[0]      Es
156c0 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  t. number of row
156d0 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61 6c  s less than pVal
156e0 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20  .**    aStat[1] 
156f0 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72       Est. number
15700 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74   of rows equal t
15710 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74  o pVal.**.** Ret
15720 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
15730 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61   success..*/.sta
15740 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4b 65  tic void whereKe
15750 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20  yStats(.  Parse 
15760 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
15770 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
15780 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
15790 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
157a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
157b0 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64   Index to consid
157c0 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a  er domain of */.
157d0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
157e0 20 2a 70 52 65 63 2c 20 20 20 20 20 20 20 2f 2a   *pRec,       /*
157f0 20 56 65 63 74 6f 72 20 6f 66 20 76 61 6c 75 65   Vector of value
15800 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f  s to consider */
15810 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20  .  int roundUp, 
15820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15830 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72  * Round up if tr
15840 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20  ue.  Round down 
15850 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52  if false */.  tR
15860 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20  owcnt *aStat    
15870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
15880 3a 20 73 74 61 74 73 20 77 72 69 74 74 65 6e 20  : stats written 
15890 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  here */.){.  Ind
158a0 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c  exSample *aSampl
158b0 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c  e = pIdx->aSampl
158c0 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  e;.  int iCol;  
158d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158e0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 65 71   /* Index of req
158f0 75 69 72 65 64 20 73 74 61 74 73 20 69 6e 20 61  uired stats in a
15900 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20  nEq[] etc. */.  
15910 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20  int iMin = 0;   
15920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
15930 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e  mallest sample n
15940 6f 74 20 79 65 74 20 74 65 73 74 65 64 20 2a 2f  ot yet tested */
15950 0a 20 20 69 6e 74 20 69 20 3d 20 70 49 64 78 2d  .  int i = pIdx-
15960 3e 6e 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 2f  >nSample;      /
15970 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c  * Smallest sampl
15980 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6f 72  e larger than or
15990 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a   equal to pRec *
159a0 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20  /.  int iTest;  
159b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159c0 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74  /* Next sample t
159d0 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20  o test */.  int 
159e0 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  res;            
159f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
15a00 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  t of comparison 
15a10 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20  operation */..  
15a20 61 73 73 65 72 74 28 20 70 52 65 63 21 3d 30 20  assert( pRec!=0 
15a30 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
15a40 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
15a50 20 69 66 28 20 70 52 65 63 3d 3d 30 20 29 20 72   if( pRec==0 ) r
15a60 65 74 75 72 6e 3b 0a 20 20 69 43 6f 6c 20 3d 20  eturn;.  iCol = 
15a70 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 2d 20 31  pRec->nField - 1
15a80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
15a90 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20  ->nSample>0 );. 
15aa0 20 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e 6e   assert( pRec->n
15ab0 46 69 65 6c 64 3e 30 20 26 26 20 69 43 6f 6c 3c  Field>0 && iCol<
15ac0 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  pIdx->nSampleCol
15ad0 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 54   );.  do{.    iT
15ae0 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 29 2f 32  est = (iMin+i)/2
15af0 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  ;.    res = sqli
15b00 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
15b10 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 54 65  pare(aSample[iTe
15b20 73 74 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  st].n, aSample[i
15b30 54 65 73 74 5d 2e 70 2c 20 70 52 65 63 29 3b 0a  Test].p, pRec);.
15b40 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
15b50 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54  .      iMin = iT
15b60 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  est+1;.    }else
15b70 7b 0a 20 20 20 20 20 20 69 20 3d 20 69 54 65 73  {.      i = iTes
15b80 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  t;.    }.  }whil
15b90 65 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69  e( res && iMin<i
15ba0 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
15bb0 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
15bc0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
15bd0 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 63 68  rt statements ch
15be0 65 63 6b 20 74 68 61 74 20 74 68 65 20 62 69 6e  eck that the bin
15bf0 61 72 79 20 73 65 61 72 63 68 20 63 6f 64 65 0a  ary search code.
15c00 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64    ** above found
15c10 20 74 68 65 20 72 69 67 68 74 20 61 6e 73 77 65   the right answe
15c20 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  r. This block se
15c30 72 76 65 73 20 6e 6f 20 70 75 72 70 6f 73 65 20  rves no purpose 
15c40 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20  other.  ** than 
15c50 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 61 73  to invoke the as
15c60 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28  serts.  */.  if(
15c70 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   res==0 ){.    /
15c80 2a 20 49 66 20 28 72 65 73 3d 3d 30 29 20 69 73  * If (res==0) is
15c90 20 74 72 75 65 2c 20 74 68 65 6e 20 73 61 6d 70   true, then samp
15ca0 6c 65 20 24 69 20 6d 75 73 74 20 62 65 20 65 71  le $i must be eq
15cb0 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20  ual to pRec */. 
15cc0 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 49 64     assert( i<pId
15cd0 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20  x->nSample );.  
15ce0 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c    assert( 0==sql
15cf0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
15d00 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d  mpare(aSample[i]
15d10 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70  .n, aSample[i].p
15d20 2c 20 70 52 65 63 29 0a 20 20 20 20 20 20 20 20  , pRec).        
15d30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
15d40 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
15d50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
15d60 4f 74 68 65 72 77 69 73 65 2c 20 70 52 65 63 20  Otherwise, pRec 
15d70 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20  must be smaller 
15d80 74 68 61 6e 20 73 61 6d 70 6c 65 20 24 69 20 61  than sample $i a
15d90 6e 64 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20  nd larger than. 
15da0 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24 69     ** sample ($i
15db0 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  -1).  */.    ass
15dc0 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53  ert( i==pIdx->nS
15dd0 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20  ample .         
15de0 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  || sqlite3VdbeRe
15df0 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
15e00 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c  ple[i].n, aSampl
15e10 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a  e[i].p, pRec)>0.
15e20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
15e30 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
15e40 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73 65  iled );.    asse
15e50 72 74 28 20 69 3d 3d 30 0a 20 20 20 20 20 20 20  rt( i==0.       
15e60 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65    || sqlite3Vdbe
15e70 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
15e80 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53  ample[i-1].n, aS
15e90 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52  ample[i-1].p, pR
15ea0 65 63 29 3c 30 0a 20 20 20 20 20 20 20 20 20 7c  ec)<0.         |
15eb0 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
15ec0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
15ed0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65  }.#endif /* ifde
15ee0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  f SQLITE_DEBUG *
15ef0 2f 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  /..  /* At this 
15f00 70 6f 69 6e 74 2c 20 61 53 61 6d 70 6c 65 5b 69  point, aSample[i
15f10 5d 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  ] is the first s
15f20 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67 72  ample that is gr
15f30 65 61 74 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20  eater than.  ** 
15f40 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 56 61 6c  or equal to pVal
15f50 2e 20 20 4f 72 20 69 66 20 69 3d 3d 70 49 64 78  .  Or if i==pIdx
15f60 2d 3e 6e 53 61 6d 70 6c 65 2c 20 74 68 65 6e 20  ->nSample, then 
15f70 61 6c 6c 20 73 61 6d 70 6c 65 73 20 61 72 65 20  all samples are 
15f80 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 70  less.  ** than p
15f90 56 61 6c 2e 20 20 49 66 20 61 53 61 6d 70 6c 65  Val.  If aSample
15fa0 5b 69 5d 3d 3d 70 56 61 6c 2c 20 74 68 65 6e 20  [i]==pVal, then 
15fb0 72 65 73 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 69  res==0..  */.  i
15fc0 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
15fd0 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d   aStat[0] = aSam
15fe0 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c  ple[i].anLt[iCol
15ff0 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20  ];.    aStat[1] 
16000 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45  = aSample[i].anE
16010 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65  q[iCol];.  }else
16020 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c  {.    tRowcnt iL
16030 6f 77 65 72 2c 20 69 55 70 70 65 72 2c 20 69 47  ower, iUpper, iG
16040 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 30  ap;.    if( i==0
16050 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72   ){.      iLower
16060 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70 70   = 0;.      iUpp
16070 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 30 5d 2e  er = aSample[0].
16080 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  anLt[iCol];.    
16090 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70  }else{.      iUp
160a0 70 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e  per = i>=pIdx->n
160b0 53 61 6d 70 6c 65 20 3f 20 70 49 64 78 2d 3e 61  Sample ? pIdx->a
160c0 69 52 6f 77 45 73 74 5b 30 5d 20 3a 20 61 53 61  iRowEst[0] : aSa
160d0 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f  mple[i].anLt[iCo
160e0 6c 5d 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72  l];.      iLower
160f0 20 3d 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e   = aSample[i-1].
16100 61 6e 45 71 5b 69 43 6f 6c 5d 20 2b 20 61 53 61  anEq[iCol] + aSa
16110 6d 70 6c 65 5b 69 2d 31 5d 2e 61 6e 4c 74 5b 69  mple[i-1].anLt[i
16120 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col];.    }.    
16130 61 53 74 61 74 5b 31 5d 20 3d 20 28 70 49 64 78  aStat[1] = (pIdx
16140 2d 3e 6e 43 6f 6c 75 6d 6e 3e 69 43 6f 6c 20 3f  ->nColumn>iCol ?
16150 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43   pIdx->aAvgEq[iC
16160 6f 6c 5d 20 3a 20 31 29 3b 0a 20 20 20 20 69 66  ol] : 1);.    if
16170 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72  ( iLower>=iUpper
16180 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d   ){.      iGap =
16190 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
161a0 20 20 20 20 20 69 47 61 70 20 3d 20 69 55 70 70       iGap = iUpp
161b0 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20  er - iLower;.   
161c0 20 7d 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64   }.    if( round
161d0 55 70 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70  Up ){.      iGap
161e0 20 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20   = (iGap*2)/3;. 
161f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16200 69 47 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20  iGap = iGap/3;. 
16210 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30     }.    aStat[0
16220 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61  ] = iLower + iGa
16230 70 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  p;.  }.}.#endif 
16240 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
16250 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
16260 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
16270 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
16280 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
16290 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
162a0 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69  hat will be visi
162b0 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69  ted.** by scanni
162c0 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ng an index for 
162d0 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65  a range of value
162e0 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79  s. The range may
162f0 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a   have an upper.*
16300 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72  * bound, a lower
16310 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e   bound, or both.
16320 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
16330 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65 74  e terms that set
16340 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e   the upper.** an
16350 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61  d lower bounds a
16360 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20 62  re represented b
16370 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  y pLower and pUp
16380 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79  per respectively
16390 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65  . For.** example
163a0 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
163b0 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31  index p is on t1
163c0 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e  (a):.**.**   ...
163d0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
163e0 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
163f0 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ...**           
16400 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c           |_____|
16410 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20     |_____|.**   
16420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16430 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a      |         |.
16440 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16450 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20         pLower   
16460 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66   pUpper.**.** If
16470 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 75   either of the u
16480 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f  pper or lower bo
16490 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65  und is not prese
164a0 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73  nt, then NULL is
164b0 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c   passed in.** pl
164c0 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65  ace of the corre
164d0 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65  sponding WhereTe
164e0 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  rm..**.** The va
164f0 6c 75 65 20 69 6e 20 28 70 42 75 69 6c 64 65 72  lue in (pBuilder
16500 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
16510 6e 45 71 29 20 69 73 20 74 68 65 20 69 6e 64 65  nEq) is the inde
16520 78 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 2a  x of the index.*
16530 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74  * column subject
16540 20 74 6f 20 74 68 65 20 72 61 6e 67 65 20 63 6f   to the range co
16550 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71  nstraint. Or, eq
16560 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20  uivalently, the 
16570 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 71 75  number of.** equ
16580 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
16590 73 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74  s optimized by t
165a0 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65  he proposed inde
165b0 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d  x scan. For exam
165c0 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e 67  ple,.** assuming
165d0 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74   index p is on t
165e0 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65  1(a, b), and the
165f0 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a   SQL query is:.*
16600 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
16610 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41  t1 WHERE a = ? A
16620 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c  ND b > ? AND b <
16630 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65   ? ....**.** the
16640 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20  n nEq is set to 
16650 31 20 28 61 73 20 74 68 65 20 72 61 6e 67 65 20  1 (as the range 
16660 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d  restricted colum
16670 6e 2c 20 62 2c 20 69 73 20 74 68 65 20 73 65 63  n, b, is the sec
16680 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73  ond .** left-mos
16690 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
166a0 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74  index). Or, if t
166b0 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  he query is:.**.
166c0 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
166d0 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44   WHERE a > ? AND
166e0 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a   a < ? ....**.**
166f0 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74   then nEq is set
16700 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   to 0..**.** Whe
16710 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
16720 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75  is called, *pnOu
16730 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
16740 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 29 20  sqlite3LogEst() 
16750 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  of the.** number
16760 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 74 68   of rows that th
16770 65 20 69 6e 64 65 78 20 73 63 61 6e 20 69 73 20  e index scan is 
16780 65 78 70 65 63 74 65 64 20 74 6f 20 76 69 73 69  expected to visi
16790 74 20 77 69 74 68 6f 75 74 20 0a 2a 2a 20 63 6f  t without .** co
167a0 6e 73 69 64 65 72 69 6e 67 20 74 68 65 20 72 61  nsidering the ra
167b0 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  nge constraints.
167c0 20 49 66 20 6e 45 71 20 69 73 20 30 2c 20 74 68   If nEq is 0, th
167d0 69 73 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  is is the number
167e0 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e 20   of .** rows in 
167f0 74 68 65 20 69 6e 64 65 78 2e 20 41 73 73 75 6d  the index. Assum
16800 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  ing no error occ
16810 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20 61  urs, *pnOut is a
16820 64 6a 75 73 74 65 64 20 28 72 65 64 75 63 65 64  djusted (reduced
16830 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74 20  ).** to account 
16840 66 6f 72 20 74 68 65 20 72 61 6e 67 65 20 63 6f  for the range co
16850 6e 74 72 61 69 6e 74 73 20 70 4c 6f 77 65 72 20  ntraints pLower 
16860 61 6e 64 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a  and pUpper..** .
16870 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63  ** In the absenc
16880 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74  e of sqlite_stat
16890 34 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20  4 ANALYZE data, 
168a0 6f 72 20 69 66 20 73 75 63 68 20 64 61 74 61 20  or if such data 
168b0 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65  cannot be.** use
168c0 64 2c 20 65 61 63 68 20 72 61 6e 67 65 20 69 6e  d, each range in
168d0 65 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73  equality reduces
168e0 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
168f0 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66  e by a factor of
16900 20 34 2e 20 0a 2a 2a 20 48 65 6e 63 65 20 61 20   4. .** Hence a 
16910 70 61 69 72 20 6f 66 20 63 6f 6e 73 74 72 61 69  pair of constrai
16920 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f  nts (x>? AND x<?
16930 29 20 72 65 64 75 63 65 73 20 74 68 65 20 65 78  ) reduces the ex
16940 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  pected number of
16950 0a 2a 2a 20 72 6f 77 73 20 76 69 73 69 74 65 64  .** rows visited
16960 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20   by a factor of 
16970 31 36 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  16..*/.static in
16980 74 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e  t whereRangeScan
16990 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
169a0 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
169b0 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
169c0 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
169d0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42   */.  WhereLoopB
169e0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
169f0 2c 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ,.  WhereTerm *p
16a00 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65  Lower,   /* Lowe
16a10 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72  r bound on the r
16a20 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33  ange. ex: "x>123
16a30 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  " Might be NULL 
16a40 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
16a50 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70  pUpper,   /* Upp
16a60 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
16a70 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35  range. ex: "x<45
16a80 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  5" Might be NULL
16a90 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
16aa0 2a 70 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f  *pLoop     /* Mo
16ab0 64 69 66 79 20 74 68 65 20 2e 6e 4f 75 74 20 61  dify the .nOut a
16ac0 6e 64 20 6d 61 79 62 65 20 2e 72 52 75 6e 20 66  nd maybe .rRun f
16ad0 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ields */.){.  in
16ae0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16af0 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70  ;.  int nOut = p
16b00 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 69 6e  Loop->nOut;.  in
16b10 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  t nEq = pLoop->u
16b20 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 4c 6f  .btree.nEq;.  Lo
16b30 67 45 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64  gEst nNew;..#ifd
16b40 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
16b50 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
16b60 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f    Index *p = pLo
16b70 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
16b80 65 78 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53  ex;..  if( p->nS
16b90 61 6d 70 6c 65 3e 30 0a 20 20 20 26 26 20 6e 45  ample>0.   && nE
16ba0 71 3d 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  q==pBuilder->nRe
16bb0 63 56 61 6c 69 64 0a 20 20 20 26 26 20 6e 45 71  cValid.   && nEq
16bc0 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20  <p->nSampleCol. 
16bd0 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
16be0 6e 45 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d  nEnabled(pParse-
16bf0 3e 64 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74  >db, SQLITE_Stat
16c00 33 29 20 0a 20 20 29 7b 0a 20 20 20 20 55 6e 70  3) .  ){.    Unp
16c10 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65  ackedRecord *pRe
16c20 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52  c = pBuilder->pR
16c30 65 63 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20  ec;.    tRowcnt 
16c40 61 5b 32 5d 3b 0a 20 20 20 20 75 38 20 61 66 66  a[2];.    u8 aff
16c50 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 72 69 61 62  ;..    /* Variab
16c60 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62  le iLower will b
16c70 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74  e set to the est
16c80 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
16c90 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a  ber of rows in .
16ca0 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78      ** the index
16cb0 20 74 68 61 74 20 61 72 65 20 6c 65 73 73 20 74   that are less t
16cc0 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f  han the lower bo
16cd0 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65  und of the range
16ce0 20 71 75 65 72 79 2e 20 54 68 65 0a 20 20 20 20   query. The.    
16cf0 2a 2a 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62  ** lower bound b
16d00 65 69 6e 67 20 74 68 65 20 63 6f 6e 63 61 74 65  eing the concate
16d10 6e 61 74 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64  nation of $P and
16d20 20 24 4c 2c 20 77 68 65 72 65 20 24 50 20 69 73   $L, where $P is
16d30 20 74 68 65 0a 20 20 20 20 2a 2a 20 6b 65 79 2d   the.    ** key-
16d40 70 72 65 66 69 78 20 66 6f 72 6d 65 64 20 62 79  prefix formed by
16d50 20 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20   the nEq values 
16d60 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20  matched against 
16d70 74 68 65 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73  the nEq left-mos
16d80 74 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73  t.    ** columns
16d90 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61   of the index, a
16da0 6e 64 20 24 4c 20 69 73 20 74 68 65 20 76 61 6c  nd $L is the val
16db0 75 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a 20 20  ue in pLower..  
16dc0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 72 2c 20    **.    ** Or, 
16dd0 69 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c  if pLower is NUL
16de0 4c 20 6f 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62  L or $L cannot b
16df0 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
16e00 20 69 74 20 28 62 65 63 61 75 73 65 20 69 74 0a   it (because it.
16e10 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20      ** is not a 
16e20 73 69 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20  simple variable 
16e30 6f 72 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65  or literal value
16e40 29 2c 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75  ), the lower bou
16e50 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  nd of the.    **
16e60 20 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44 75   range is $P. Du
16e70 65 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e 20  e to a quirk in 
16e80 74 68 65 20 77 61 79 20 77 68 65 72 65 4b 65 79  the way whereKey
16e90 53 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20 65  Stats() works, e
16ea0 76 65 6e 0a 20 20 20 20 2a 2a 20 69 66 20 24 4c  ven.    ** if $L
16eb0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 77   is available, w
16ec0 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 69  hereKeyStats() i
16ed0 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 62 6f 74  s called for bot
16ee0 68 20 28 24 50 29 20 61 6e 64 20 0a 20 20 20 20  h ($P) and .    
16ef0 2a 2a 20 28 24 50 3a 24 4c 29 20 61 6e 64 20 74  ** ($P:$L) and t
16f00 68 65 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65  he larger of the
16f10 20 74 77 6f 20 72 65 74 75 72 6e 65 64 20 76 61   two returned va
16f20 6c 75 65 73 20 75 73 65 64 2e 0a 20 20 20 20 2a  lues used..    *
16f30 2a 0a 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72  *.    ** Similar
16f40 6c 79 2c 20 69 55 70 70 65 72 20 69 73 20 74 6f  ly, iUpper is to
16f50 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65   be set to the e
16f60 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
16f70 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20  umber of rows.  
16f80 20 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74    ** less than t
16f90 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f  he upper bound o
16fa0 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65 72  f the range quer
16fb0 79 2e 20 57 68 65 72 65 20 74 68 65 20 75 70 70  y. Where the upp
16fc0 65 72 20 62 6f 75 6e 64 0a 20 20 20 20 2a 2a 20  er bound.    ** 
16fd0 69 73 20 65 69 74 68 65 72 20 28 24 50 29 20 6f  is either ($P) o
16fe0 72 20 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e  r ($P:$U). Again
16ff0 2c 20 65 76 65 6e 20 69 66 20 24 55 20 69 73 20  , even if $U is 
17000 61 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20  available, both 
17010 76 61 6c 75 65 73 0a 20 20 20 20 2a 2a 20 6f 66  values.    ** of
17020 20 69 55 70 70 65 72 20 61 72 65 20 72 65 71 75   iUpper are requ
17030 65 73 74 65 64 20 6f 66 20 77 68 65 72 65 4b 65  ested of whereKe
17040 79 53 74 61 74 73 28 29 20 61 6e 64 20 74 68 65  yStats() and the
17050 20 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20   smaller used.. 
17060 20 20 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e     */.    tRowcn
17070 74 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 74 52  t iLower;.    tR
17080 6f 77 63 6e 74 20 69 55 70 70 65 72 3b 0a 0a 20  owcnt iUpper;.. 
17090 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 2d 3e 6e     if( nEq==p->n
170a0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
170b0 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
170c0 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 7d 65  _INTEGER;.    }e
170d0 6c 73 65 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  lse{.      aff =
170e0 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c   p->pTable->aCol
170f0 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71  [p->aiColumn[nEq
17100 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  ]].affinity;.   
17110 20 7d 0a 20 20 20 20 2f 2a 20 44 65 74 65 72 6d   }.    /* Determ
17120 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64 20 69  ine iLower and i
17130 55 70 70 65 72 20 75 73 69 6e 67 20 28 24 50 29  Upper using ($P)
17140 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66   only. */.    if
17150 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20 20 20  ( nEq==0 ){.    
17160 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    iLower = 0;.  
17170 20 20 20 20 69 55 70 70 65 72 20 3d 20 70 2d 3e      iUpper = p->
17180 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20  aiRowEst[0];.   
17190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
171a0 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c   Note: this call
171b0 20 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69   could be optimi
171c0 7a 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65  zed away - since
171d0 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73   the same values
171e0 20 6d 75 73 74 20 0a 20 20 20 20 20 20 2a 2a 20   must .      ** 
171f0 68 61 76 65 20 62 65 65 6e 20 72 65 71 75 65 73  have been reques
17200 74 65 64 20 77 68 65 6e 20 74 65 73 74 69 6e 67  ted when testing
17210 20 6b 65 79 20 24 50 20 69 6e 20 77 68 65 72 65   key $P in where
17220 45 71 75 61 6c 53 63 61 6e 45 73 74 28 29 2e 20  EqualScanEst(). 
17230 20 2a 2f 0a 20 20 20 20 20 20 77 68 65 72 65 4b   */.      whereK
17240 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
17250 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
17260 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61        iLower = a
17270 5b 30 5d 3b 0a 20 20 20 20 20 20 69 55 70 70 65  [0];.      iUppe
17280 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b  r = a[0] + a[1];
17290 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
172a0 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72  f possible, impr
172b0 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65  ove on the iLowe
172c0 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67  r estimate using
172d0 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20   ($P:$L). */.   
172e0 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20   if( pLower ){. 
172f0 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20       int bOk;   
17300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17310 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75   /* True if valu
17320 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  e is extracted f
17330 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20  rom pExpr */.   
17340 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
17350 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e   pLower->pExpr->
17360 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73  pRight;.      as
17370 73 65 72 74 28 20 28 70 4c 6f 77 65 72 2d 3e 65  sert( (pLower->e
17380 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47  Operator & (WO_G
17390 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a  T|WO_GE))!=0 );.
173a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
173b0 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
173c0 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20  alue(pParse, p, 
173d0 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66  &pRec, pExpr, af
173e0 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20  f, nEq, &bOk);. 
173f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
17400 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b  ITE_OK && bOk ){
17410 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74  .        tRowcnt
17420 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 77   iNew;.        w
17430 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
17440 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
17450 20 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4e 65   a);.        iNe
17460 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f  w = a[0] + ((pLo
17470 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  wer->eOperator &
17480 20 57 4f 5f 47 54 29 20 3f 20 61 5b 31 5d 20 3a   WO_GT) ? a[1] :
17490 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
174a0 20 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20 69   iNew>iLower ) i
174b0 4c 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20  Lower = iNew;.  
174c0 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20        nOut--;.  
174d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
174e0 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c   /* If possible,
174f0 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20   improve on the 
17500 69 55 70 70 65 72 20 65 73 74 69 6d 61 74 65 20  iUpper estimate 
17510 75 73 69 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a  using ($P:$U). *
17520 2f 0a 20 20 20 20 69 66 28 20 70 55 70 70 65 72  /.    if( pUpper
17530 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f   ){.      int bO
17540 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
17550 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
17560 20 76 61 6c 75 65 20 69 73 20 65 78 74 72 61 63   value is extrac
17570 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a  ted from pExpr *
17580 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  /.      Expr *pE
17590 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45  xpr = pUpper->pE
175a0 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
175b0 20 20 20 61 73 73 65 72 74 28 20 28 70 55 70 70     assert( (pUpp
175c0 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
175d0 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d  (WO_LT|WO_LE))!=
175e0 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
175f0 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
17600 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
17610 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
17620 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f  r, aff, nEq, &bO
17630 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
17640 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
17650 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 74 52  Ok ){.        tR
17660 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20  owcnt iNew;.    
17670 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74      whereKeyStat
17680 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
17690 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 1, a);.      
176a0 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20    iNew = a[0] + 
176b0 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61  ((pUpper->eOpera
176c0 74 6f 72 20 26 20 57 4f 5f 4c 45 29 20 3f 20 61  tor & WO_LE) ? a
176d0 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  [1] : 0);.      
176e0 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70 65    if( iNew<iUppe
176f0 72 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e 65  r ) iUpper = iNe
17700 77 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 2d  w;.        nOut-
17710 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  -;.      }.    }
17720 0a 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ..    pBuilder->
17730 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20  pRec = pRec;.   
17740 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17750 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
17760 69 55 70 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b  iUpper>iLower ){
17770 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20  .        nNew = 
17780 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 69 55  sqlite3LogEst(iU
17790 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a  pper - iLower);.
177a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
177b0 20 20 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20       nNew = 10; 
177c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31         assert( 1
177d0 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
177e0 28 32 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (2) );.      }. 
177f0 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f       if( nNew<nO
17800 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f  ut ){.        nO
17810 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  ut = nNew;.     
17820 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e   }.      pLoop->
17830 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e  nOut = (LogEst)n
17840 4f 75 74 3b 0a 20 20 20 20 20 20 57 48 45 52 45  Out;.      WHERE
17850 54 52 41 43 45 28 30 78 31 30 30 2c 20 28 22 72  TRACE(0x100, ("r
17860 61 6e 67 65 20 73 63 61 6e 20 72 65 67 69 6f 6e  ange scan region
17870 73 3a 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25  s: %u..%u  est=%
17880 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
17890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
178a0 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32  u32)iLower, (u32
178b0 29 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b  )iUpper, nOut));
178c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
178d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
178e0 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45   }.#else.  UNUSE
178f0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 72  D_PARAMETER(pPar
17900 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  se);.  UNUSED_PA
17910 52 41 4d 45 54 45 52 28 70 42 75 69 6c 64 65 72  RAMETER(pBuilder
17920 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
17930 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55  rt( pLower || pU
17940 70 70 65 72 20 29 3b 0a 20 20 2f 2a 20 54 55 4e  pper );.  /* TUN
17950 49 4e 47 3a 20 20 45 61 63 68 20 69 6e 65 71 75  ING:  Each inequ
17960 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
17970 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61   reduces the sea
17980 72 63 68 20 73 70 61 63 65 20 34 2d 66 6f 6c 64  rch space 4-fold
17990 2e 0a 20 20 2a 2a 20 41 20 42 45 54 57 45 45 4e  ..  ** A BETWEEN
179a0 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 72 65   operator, there
179b0 66 6f 72 65 2c 20 72 65 64 75 63 65 73 20 74 68  fore, reduces th
179c0 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 31  e search space 1
179d0 36 2d 66 6f 6c 64 20 2a 2f 0a 20 20 6e 4e 65 77  6-fold */.  nNew
179e0 20 3d 20 6e 4f 75 74 3b 0a 20 20 69 66 28 20 70   = nOut;.  if( p
179f0 4c 6f 77 65 72 20 26 26 20 28 70 4c 6f 77 65 72  Lower && (pLower
17a00 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
17a10 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  _VNULL)==0 ){.  
17a20 20 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20 20 20    nNew -= 20;   
17a30 20 20 20 20 20 61 73 73 65 72 74 28 20 32 30 3d       assert( 20=
17a40 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34  =sqlite3LogEst(4
17a50 29 20 29 3b 0a 20 20 20 20 6e 4f 75 74 2d 2d 3b  ) );.    nOut--;
17a60 0a 20 20 7d 0a 20 20 69 66 28 20 70 55 70 70 65  .  }.  if( pUppe
17a70 72 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d  r ){.    nNew -=
17a80 20 32 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   20;        asse
17a90 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 20==sqlite3L
17aa0 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20  ogEst(4) );.    
17ab0 6e 4f 75 74 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66  nOut--;.  }.  if
17ac0 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e 65 77  ( nNew<10 ) nNew
17ad0 20 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 4e 65   = 10;.  if( nNe
17ae0 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20 3d 20  w<nOut ) nOut = 
17af0 6e 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e  nNew;.  pLoop->n
17b00 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f  Out = (LogEst)nO
17b10 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ut;.  return rc;
17b20 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
17b30 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
17b40 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73  R_STAT4./*.** Es
17b50 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
17b60 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
17b70 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
17b80 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65  based on.** an e
17b90 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
17ba0 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77  nt x=VALUE and w
17bb0 68 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20  here that VALUE 
17bc0 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65  occurs in.** the
17bd0 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e   histogram data.
17be0 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b    This only work
17bf0 73 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20  s when x is the 
17c00 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c  left-most.** col
17c10 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  umn of an index 
17c20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33  and sqlite_stat3
17c30 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20   histogram data 
17c40 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  is available.** 
17c50 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20  for that index. 
17c60 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c   When pExpr==NUL
17c70 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  L that means the
17c80 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a   constraint is.*
17c90 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e  * "x IS NULL" in
17ca0 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55  stead of "x=VALU
17cb0 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  E"..**.** Write 
17cc0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
17cd0 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
17ce0 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
17cf0 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
17d00 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
17d10 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
17d20 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
17d30 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
17d40 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
17d50 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
17d60 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
17d70 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
17d80 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
17d90 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
17da0 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
17db0 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
17dc0 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
17dd0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
17de0 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
17df0 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
17e00 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
17e10 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
17e20 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
17e30 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
17e40 74 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75  tic int whereEqu
17e50 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  alScanEst(.  Par
17e60 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
17e70 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
17e80 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
17e90 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
17ea0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
17eb0 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a  uilder,.  Expr *
17ec0 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f  pExpr,         /
17ed0 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72  * Expression for
17ee0 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d   VALUE in the x=
17ef0 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  VALUE constraint
17f00 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70   */.  tRowcnt *p
17f10 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72  nRow       /* Wr
17f20 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20  ite the revised 
17f30 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72  row estimate her
17f40 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  e */.){.  Index 
17f50 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  *p = pBuilder->p
17f60 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
17f70 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  dex;.  int nEq =
17f80 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
17f90 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
17fa0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
17fb0 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d  pRec = pBuilder-
17fc0 3e 70 52 65 63 3b 0a 20 20 75 38 20 61 66 66 3b  >pRec;.  u8 aff;
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fe0 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66     /* Column aff
17ff0 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72  inity */.  int r
18000 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
18010 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
18020 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
18030 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32  */.  tRowcnt a[2
18040 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
18050 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a  * Statistics */.
18060 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73    int bOk;..  as
18070 73 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a  sert( nEq>=1 );.
18080 20 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 28    assert( nEq<=(
18090 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 20 29 3b  p->nColumn+1) );
180a0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53  .  assert( p->aS
180b0 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73  ample!=0 );.  as
180c0 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65  sert( p->nSample
180d0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
180e0 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
180f0 6c 69 64 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a  lid<nEq );..  /*
18100 20 49 66 20 76 61 6c 75 65 73 20 61 72 65 20 6e   If values are n
18110 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ot available for
18120 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
18130 68 65 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20  he index to the 
18140 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69  left.  ** of thi
18150 73 20 6f 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61  s one, no estima
18160 74 65 20 63 61 6e 20 62 65 20 6d 61 64 65 2e 20  te can be made. 
18170 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  Return SQLITE_NO
18180 54 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28  TFOUND. */.  if(
18190 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
181a0 61 6c 69 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a  alid<(nEq-1) ){.
181b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
181c0 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a  E_NOTFOUND;.  }.
181d0 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e  .  /* This is an
181e0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e   optimization on
181f0 6c 79 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f 20  ly. The call to 
18200 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
18210 65 53 65 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a  eSetValue().  **
18220 20 62 65 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74   below would ret
18230 75 72 6e 20 74 68 65 20 73 61 6d 65 20 76 61 6c  urn the same val
18240 75 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45  ue.  */.  if( nE
18250 71 3e 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  q>p->nColumn ){.
18260 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a      *pnRow = 1;.
18270 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18280 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 66 66  E_OK;.  }..  aff
18290 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43   = p->pTable->aC
182a0 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  ol[p->aiColumn[n
182b0 45 71 2d 31 5d 5d 2e 61 66 66 69 6e 69 74 79 3b  Eq-1]].affinity;
182c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53  .  rc = sqlite3S
182d0 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
182e0 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52  e(pParse, p, &pR
182f0 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  ec, pExpr, aff, 
18300 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20 20  nEq-1, &bOk);.  
18310 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d  pBuilder->pRec =
18320 20 70 52 65 63 3b 0a 20 20 69 66 28 20 72 63 21   pRec;.  if( rc!
18330 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
18340 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 62 4f  urn rc;.  if( bO
18350 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  k==0 ) return SQ
18360 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20  LITE_NOTFOUND;. 
18370 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
18380 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20 77  alid = nEq;..  w
18390 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
183a0 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
183b0 20 61 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43   a);.  WHERETRAC
183c0 45 28 30 78 31 30 30 2c 28 22 65 71 75 61 6c 69  E(0x100,("equali
183d0 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a  ty scan regions:
183e0 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61 5b 31   %d\n", (int)a[1
183f0 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d 20  ]));.  *pnRow = 
18400 61 5b 31 5d 3b 0a 20 20 0a 20 20 72 65 74 75 72  a[1];.  .  retur
18410 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
18420 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
18430 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a  STAT3_OR_STAT4 *
18440 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
18450 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
18460 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT4./*.** Est
18470 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
18480 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
18490 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
184a0 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e  ased on.** an IN
184b0 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72   constraint wher
184c0 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  e the right-hand
184d0 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20   side of the IN 
184e0 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61  operator.** is a
184f0 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e   list of values.
18500 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a    Example:.**.**
18510 20 20 20 20 20 20 20 20 57 48 45 52 45 20 78 20          WHERE x 
18520 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a  IN (1,2,3,4).**.
18530 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
18540 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
18550 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
18560 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18570 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
18580 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
18590 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
185a0 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
185b0 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
185c0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
185d0 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
185e0 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
185f0 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
18600 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
18610 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
18620 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
18630 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
18640 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
18650 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
18660 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
18670 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
18680 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
18690 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
186a0 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
186b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
186c0 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28   whereInScanEst(
186d0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
186e0 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
186f0 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
18700 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
18710 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
18720 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
18730 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
18740 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75       /* The valu
18750 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48  e list on the RH
18760 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76  S of "x IN (v1,v
18770 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20  2,v3,...)" */.  
18780 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20  tRowcnt *pnRow  
18790 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
187a0 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73  e revised row es
187b0 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29  timate here */.)
187c0 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70  {.  Index *p = p
187d0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
187e0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
187f0 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d   int nRecValid =
18800 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
18810 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  alid;.  int rc =
18820 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
18830 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
18840 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
18850 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20  tRowcnt nEst;   
18860 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18870 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20  r of rows for a 
18880 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20  single term */. 
18890 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74   tRowcnt nRowEst
188a0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20   = 0;    /* New 
188b0 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
188c0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a  number of rows *
188d0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
188e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
188f0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
18900 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
18910 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72  mple!=0 );.  for
18920 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
18930 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e  _OK && i<pList->
18940 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
18950 20 6e 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77   nEst = p->aiRow
18960 45 73 74 5b 30 5d 3b 0a 20 20 20 20 72 63 20 3d  Est[0];.    rc =
18970 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
18980 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c  st(pParse, pBuil
18990 64 65 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  der, pList->a[i]
189a0 2e 70 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a  .pExpr, &nEst);.
189b0 20 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e      nRowEst += n
189c0 45 73 74 3b 0a 20 20 20 20 70 42 75 69 6c 64 65  Est;.    pBuilde
189d0 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
189e0 52 65 63 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20  RecValid;.  }.. 
189f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18a00 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52  OK ){.    if( nR
18a10 6f 77 45 73 74 20 3e 20 70 2d 3e 61 69 52 6f 77  owEst > p->aiRow
18a20 45 73 74 5b 30 5d 20 29 20 6e 52 6f 77 45 73 74  Est[0] ) nRowEst
18a30 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30   = p->aiRowEst[0
18a40 5d 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20  ];.    *pnRow = 
18a50 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48 45  nRowEst;.    WHE
18a60 52 45 54 52 41 43 45 28 30 78 31 30 30 2c 28 22  RETRACE(0x100,("
18a70 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a  IN row estimate:
18a80 20 65 73 74 3d 25 67 5c 6e 22 2c 20 6e 52 6f 77   est=%g\n", nRow
18a90 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73  Est));.  }.  ass
18aa0 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e  ert( pBuilder->n
18ab0 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56 61  RecValid==nRecVa
18ac0 6c 69 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  lid );.  return 
18ad0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
18ae0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
18af0 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
18b00 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61  ./*.** Disable a
18b10 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
18b20 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65  RE clause.  Exce
18b30 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62  pt, do not disab
18b40 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69  le the term.** i
18b50 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20  f it controls a 
18b60 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
18b70 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f  and it did not o
18b80 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20  riginate in the 
18b90 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63  ON.** or USING c
18ba0 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f  lause of that jo
18bb0 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64  in..**.** Consid
18bc0 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a  er the term t2.z
18bd0 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c  ='ok' in the fol
18be0 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a  lowing queries:.
18bf0 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c  **.**   (1)  SEL
18c00 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
18c10 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
18c20 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32  .a=t2.x WHERE t2
18c30 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29  .z='ok'.**   (2)
18c40 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
18c50 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
18c60 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44  ON t1.a=t2.x AND
18c70 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20   t2.z='ok'.**   
18c80 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (3)  SELECT * FR
18c90 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20  OM t1, t2 WHERE 
18ca0 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32  t1.a=t2.x AND t2
18cb0 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68  .z='ok'.**.** Th
18cc0 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64  e t2.z='ok' is d
18cd0 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69  isabled in the i
18ce0 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69 74  n (2) because it
18cf0 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69   originates.** i
18d00 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e  n the ON clause.
18d10 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64 69    The term is di
18d20 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65  sabled in (3) be
18d30 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20  cause it is not 
18d40 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46  part.** of a LEF
18d50 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49  T OUTER JOIN.  I
18d60 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20  n (1), the term 
18d70 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e  is not disabled.
18d80 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67  .**.** Disabling
18d90 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20 74   a term causes t
18da0 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20  hat term to not 
18db0 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68 65  be tested in the
18dc0 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f   inner loop.** o
18dd0 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73  f the join.  Dis
18de0 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74  abling is an opt
18df0 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e  imization.  When
18e00 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69 73   terms are satis
18e10 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63  fied.** by indic
18e20 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74  es, we disable t
18e30 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72  hem to prevent r
18e40 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69  edundant tests i
18e50 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c  n the inner.** l
18e60 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67  oop.  We would g
18e70 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  et the correct r
18e80 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e  esults if nothin
18e90 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73 61  g were ever disa
18ea0 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69  bled,.** but joi
18eb0 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c  ns might run a l
18ec0 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54  ittle slower.  T
18ed0 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64  he trick is to d
18ee0 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a  isable as much.*
18ef0 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68  * as we can with
18f00 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f  out disabling to
18f10 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64  o much.  If we d
18f20 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20  isabled in (1), 
18f30 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20  we'd get.** the 
18f40 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53  wrong answer.  S
18f50 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a  ee ticket #813..
18f60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
18f70 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65  isableTerm(Where
18f80 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57  Level *pLevel, W
18f90 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29  hereTerm *pTerm)
18fa0 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20 20  {.  if( pTerm.  
18fb0 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77      && (pTerm->w
18fc0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
18fd0 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26  DED)==0.      &&
18fe0 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a   (pLevel->iLeftJ
18ff0 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61  oin==0 || ExprHa
19000 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
19010 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
19020 6f 69 6e 29 29 0a 20 20 20 20 20 20 26 26 20 28  oin)).      && (
19030 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
19040 20 26 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   & pTerm->prereq
19050 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  All)==0.  ){.   
19060 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
19070 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
19080 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50     if( pTerm->iP
19090 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20  arent>=0 ){.    
190a0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74    WhereTerm *pOt
190b0 68 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57  her = &pTerm->pW
190c0 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72  C->a[pTerm->iPar
190d0 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ent];.      if( 
190e0 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c  (--pOther->nChil
190f0 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  d)==0 ){.       
19100 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
19110 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20  vel, pOther);.  
19120 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
19130 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
19140 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63   OP_Affinity opc
19150 6f 64 65 20 74 6f 20 61 70 70 6c 79 20 74 68 65  ode to apply the
19160 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   column affinity
19170 20 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20   string zAff.** 
19180 74 6f 20 74 68 65 20 6e 20 72 65 67 69 73 74 65  to the n registe
19190 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 62  rs starting at b
191a0 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61  ase. .**.** As a
191b0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  n optimization, 
191c0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
191d0 65 6e 74 72 69 65 73 20 28 77 68 69 63 68 20 61  entries (which a
191e0 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68  re no-ops) at th
191f0 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61  e.** beginning a
19200 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66 66 20 61  nd end of zAff a
19210 72 65 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20  re ignored.  If 
19220 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 7a  all entries in z
19230 41 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54  Aff are.** SQLIT
19240 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e  E_AFF_NONE, then
19250 20 6e 6f 20 63 6f 64 65 20 67 65 74 73 20 67 65   no code gets ge
19260 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  nerated..**.** T
19270 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
19280 73 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  s its own copy o
19290 66 20 7a 41 66 66 20 73 6f 20 74 68 61 74 20 74  f zAff so that t
192a0 68 65 20 63 61 6c 6c 65 72 20 69 73 20 66 72 65  he caller is fre
192b0 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a  e.** to modify z
192c0 41 66 66 20 61 66 74 65 72 20 74 68 69 73 20 72  Aff after this r
192d0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a  outine returns..
192e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
192f0 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
19300 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
19310 69 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c  int base, int n,
19320 20 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20   char *zAff){.  
19330 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
19340 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 7a  ->pVdbe;.  if( z
19350 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Aff==0 ){.    as
19360 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
19370 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
19380 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
19390 7d 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  }.  assert( v!=0
193a0 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74   );..  /* Adjust
193b0 20 62 61 73 65 20 61 6e 64 20 6e 20 74 6f 20 73   base and n to s
193c0 6b 69 70 20 6f 76 65 72 20 53 51 4c 49 54 45 5f  kip over SQLITE_
193d0 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73  AFF_NONE entries
193e0 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
193f0 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f  g.  ** and end o
19400 66 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  f the affinity s
19410 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68  tring..  */.  wh
19420 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41 66 66  ile( n>0 && zAff
19430 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  [0]==SQLITE_AFF_
19440 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b  NONE ){.    n--;
19450 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20  .    base++;.   
19460 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77   zAff++;.  }.  w
19470 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 41 66  hile( n>1 && zAf
19480 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41  f[n-1]==SQLITE_A
19490 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e  FF_NONE ){.    n
194a0 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  --;.  }..  /* Co
194b0 64 65 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69  de the OP_Affini
194c0 74 79 20 6f 70 63 6f 64 65 20 69 66 20 74 68 65  ty opcode if the
194d0 72 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6c  re is anything l
194e0 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20  eft to do. */.  
194f0 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73  if( n>0 ){.    s
19500 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19510 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c  (v, OP_Affinity,
19520 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73   base, n);.    s
19530 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
19540 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66 66 2c 20  P4(v, -1, zAff, 
19550 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  n);.    sqlite3E
19560 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
19570 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62  Change(pParse, b
19580 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a  ase, n);.  }.}..
19590 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
195a0 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
195b0 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
195c0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
195d0 75 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74  use.  An equalit
195e0 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65  y.** term can be
195f0 20 65 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f   either X=expr o
19600 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20  r X IN (...).   
19610 70 54 65 72 6d 20 69 73 20 74 68 65 20 74 65 72  pTerm is the ter
19620 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65  m to be .** code
19630 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72  d..**.** The cur
19640 72 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rent value for t
19650 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
19660 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65   left in registe
19670 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f  r iReg..**.** Fo
19680 72 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  r a constraint o
19690 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70  f the form X=exp
196a0 72 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  r, the expressio
196b0 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61  n is evaluated a
196c0 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74  nd its.** result
196d0 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20   is left on the 
196e0 73 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73  stack.  For cons
196f0 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66  traints of the f
19700 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a  orm X IN (...).*
19710 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * this routine s
19720 65 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68  ets up a loop th
19730 61 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20  at will iterate 
19740 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20  over all values 
19750 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  of X..*/.static 
19760 69 6e 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79  int codeEquality
19770 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
19780 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54  Parse,      /* T
19790 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
197a0 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
197b0 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54  m *pTerm,   /* T
197c0 68 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  he term of the W
197d0 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
197e0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65  e coded */.  Whe
197f0 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
19800 20 2f 2a 20 54 68 65 20 6c 65 76 65 6c 20 6f 66   /* The level of
19810 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19820 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
19830 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 45 71 2c  on */.  int iEq,
19840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
19850 6e 64 65 78 20 6f 66 20 74 68 65 20 65 71 75 61  ndex of the equa
19860 6c 69 74 79 20 74 65 72 6d 20 77 69 74 68 69 6e  lity term within
19870 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20   this level */. 
19880 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20   int bRev,      
19890 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
198a0 20 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20 49   reverse-order I
198b0 4e 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a  N operations */.
198c0 20 20 69 6e 74 20 69 54 61 72 67 65 74 20 20 20    int iTarget   
198d0 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74        /* Attempt
198e0 20 74 6f 20 6c 65 61 76 65 20 72 65 73 75 6c 74   to leave result
198f0 73 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  s in this regist
19900 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  er */.){.  Expr 
19910 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
19920 70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  pr;.  Vdbe *v = 
19930 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
19940 20 69 6e 74 20 69 52 65 67 3b 20 20 20 20 20 20   int iReg;      
19950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
19960 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
19970 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73  results */..  as
19980 73 65 72 74 28 20 69 54 61 72 67 65 74 3e 30 20  sert( iTarget>0 
19990 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d  );.  if( pX->op=
199a0 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69 52  =TK_EQ ){.    iR
199b0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
199c0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
199d0 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69  e, pX->pRight, i
199e0 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65  Target);.  }else
199f0 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
19a00 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52  ISNULL ){.    iR
19a10 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20  eg = iTarget;.  
19a20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19a30 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
19a40 30 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65  0, iReg);.#ifnde
19a50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
19a60 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a  BQUERY.  }else{.
19a70 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20      int eType;. 
19a80 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20     int iTab;.   
19a90 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a   struct InLoop *
19aa0 70 49 6e 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f  pIn;.    WhereLo
19ab0 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70 4c 65 76  op *pLoop = pLev
19ac0 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20  el->pWLoop;..   
19ad0 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
19ae0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
19af0 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 0a 20 20  TUALTABLE)==0.  
19b00 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e      && pLoop->u.
19b10 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 0a  btree.pIndex!=0.
19b20 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e        && pLoop->
19b30 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
19b40 61 53 6f 72 74 4f 72 64 65 72 5b 69 45 71 5d 0a  aSortOrder[iEq].
19b50 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73      ){.      tes
19b60 74 63 61 73 65 28 20 69 45 71 3d 3d 30 20 29 3b  tcase( iEq==0 );
19b70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19b80 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62   bRev );.      b
19b90 52 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20  Rev = !bRev;.   
19ba0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
19bb0 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  X->op==TK_IN );.
19bc0 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67      iReg = iTarg
19bd0 65 74 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20  et;.    eType = 
19be0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
19bf0 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20 30  ex(pParse, pX, 0
19c00 29 3b 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  );.    if( eType
19c10 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  ==IN_INDEX_INDEX
19c20 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 74  _DESC ){.      t
19c30 65 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b  estcase( bRev );
19c40 0a 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62  .      bRev = !b
19c50 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Rev;.    }.    i
19c60 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  Tab = pX->iTable
19c70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19c80 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20  eAddOp2(v, bRev 
19c90 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52  ? OP_Last : OP_R
19ca0 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b  ewind, iTab, 0);
19cb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c  .    assert( (pL
19cc0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
19cd0 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d  HERE_MULTI_OR)==
19ce0 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  0 );.    pLoop->
19cf0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
19d00 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20 20 20 69 66  _IN_ABLE;.    if
19d10 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  ( pLevel->u.in.n
19d20 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  In==0 ){.      p
19d30 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d  Level->addrNxt =
19d40 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
19d50 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a  Label(v);.    }.
19d60 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e      pLevel->u.in
19d70 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76  .nIn++;.    pLev
19d80 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
19d90 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65   =.       sqlite
19da0 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
19db0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65  (pParse->db, pLe
19dc0 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
19dd0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
19de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19df0 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e   sizeof(pLevel->
19e00 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29  u.in.aInLoop[0])
19e10 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49  *pLevel->u.in.nI
19e20 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c  n);.    pIn = pL
19e30 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
19e40 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20  op;.    if( pIn 
19e50 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20  ){.      pIn += 
19e60 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
19e70 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d   - 1;.      pIn-
19e80 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20  >iCur = iTab;.  
19e90 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49      if( eType==I
19ea0 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b  N_INDEX_ROWID ){
19eb0 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64  .        pIn->ad
19ec0 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65  drInTop = sqlite
19ed0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19ee0 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69  P_Rowid, iTab, i
19ef0 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
19f00 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e  e{.        pIn->
19f10 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69  addrInTop = sqli
19f20 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19f30 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
19f40 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  , 0, iReg);.    
19f50 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 2d 3e 65    }.      pIn->e
19f60 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62 52 65 76  EndLoopOp = bRev
19f70 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f   ? OP_Prev : OP_
19f80 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
19f90 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
19fa0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67   OP_IsNull, iReg
19fb0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
19fc0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e      pLevel->u.in
19fd0 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  .nIn = 0;.    }.
19fe0 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73  #endif.  }.  dis
19ff0 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
1a000 20 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72   pTerm);.  retur
1a010 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iReg;.}../*.**
1a020 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1a030 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
1a040 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20  e all == and IN 
1a050 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20  constraints for 
1a060 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a  an.** index..**.
1a070 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1a080 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74  consider table t
1a090 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77  1(a,b,c,d,e,f) w
1a0a0 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62  ith index i1(a,b
1a0b0 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ,c)..** Suppose 
1a0c0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1a0d0 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20   is this:  a==5 
1a0e0 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29  AND b IN (1,2,3)
1a0f0 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31   AND c>5 AND c<1
1a100 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68  0.** The index h
1a110 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68  as as many as th
1a120 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ree equality con
1a130 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e  straints, but in
1a140 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65   this.** example
1a150 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20  , the third "c" 
1a160 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71  value is an ineq
1a170 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79  uality.  So only
1a180 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61   two .** constra
1a190 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20  ints are coded. 
1a1a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
1a1b0 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  ll generate code
1a1c0 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20   to evaluate.** 
1a1d0 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31  a==5 and b IN (1
1a1e0 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72  ,2,3).  The curr
1a1f0 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61  ent values for a
1a200 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73   and b will be s
1a210 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73  tored.** in cons
1a220 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
1a230 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  s and the index 
1a240 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65 67  of the first reg
1a250 69 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65  ister is returne
1a260 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  d..**.** In the 
1a270 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45  example above nE
1a280 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20  q==2.  But this 
1a290 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  subroutine works
1a2a0 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a   for any value.*
1a2b0 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69  * of nEq includi
1a2c0 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30  ng 0.  If nEq==0
1a2d0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1a2e0 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70  s nearly a no-op
1a2f0 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68  ..** The only th
1a300 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61  ing it does is a
1a310 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76  llocate the pLev
1a320 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20  el->iMem memory 
1a330 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70  cell and.** comp
1a340 75 74 65 20 74 68 65 20 61 66 66 69 6e 69 74 79  ute the affinity
1a350 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
1a360 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61  his routine alwa
1a370 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74 20  ys allocates at 
1a380 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79  least one memory
1a390 20 63 65 6c 6c 20 61 6e 64 20 72 65 74 75 72 6e   cell and return
1a3a0 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f  s.** the index o
1a3b0 66 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65  f that memory ce
1a3c0 6c 6c 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61  ll. The code tha
1a3d0 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20  t.** calls this 
1a3e0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65  routine will use
1a3f0 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c   that memory cel
1a400 6c 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 74  l to store the t
1a410 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65  ermination.** ke
1a420 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c  y value of the l
1a430 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20  oop.  If one or 
1a440 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72  more IN operator
1a450 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a  s appear, then.*
1a460 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * this routine a
1a470 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69  llocates an addi
1a480 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72  tional nEq memor
1a490 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65  y cells for inte
1a4a0 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a  rnal.** use..**.
1a4b0 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
1a4c0 69 6e 67 2c 20 2a 70 7a 41 66 66 20 69 73 20 73  ing, *pzAff is s
1a4d0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
1a4e0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
1a4f0 6e 67 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20  ng a.** copy of 
1a500 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  the column affin
1a510 69 74 79 20 73 74 72 69 6e 67 20 6f 66 20 74 68  ity string of th
1a520 65 20 69 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65  e index allocate
1a530 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  d using.** sqlit
1a540 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78  e3DbMalloc(). Ex
1a550 63 65 70 74 2c 20 65 6e 74 72 69 65 73 20 69 6e  cept, entries in
1a560 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65   the copy of the
1a570 20 73 74 72 69 6e 67 20 61 73 73 6f 63 69 61 74   string associat
1a580 65 64 0a 2a 2a 20 77 69 74 68 20 65 71 75 61 6c  ed.** with equal
1a590 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
1a5a0 74 68 61 74 20 75 73 65 20 4e 4f 4e 45 20 61 66  that use NONE af
1a5b0 66 69 6e 69 74 79 20 61 72 65 20 73 65 74 20 74  finity are set t
1a5c0 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  o.** SQLITE_AFF_
1a5d0 4e 4f 4e 45 2e 20 54 68 69 73 20 69 73 20 74 6f  NONE. This is to
1a5e0 20 64 65 61 6c 20 77 69 74 68 20 53 51 4c 20 73   deal with SQL s
1a5f0 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f  uch as the follo
1a600 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  wing:.**.**   CR
1a610 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
1a620 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59  TEXT PRIMARY KEY
1a630 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  , b);.**   SELEC
1a640 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53  T ... FROM t1 AS
1a650 20 74 32 2c 20 74 31 20 57 48 45 52 45 20 74 31   t2, t1 WHERE t1
1a660 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a  .a = t2.b;.**.**
1a670 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20   In the example 
1a680 61 62 6f 76 65 2c 20 74 68 65 20 69 6e 64 65 78  above, the index
1a690 20 6f 6e 20 74 31 28 61 29 20 68 61 73 20 54 45   on t1(a) has TE
1a6a0 58 54 20 61 66 66 69 6e 69 74 79 2e 20 42 75 74  XT affinity. But
1a6b0 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69   since.** the ri
1a6c0 67 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66  ght hand side of
1a6d0 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f   the equality co
1a6e0 6e 73 74 72 61 69 6e 74 20 28 74 32 2e 62 29 20  nstraint (t2.b) 
1a6f0 68 61 73 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74  has NONE affinit
1a700 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73  y,.** no convers
1a710 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ion should be at
1a720 74 65 6d 70 74 65 64 20 62 65 66 6f 72 65 20 75  tempted before u
1a730 73 69 6e 67 20 61 20 74 32 2e 62 20 76 61 6c 75  sing a t2.b valu
1a740 65 20 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20  e as part of.** 
1a750 61 20 6b 65 79 20 74 6f 20 73 65 61 72 63 68 20  a key to search 
1a760 74 68 65 20 69 6e 64 65 78 2e 20 48 65 6e 63 65  the index. Hence
1a770 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
1a780 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  in the returned 
1a790 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69  affinity.** stri
1a7a0 6e 67 20 69 6e 20 74 68 69 73 20 65 78 61 6d 70  ng in this examp
1a7b0 6c 65 20 77 6f 75 6c 64 20 62 65 20 73 65 74 20  le would be set 
1a7c0 74 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  to SQLITE_AFF_NO
1a7d0 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NE..*/.static in
1a7e0 74 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74  t codeAllEqualit
1a7f0 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20  yTerms(.  Parse 
1a800 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
1a810 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1a820 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  xt */.  WhereLev
1a830 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a  el *pLevel,   /*
1a840 20 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c 6f   Which nested lo
1a850 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 77  op of the FROM w
1a860 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a  e are coding */.
1a870 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20    int bRev,     
1a880 20 20 20 20 20 20 20 20 2f 2a 20 52 65 76 65 72          /* Rever
1a890 73 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  se the order of 
1a8a0 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  IN operators */.
1a8b0 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 2c    int nExtraReg,
1a8c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a8d0 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
1a8e0 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ters to allocate
1a8f0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41   */.  char **pzA
1a900 66 66 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ff          /* O
1a910 55 54 3a 20 53 65 74 20 74 6f 20 70 6f 69 6e 74  UT: Set to point
1a920 20 74 6f 20 61 66 66 69 6e 69 74 79 20 73 74 72   to affinity str
1a930 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ing */.){.  int 
1a940 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
1a950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a960 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   number of == or
1a970 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
1a980 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62  to code */.  Vdb
1a990 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1a9a0 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
1a9b0 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e vm under const
1a9c0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  ruction */.  Ind
1a9d0 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
1a9e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a9f0 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73  e index being us
1aa00 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70  ed for this loop
1aa10 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
1aa20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
1aa30 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
1aa40 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20  constraint term 
1aa50 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
1aa60 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
1aa70 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
1aa80 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
1aa90 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
1aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aab0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1aac0 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aae0 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
1aaf0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b  r */.  int nReg;
1ab00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab10 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ab20 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61  f registers to a
1ab30 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61  llocate */.  cha
1ab40 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20 20  r *zAff;        
1ab50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
1ab60 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f  finity string to
1ab70 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a   return */..  /*
1ab80 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20   This module is 
1ab90 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71  only called on q
1aba0 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20  uery plans that 
1abb0 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f  use an index. */
1abc0 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
1abd0 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61 73 73  l->pWLoop;.  ass
1abe0 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
1abf0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
1ac00 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b  TUALTABLE)==0 );
1ac10 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  .  nEq = pLoop->
1ac20 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 70  u.btree.nEq;.  p
1ac30 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
1ac40 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 61  tree.pIndex;.  a
1ac50 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29  ssert( pIdx!=0 )
1ac60 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
1ac70 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f  ut how many memo
1ac80 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c  ry cells we will
1ac90 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63   need then alloc
1aca0 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20  ate them..  */. 
1acb0 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73   regBase = pPars
1acc0 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e  e->nMem + 1;.  n
1acd0 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Reg = pLoop->u.b
1ace0 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45 78 74 72  tree.nEq + nExtr
1acf0 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  aReg;.  pParse->
1ad00 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20  nMem += nReg;.. 
1ad10 20 7a 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44   zAff = sqlite3D
1ad20 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e  bStrDup(pParse->
1ad30 64 62 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78  db, sqlite3Index
1ad40 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70  AffinityStr(v, p
1ad50 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41  Idx));.  if( !zA
1ad60 66 66 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  ff ){.    pParse
1ad70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1ad80 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  ed = 1;.  }..  /
1ad90 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
1ada0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1adb0 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
1adc0 74 28 20 7a 41 66 66 3d 3d 30 20 7c 7c 20 28 69  t( zAff==0 || (i
1add0 6e 74 29 73 74 72 6c 65 6e 28 7a 41 66 66 29 3e  nt)strlen(zAff)>
1ade0 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d  =nEq );.  for(j=
1adf0 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a  0; j<nEq; j++){.
1ae00 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20      int r1;.    
1ae10 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61  pTerm = pLoop->a
1ae20 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61 73  LTerm[j];.    as
1ae30 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
1ae40 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ;.    /* The fol
1ae50 6c 6f 77 69 6e 67 20 74 72 75 65 20 66 6f 72 20  lowing true for 
1ae60 69 6e 64 69 63 65 73 20 77 69 74 68 20 72 65 64  indices with red
1ae70 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20  undant columns. 
1ae80 0a 20 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41  .    ** Ex: CREA
1ae90 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
1aea0 31 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54  1(a,b,a); SELECT
1aeb0 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
1aec0 20 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f   a=0 AND b=0; */
1aed0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
1aee0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1aef0 20 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20   TERM_CODED)!=0 
1af00 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1af10 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
1af20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1af30 3b 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45  ;.    r1 = codeE
1af40 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
1af50 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65  se, pTerm, pLeve
1af60 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 72 65 67 42  l, j, bRev, regB
1af70 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20  ase+j);.    if( 
1af80 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b  r1!=regBase+j ){
1af90 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d  .      if( nReg=
1afa0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
1afb0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1afc0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 42  Reg(pParse, regB
1afd0 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ase);.        re
1afe0 67 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20  gBase = r1;.    
1aff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b000 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b010 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
1b020 72 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a  r1, regBase+j);.
1b030 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b040 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
1b050 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1b060 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
1b070 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
1b080 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1b090 49 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  IN );.    if( (p
1b0a0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1b0b0 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  & (WO_ISNULL|WO_
1b0c0 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  IN))==0 ){.     
1b0d0 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
1b0e0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
1b0f0 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  ight;.      sqli
1b100 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c  te3ExprCodeIsNul
1b110 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c  lJump(v, pRight,
1b120 20 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76   regBase+j, pLev
1b130 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
1b140 20 20 20 20 69 66 28 20 7a 41 66 66 20 29 7b 0a      if( zAff ){.
1b150 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1b160 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1b170 74 79 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b  ty(pRight, zAff[
1b180 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  j])==SQLITE_AFF_
1b190 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  NONE ){.        
1b1a0 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49    zAff[j] = SQLI
1b1b0 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
1b1c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1b1d0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65  f( sqlite3ExprNe
1b1e0 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
1b1f0 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66  nge(pRight, zAff
1b200 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [j]) ){.        
1b210 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49    zAff[j] = SQLI
1b220 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
1b230 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1b240 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66     }.  }.  *pzAf
1b250 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74 75  f = zAff;.  retu
1b260 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23  rn regBase;.}..#
1b270 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b280 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
1b290 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1b2a0 20 61 20 68 65 6c 70 65 72 20 66 6f 72 20 65 78   a helper for ex
1b2b0 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28  plainIndexRange(
1b2c0 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53  ) below.**.** pS
1b2d0 74 72 20 68 6f 6c 64 73 20 74 68 65 20 74 65 78  tr holds the tex
1b2e0 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
1b2f0 6f 6e 20 74 68 61 74 20 77 65 20 61 72 65 20 62  on that we are b
1b300 75 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65 20 74  uilding up one t
1b310 65 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65  erm.** at a time
1b320 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1b330 61 64 64 73 20 61 20 6e 65 77 20 74 65 72 6d 20  adds a new term 
1b340 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1b350 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  e expression..**
1b360 20 54 65 72 6d 73 20 61 72 65 20 73 65 70 61 72   Terms are separ
1b370 61 74 65 64 20 62 79 20 41 4e 44 20 73 6f 20 61  ated by AND so a
1b380 64 64 20 74 68 65 20 22 41 4e 44 22 20 74 65 78  dd the "AND" tex
1b390 74 20 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64  t for second and
1b3a0 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74   subsequent.** t
1b3b0 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74  erms only..*/.st
1b3c0 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
1b3d0 6e 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 53  nAppendTerm(.  S
1b3e0 74 72 41 63 63 75 6d 20 2a 70 53 74 72 2c 20 20  trAccum *pStr,  
1b3f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b400 65 20 74 65 78 74 20 65 78 70 72 65 73 73 69 6f  e text expressio
1b410 6e 20 62 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f  n being built */
1b420 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 20 20  .  int iTerm,   
1b430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b440 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 69 73 20  * Index of this 
1b450 74 65 72 6d 2e 20 20 46 69 72 73 74 20 69 73 20  term.  First is 
1b460 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  zero */.  const 
1b470 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20  char *zColumn,  
1b480 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1b490 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20   the column */. 
1b4a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
1b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b4c0 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 72  Name of the oper
1b4d0 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ator */.){.  if(
1b4e0 20 69 54 65 72 6d 20 29 20 73 71 6c 69 74 65 33   iTerm ) sqlite3
1b4f0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
1b500 53 74 72 2c 20 22 20 41 4e 44 20 22 2c 20 35 29  Str, " AND ", 5)
1b510 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
1b520 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
1b530 7a 43 6f 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20  zColumn, -1);.  
1b540 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
1b550 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c  ppend(pStr, zOp,
1b560 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74   1);.  sqlite3St
1b570 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
1b580 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f  r, "?", 1);.}../
1b590 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c  *.** Argument pL
1b5a0 65 76 65 6c 20 64 65 73 63 72 69 62 65 73 20 61  evel describes a
1b5b0 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 73 63   strategy for sc
1b5c0 61 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70 54 61  anning table pTa
1b5d0 62 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  b. This .** func
1b5e0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70  tion returns a p
1b5f0 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69  ointer to a stri
1b600 6e 67 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  ng buffer contai
1b610 6e 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ning a descripti
1b620 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62  on.** of the sub
1b630 73 65 74 20 6f 66 20 74 61 62 6c 65 20 72 6f 77  set of table row
1b640 73 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68 65  s scanned by the
1b650 20 73 74 72 61 74 65 67 79 20 69 6e 20 74 68 65   strategy in the
1b660 20 66 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53   form of an.** S
1b670 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 4f  QL expression. O
1b680 72 2c 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61  r, if all rows a
1b690 72 65 20 73 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c  re scanned, NULL
1b6a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
1b6b0 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
1b6c0 20 69 66 20 74 68 65 20 71 75 65 72 79 3a 0a 2a   if the query:.*
1b6d0 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  *.**   SELECT * 
1b6e0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
1b6f0 31 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a  1 AND b>2;.**.**
1b700 20 69 73 20 72 75 6e 20 61 6e 64 20 74 68 65 72   is run and ther
1b710 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e  e is an index on
1b720 20 28 61 2c 20 62 29 2c 20 74 68 65 6e 20 74 68   (a, b), then th
1b730 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1b740 72 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20  rns a.** string 
1b750 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a  similar to:.**.*
1b760 2a 20 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f  *   "a=? AND b>?
1b770 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ".**.** The retu
1b780 72 6e 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69  rned pointer poi
1b790 6e 74 73 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  nts to memory ob
1b7a0 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
1b7b0 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a  te3DbMalloc()..*
1b7c0 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  * It is the resp
1b7d0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
1b7e0 65 20 63 61 6c 6c 65 72 20 74 6f 20 66 72 65 65  e caller to free
1b7f0 20 74 68 65 20 62 75 66 66 65 72 20 77 68 65 6e   the buffer when
1b800 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e   it is.** no lon
1b810 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f  ger required..*/
1b820 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 65 78  .static char *ex
1b830 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28  plainIndexRange(
1b840 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
1b850 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 54  reLoop *pLoop, T
1b860 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49  able *pTab){.  I
1b870 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70  ndex *pIndex = p
1b880 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
1b890 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20  ndex;.  int nEq 
1b8a0 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
1b8b0 2e 6e 45 71 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  .nEq;.  int i, j
1b8c0 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  ;.  Column *aCol
1b8d0 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20   = pTab->aCol;. 
1b8e0 20 69 6e 74 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d   int *aiColumn =
1b8f0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
1b900 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 74 78  n;.  StrAccum tx
1b910 74 3b 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30  t;..  if( nEq==0
1b920 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
1b930 61 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d  ags & (WHERE_BTM
1b940 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
1b950 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29 7b 0a 20  _LIMIT))==0 ){. 
1b960 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1b970 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
1b980 75 6d 49 6e 69 74 28 26 74 78 74 2c 20 30 2c 20  umInit(&txt, 0, 
1b990 30 2c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  0, SQLITE_MAX_LE
1b9a0 4e 47 54 48 29 3b 0a 20 20 74 78 74 2e 64 62 20  NGTH);.  txt.db 
1b9b0 3d 20 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 53  = db;.  sqlite3S
1b9c0 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74  trAccumAppend(&t
1b9d0 78 74 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20 20  xt, " (", 2);.  
1b9e0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20  for(i=0; i<nEq; 
1b9f0 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  i++){.    char *
1ba00 7a 20 3d 20 28 69 3d 3d 70 49 6e 64 65 78 2d 3e  z = (i==pIndex->
1ba10 6e 43 6f 6c 75 6d 6e 20 29 20 3f 20 22 72 6f 77  nColumn ) ? "row
1ba20 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c  id" : aCol[aiCol
1ba30 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20  umn[i]].zName;. 
1ba40 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
1ba50 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c  Term(&txt, i, z,
1ba60 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a 20   "=");.  }..  j 
1ba70 3d 20 69 3b 0a 20 20 69 66 28 20 70 4c 6f 6f 70  = i;.  if( pLoop
1ba80 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
1ba90 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
1baa0 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70   char *z = (j==p
1bab0 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
1bac0 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f   ? "rowid" : aCo
1bad0 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  l[aiColumn[j]].z
1bae0 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69  Name;.    explai
1baf0 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
1bb00 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a  , i++, z, ">");.
1bb10 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d    }.  if( pLoop-
1bb20 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 54  >wsFlags&WHERE_T
1bb30 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
1bb40 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49  char *z = (j==pI
1bb50 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20  ndex->nColumn ) 
1bb60 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c  ? "rowid" : aCol
1bb70 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  [aiColumn[j]].zN
1bb80 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e  ame;.    explain
1bb90 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c  AppendTerm(&txt,
1bba0 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d   i, z, "<");.  }
1bbb0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
1bbc0 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22  umAppend(&txt, "
1bbd0 29 22 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e  )", 1);.  return
1bbe0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
1bbf0 46 69 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d 0a  Finish(&txt);.}.
1bc00 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1bc10 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
1bc20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74 6c 79  unless currently
1bc30 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20 45   processing an E
1bc40 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
1bc50 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49 66  N.** command. If
1bc60 20 74 68 65 20 71 75 65 72 79 20 62 65 69 6e 67   the query being
1bc70 20 63 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e 20   compiled is an 
1bc80 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
1bc90 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20  AN, a single.** 
1bca0 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64 20  record is added 
1bcb0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74 6f  to the output to
1bcc0 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74 61   describe the ta
1bcd0 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65 67  ble scan strateg
1bce0 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e  y in .** pLevel.
1bcf0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1bd00 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  explainOneScan(.
1bd10 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1bd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd30 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
1bd40 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
1bd50 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
1bd60 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1bd70 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20   list this loop 
1bd80 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57  refers to */.  W
1bd90 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
1bda0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
1bdb0 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20  * Scan to write 
1bdc0 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64  OP_Explain opcod
1bdd0 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  e for */.  int i
1bde0 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
1bdf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1be00 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20  lue for "level" 
1be10 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74  column of output
1be20 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
1be30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be40 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66        /* Value f
1be50 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e  or "from" column
1be60 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20   of output */.  
1be70 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20  u16 wctrlFlags  
1be80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be90 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
1bea0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
1beb0 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69  egin() */.){.  i
1bec0 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
1bed0 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 73 74 72  in==2 ){.    str
1bee0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1bef0 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
1bf00 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
1bf10 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20  From];.    Vdbe 
1bf20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1bf30 62 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62  be;      /* VM b
1bf40 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
1bf50 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20   */.    sqlite3 
1bf60 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1bf70 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
1bf80 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  e handle */.    
1bf90 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20  char *zMsg;     
1bfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bfb0 20 54 65 78 74 20 74 6f 20 61 64 64 20 74 6f 20   Text to add to 
1bfc0 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  EQP output */.  
1bfd0 20 20 69 6e 74 20 69 49 64 20 3d 20 70 50 61 72    int iId = pPar
1bfe0 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20 20  se->iSelectId;  
1bff0 2f 2a 20 53 65 6c 65 63 74 20 69 64 20 28 6c 65  /* Select id (le
1c000 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20 63  ft-most output c
1c010 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  olumn) */.    in
1c020 74 20 69 73 53 65 61 72 63 68 3b 20 20 20 20 20  t isSearch;     
1c030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c040 72 75 65 20 66 6f 72 20 61 20 53 45 41 52 43 48  rue for a SEARCH
1c050 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 43 41 4e  . False for SCAN
1c060 2e 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f  . */.    WhereLo
1c070 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
1c080 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
1c090 6e 74 72 6f 6c 6c 69 6e 67 20 57 68 65 72 65 4c  ntrolling WhereL
1c0a0 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
1c0b0 20 20 75 33 32 20 66 6c 61 67 73 3b 20 20 20 20    u32 flags;    
1c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0d0 2f 2a 20 46 6c 61 67 73 20 74 68 61 74 20 64 65  /* Flags that de
1c0e0 73 63 72 69 62 65 20 74 68 69 73 20 6c 6f 6f 70  scribe this loop
1c0f0 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70 20 3d   */..    pLoop =
1c100 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
1c110 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 70 4c 6f  .    flags = pLo
1c120 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20  op->wsFlags;.   
1c130 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52   if( (flags&WHER
1c140 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28  E_MULTI_OR) || (
1c150 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45  wctrlFlags&WHERE
1c160 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20  _ONETABLE_ONLY) 
1c170 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69  ) return;..    i
1c180 73 53 65 61 72 63 68 20 3d 20 28 66 6c 61 67 73  sSearch = (flags
1c190 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  &(WHERE_BTM_LIMI
1c1a0 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  T|WHERE_TOP_LIMI
1c1b0 54 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  T))!=0.         
1c1c0 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 26 57 48     || ((flags&WH
1c1d0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
1c1e0 29 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e  )==0 && (pLoop->
1c1f0 75 2e 62 74 72 65 65 2e 6e 45 71 3e 30 29 29 0a  u.btree.nEq>0)).
1c200 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
1c210 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52  wctrlFlags&(WHER
1c220 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48  E_ORDERBY_MIN|WH
1c230 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29  ERE_ORDERBY_MAX)
1c240 29 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73  );..    zMsg = s
1c250 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1c260 2c 20 22 25 73 22 2c 20 69 73 53 65 61 72 63 68  , "%s", isSearch
1c270 3f 22 53 45 41 52 43 48 22 3a 22 53 43 41 4e 22  ?"SEARCH":"SCAN"
1c280 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  );.    if( pItem
1c290 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
1c2a0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1c2b0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1c2c0 73 67 2c 20 22 25 73 20 53 55 42 51 55 45 52 59  sg, "%s SUBQUERY
1c2d0 20 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74 65 6d   %d", zMsg,pItem
1c2e0 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  ->iSelectId);.  
1c2f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
1c300 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1c310 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1c320 22 25 73 20 54 41 42 4c 45 20 25 73 22 2c 20 7a  "%s TABLE %s", z
1c330 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  Msg, pItem->zNam
1c340 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  e);.    }..    i
1c350 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  f( pItem->zAlias
1c360 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d   ){.      zMsg =
1c370 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1c380 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41  (db, zMsg, "%s A
1c390 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74  S %s", zMsg, pIt
1c3a0 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
1c3b0 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67   }.    if( (flag
1c3c0 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57  s & (WHERE_IPK|W
1c3d0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1c3e0 45 29 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 41  E))==0.     && A
1c3f0 4c 57 41 59 53 28 70 4c 6f 6f 70 2d 3e 75 2e 62  LWAYS(pLoop->u.b
1c400 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 29 0a  tree.pIndex!=0).
1c410 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61      ){.      cha
1c420 72 20 2a 7a 57 68 65 72 65 20 3d 20 65 78 70 6c  r *zWhere = expl
1c430 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 64 62  ainIndexRange(db
1c440 2c 20 70 4c 6f 6f 70 2c 20 70 49 74 65 6d 2d 3e  , pLoop, pItem->
1c450 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d 73  pTab);.      zMs
1c460 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
1c470 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 0a 20 20  ndf(db, zMsg,.  
1c480 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 66               ((f
1c490 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
1c4a0 4f 5f 49 4e 44 45 58 29 20 3f 20 0a 20 20 20 20  O_INDEX) ? .    
1c4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1c4c0 25 73 20 55 53 49 4e 47 20 41 55 54 4f 4d 41 54  %s USING AUTOMAT
1c4d0 49 43 20 25 73 49 4e 44 45 58 25 2e 30 73 25 73  IC %sINDEX%.0s%s
1c4e0 22 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  " :.            
1c4f0 20 20 20 20 20 20 20 22 25 73 20 55 53 49 4e 47         "%s USING
1c500 20 25 73 49 4e 44 45 58 20 25 73 25 73 22 29 2c   %sINDEX %s%s"),
1c510 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1c520 20 7a 4d 73 67 2c 20 28 28 66 6c 61 67 73 20 26   zMsg, ((flags &
1c530 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
1c540 20 3f 20 22 43 4f 56 45 52 49 4e 47 20 22 20 3a   ? "COVERING " :
1c550 20 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20   ""),.          
1c560 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
1c570 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
1c580 65 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20  e, zWhere);.    
1c590 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1c5a0 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20  db, zWhere);.   
1c5b0 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67   }else if( (flag
1c5c0 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d  s & WHERE_IPK)!=
1c5d0 30 20 26 26 20 28 66 6c 61 67 73 20 26 20 57 48  0 && (flags & WH
1c5e0 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21  ERE_CONSTRAINT)!
1c5f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  =0 ){.      zMsg
1c600 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1c610 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1c620 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50   USING INTEGER P
1c630 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73  RIMARY KEY", zMs
1c640 67 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 66  g);..      if( f
1c650 6c 61 67 73 26 28 57 48 45 52 45 5f 43 4f 4c 55  lags&(WHERE_COLU
1c660 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55  MN_EQ|WHERE_COLU
1c670 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20 20  MN_IN) ){.      
1c680 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1c690 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1c6a0 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3d 3f 29  g, "%s (rowid=?)
1c6b0 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
1c6c0 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73  }else if( (flags
1c6d0 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49  &WHERE_BOTH_LIMI
1c6e0 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c  T)==WHERE_BOTH_L
1c6f0 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20  IMIT ){.        
1c700 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1c710 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1c720 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 20 41 4e   "%s (rowid>? AN
1c730 44 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73  D rowid<?)", zMs
1c740 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
1c750 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f  if( flags&WHERE_
1c760 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
1c770 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1c780 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1c790 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64  zMsg, "%s (rowid
1c7a0 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  >?)", zMsg);.   
1c7b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57     }else if( ALW
1c7c0 41 59 53 28 66 6c 61 67 73 26 57 48 45 52 45 5f  AYS(flags&WHERE_
1c7d0 54 4f 50 5f 4c 49 4d 49 54 29 20 29 7b 0a 20 20  TOP_LIMIT) ){.  
1c7e0 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1c7f0 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1c800 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
1c810 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d<?)", zMsg);.  
1c820 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e      }.    }.#ifn
1c830 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c840 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
1c850 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73   else if( (flags
1c860 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
1c870 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20  TABLE)!=0 ){.   
1c880 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1c890 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1c8a0 73 67 2c 20 22 25 73 20 56 49 52 54 55 41 4c 20  sg, "%s VIRTUAL 
1c8b0 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25  TABLE INDEX %d:%
1c8c0 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20  s", zMsg,.      
1c8d0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
1c8e0 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
1c8f0 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  , pLoop->u.vtab.
1c900 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23  idxStr);.    }.#
1c910 65 6e 64 69 66 0a 20 20 20 20 7a 4d 73 67 20 3d  endif.    zMsg =
1c920 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1c930 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 22 2c  (db, zMsg, "%s",
1c940 20 7a 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69   zMsg);.    sqli
1c950 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1c960 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64   OP_Explain, iId
1c970 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c  , iLevel, iFrom,
1c980 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
1c990 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  C);.  }.}.#else.
1c9a0 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
1c9b0 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c  OneScan(u,v,w,x,
1c9c0 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  y,z).#endif /* S
1c9d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
1c9e0 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  IN */.../*.** Ge
1c9f0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1ca00 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1ca10 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20   iLevel-th loop 
1ca20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
1ca30 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  use.** implement
1ca40 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ation described 
1ca50 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74  by pWInfo..*/.st
1ca60 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64  atic Bitmask cod
1ca70 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20  eOneLoopStart(. 
1ca80 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
1ca90 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74  fo,   /* Complet
1caa0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  e information ab
1cab0 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63 6c  out the WHERE cl
1cac0 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
1cad0 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  evel,          /
1cae0 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66  * Which level of
1caf0 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f   pWInfo->a[] sho
1cb00 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a  uld be coded */.
1cb10 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
1cb20 64 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20  dy     /* Which 
1cb30 74 61 62 6c 65 73 20 61 72 65 20 63 75 72 72 65  tables are curre
1cb40 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a  ntly available *
1cb50 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b  /.){.  int j, k;
1cb60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1cb70 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
1cb80 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
1cb90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
1cba0 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
1cbb0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
1cbc0 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20   addrNxt;       
1cbd0 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75    /* Where to ju
1cbe0 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  mp to continue w
1cbf0 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20  ith the next IN 
1cc00 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d  case */.  int om
1cc10 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f  itTable;       /
1cc20 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73 65  * True if we use
1cc30 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20   the index only 
1cc40 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20  */.  int bRev;  
1cc50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1cc60 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
1cc70 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20  scan in reverse 
1cc80 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65  order */.  Where
1cc90 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
1cca0 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65 76  /* The where lev
1ccb0 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  el to be coded *
1ccc0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
1ccd0 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65 20  Loop;    /* The 
1cce0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1ccf0 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
1cd00 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
1cd10 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70  WC;    /* Decomp
1cd20 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65  osition of the e
1cd30 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c 61 75  ntire WHERE clau
1cd40 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
1cd50 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
1cd60 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45          /* A WHE
1cd70 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a  RE clause term *
1cd80 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
1cd90 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1cda0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1cdb0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
1cdc0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
1cdd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1cde0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1cdf0 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  on */.  Vdbe *v;
1ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1ce20 72 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64  repared stmt und
1ce30 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73  er constructions
1ce40 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
1ce50 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
1ce60 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  tem;  /* FROM cl
1ce70 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20  ause term being 
1ce80 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  coded */.  int a
1ce90 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20  ddrBrk;         
1cea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
1ceb0 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
1cec0 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
1ced0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
1cee0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
1cef0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
1cf00 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
1cf10 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  ith next cycle *
1cf20 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65  /.  int iRowidRe
1cf30 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  g = 0;        /*
1cf40 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64   Rowid is stored
1cf50 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
1cf60 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a  r, if not zero *
1cf70 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65  /.  int iRelease
1cf80 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Reg = 0;      /*
1cf90 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 74   Temp register t
1cfa0 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20 72 65  o free before re
1cfb0 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50  turning */..  pP
1cfc0 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
1cfd0 50 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61  Parse;.  v = pPa
1cfe0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57  rse->pVdbe;.  pW
1cff0 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
1d000 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
1d010 3e 64 62 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20  >db;.  pLevel = 
1d020 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65  &pWInfo->a[iLeve
1d030 6c 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  l];.  pLoop = pL
1d040 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
1d050 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e  pTabItem = &pWIn
1d060 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
1d070 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
1d080 20 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65    iCur = pTabIte
1d090 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 4c  m->iCursor;.  pL
1d0a0 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 3d  evel->notReady =
1d0b0 20 6e 6f 74 52 65 61 64 79 20 26 20 7e 67 65 74   notReady & ~get
1d0c0 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
1d0d0 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20  askSet, iCur);. 
1d0e0 20 62 52 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d   bRev = (pWInfo-
1d0f0 3e 72 65 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c  >revMask>>iLevel
1d100 29 26 31 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65  )&1;.  omitTable
1d110 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61   = (pLoop->wsFla
1d120 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
1d130 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20  NLY)!=0 .       
1d140 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
1d150 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1d160 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d  RE_FORCE_TABLE)=
1d170 3d 30 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f  =0;.  VdbeNoopCo
1d180 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
1d190 20 4a 6f 69 6e 20 4c 6f 6f 70 20 25 64 22 2c 20   Join Loop %d", 
1d1a0 69 4c 65 76 65 6c 29 29 3b 0a 0a 20 20 2f 2a 20  iLevel));..  /* 
1d1b0 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f  Create labels fo
1d1c0 72 20 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e  r the "break" an
1d1d0 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73  d "continue" ins
1d1e0 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66  tructions.  ** f
1d1f0 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  or the current l
1d200 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64  oop.  Jump to ad
1d210 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f  drBrk to break o
1d220 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20  ut of a loop..  
1d230 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20  ** Jump to cont 
1d240 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c  to go immediatel
1d250 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74  y to the next it
1d260 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  eration of the. 
1d270 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20   ** loop..  **. 
1d280 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69   ** When there i
1d290 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  s an IN operator
1d2a0 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61  , we also have a
1d2b0 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c   "addrNxt" label
1d2c0 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73   that.  ** means
1d2d0 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
1d2e0 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61  h the next IN va
1d2f0 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e  lue combination.
1d300 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72    When.  ** ther
1d310 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72  e are no IN oper
1d320 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e  ators in the con
1d330 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22 61  straints, the "a
1d340 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20  ddrNxt" label.  
1d350 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ** is the same a
1d360 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a  s "addrBrk"..  *
1d370 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20 70 4c  /.  addrBrk = pL
1d380 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20  evel->addrBrk = 
1d390 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20  pLevel->addrNxt 
1d3a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1d3b0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64  eLabel(v);.  add
1d3c0 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  rCont = pLevel->
1d3d0 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74  addrCont = sqlit
1d3e0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1d3f0 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  v);..  /* If thi
1d400 73 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  s is the right t
1d410 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f  able of a LEFT O
1d420 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63  UTER JOIN, alloc
1d430 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69  ate and.  ** ini
1d440 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79  tialize a memory
1d450 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72   cell that recor
1d460 64 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  ds if this table
1d470 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 2a   matches any.  *
1d480 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66  * row of the lef
1d490 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  t table of the j
1d4a0 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  oin..  */.  if( 
1d4b0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20  pLevel->iFrom>0 
1d4c0 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e  && (pTabItem[0].
1d4d0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
1d4e0 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c  FT)!=0 ){.    pL
1d4f0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
1d500 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1d510 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1d520 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1d530 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c  teger, 0, pLevel
1d540 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
1d550 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1d560 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49  , "init LEFT JOI
1d570 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22  N no-match flag"
1d580 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  ));.  }..  /* Sp
1d590 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20  ecial case of a 
1d5a0 46 52 4f 4d 20 63 6c 61 75 73 65 20 73 75 62 71  FROM clause subq
1d5b0 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64  uery implemented
1d5c0 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65   as a co-routine
1d5d0 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 49 74   */.  if( pTabIt
1d5e0 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
1d5f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59   ){.    int regY
1d600 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d  ield = pTabItem-
1d610 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20  >regReturn;.    
1d620 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d630 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1d640 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46   pTabItem->addrF
1d650 69 6c 6c 53 75 62 2d 31 2c 20 72 65 67 59 69 65  illSub-1, regYie
1d660 6c 64 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ld);.    pLevel-
1d670 3e 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64  >p2 =  sqlite3Vd
1d680 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
1d690 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 29 3b  ield, regYield);
1d6a0 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
1d6b0 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f  ((v, "next row o
1d6c0 66 20 63 6f 2d 72 6f 75 74 69 6e 65 20 25 73 22  f co-routine %s"
1d6d0 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  , pTabItem->pTab
1d6e0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73  ->zName));.    s
1d6f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d700 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 59 69  (v, OP_If, regYi
1d710 65 6c 64 2b 31 2c 20 61 64 64 72 42 72 6b 29 3b  eld+1, addrBrk);
1d720 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1d730 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c  = OP_Goto;.  }el
1d740 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
1d750 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1d760 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 6f  ABLE.  if(  (pLo
1d770 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1d780 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
1d790 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43  )!=0 ){.    /* C
1d7a0 61 73 65 20 31 3a 20 20 54 68 65 20 74 61 62 6c  ase 1:  The tabl
1d7b0 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74  e is a virtual-t
1d7c0 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56  able.  Use the V
1d7d0 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74  Filter and VNext
1d7e0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1d7f0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
1d800 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
1d810 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50  int iReg;   /* P
1d820 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56  3 Value for OP_V
1d830 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  Filter */.    in
1d840 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a  t addrNotFound;.
1d850 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61      int nConstra
1d860 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54  int = pLoop->nLT
1d870 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  erm;..    sqlite
1d880 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1d890 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67  Parse);.    iReg
1d8a0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1d8b0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
1d8c0 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20  Constraint+2);. 
1d8d0 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20     addrNotFound 
1d8e0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  = pLevel->addrBr
1d8f0 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  k;.    for(j=0; 
1d900 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a  j<nConstraint; j
1d910 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
1d920 54 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a 2b  Target = iReg+j+
1d930 32 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  2;.      pTerm =
1d940 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1d950 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ];.      if( pTe
1d960 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  rm==0 ) continue
1d970 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
1d980 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1d990 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  O_IN ){.        
1d9a0 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
1d9b0 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
1d9c0 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c  pLevel, j, bRev,
1d9d0 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20   iTarget);.     
1d9e0 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20     addrNotFound 
1d9f0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
1da00 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
1da10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1da20 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1da30 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
1da40 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a  ight, iTarget);.
1da50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1da60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1da70 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1da80 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  r, pLoop->u.vtab
1da90 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a  .idxNum, iReg);.
1daa0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1dab0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1dac0 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ger, nConstraint
1dad0 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73  , iReg+1);.    s
1dae0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1daf0 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20  (v, OP_VFilter, 
1db00 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75  iCur, addrNotFou
1db10 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20 20  nd, iReg,.      
1db20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db30 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
1db40 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  xStr,.          
1db50 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
1db60 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
1db70 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20  ee ? P4_MPRINTF 
1db80 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  : P4_STATIC);.  
1db90 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
1dba0 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
1dbb0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f    for(j=0; j<nCo
1dbc0 6e 73 74 72 61 69 6e 74 20 26 26 20 6a 3c 31 36  nstraint && j<16
1dbd0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
1dbe0 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  ( (pLoop->u.vtab
1dbf0 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26 31 20  .omitMask>>j)&1 
1dc00 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  ){.        disab
1dc10 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
1dc20 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 29  Loop->aLTerm[j])
1dc30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1dc40 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1dc50 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70   OP_VNext;.    p
1dc60 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
1dc70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
1dc80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1dc90 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
1dca0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1dcb0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
1dcc0 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61  , iReg, nConstra
1dcd0 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69  int+2);.    sqli
1dce0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1dcf0 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65  pParse, 1);.  }e
1dd00 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
1dd10 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1dd20 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28  LTABLE */..  if(
1dd30 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1dd40 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30   & WHERE_IPK)!=0
1dd50 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77  .   && (pLoop->w
1dd60 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
1dd70 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f  COLUMN_IN|WHERE_
1dd80 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20  COLUMN_EQ))!=0. 
1dd90 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
1dda0 32 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63  2:  We can direc
1ddb0 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20  tly reference a 
1ddc0 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67  single row using
1ddd0 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   an.    **      
1dde0 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d      equality com
1ddf0 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20  parison against 
1de00 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e  the ROWID field.
1de10 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20    Or.    **     
1de20 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63       we referenc
1de30 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
1de40 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49  using a "rowid I
1de50 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20  N (...)".    ** 
1de60 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75           constru
1de70 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ct..    */.    a
1de80 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e  ssert( pLoop->u.
1de90 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a  btree.nEq==1 );.
1dea0 20 20 20 20 69 52 65 6c 65 61 73 65 52 65 67 20      iReleaseReg 
1deb0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1dec0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
1ded0 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e   pTerm = pLoop->
1dee0 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61  aLTerm[0];.    a
1def0 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
1df00 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1df10 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29  Term->pExpr!=0 )
1df20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d  ;.    assert( om
1df30 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
1df40 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
1df50 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
1df60 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
1df70 20 69 52 6f 77 69 64 52 65 67 20 3d 20 63 6f 64   iRowidReg = cod
1df80 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
1df90 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65  arse, pTerm, pLe
1dfa0 76 65 6c 2c 20 30 2c 20 62 52 65 76 2c 20 69 52  vel, 0, bRev, iR
1dfb0 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20  eleaseReg);.    
1dfc0 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c  addrNxt = pLevel
1dfd0 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 73  ->addrNxt;.    s
1dfe0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1dff0 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
1e000 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 61 64 64  , iRowidReg, add
1e010 72 4e 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rNxt);.    sqlit
1e020 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1e030 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43  OP_NotExists, iC
1e040 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 69 52 6f  ur, addrNxt, iRo
1e050 77 69 64 52 65 67 29 3b 0a 20 20 20 20 73 71 6c  widReg);.    sql
1e060 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
1e070 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
1e080 73 65 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 31  se, iRowidReg, 1
1e090 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1e0a0 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
1e0b0 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69  rse, iCur, -1, i
1e0c0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56  RowidReg);.    V
1e0d0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1e0e0 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65 76 65  pk"));.    pLeve
1e0f0 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  l->op = OP_Noop;
1e100 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c  .  }else if( (pL
1e110 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1e120 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20  HERE_IPK)!=0.   
1e130 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d        && (pLoop-
1e140 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1e150 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29 21 3d  _COLUMN_RANGE)!=
1e160 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  0.  ){.    /* Ca
1e170 73 65 20 33 3a 20 20 57 65 20 68 61 76 65 20 61  se 3:  We have a
1e180 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d  n inequality com
1e190 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20  parison against 
1e1a0 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e  the ROWID field.
1e1b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
1e1c0 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  testOp = OP_Noop
1e1d0 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b  ;.    int start;
1e1e0 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56  .    int memEndV
1e1f0 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57 68  alue = 0;.    Wh
1e200 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c  ereTerm *pStart,
1e210 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73   *pEnd;..    ass
1e220 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
1e230 30 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a  0 );.    j = 0;.
1e240 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e      pStart = pEn
1e250 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  d = 0;.    if( p
1e260 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1e270 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
1e280 29 20 70 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70  ) pStart = pLoop
1e290 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20  ->aLTerm[j++];. 
1e2a0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
1e2b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
1e2c0 50 5f 4c 49 4d 49 54 20 29 20 70 45 6e 64 20 3d  P_LIMIT ) pEnd =
1e2d0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1e2e0 2b 2b 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ++];.    assert(
1e2f0 20 70 53 74 61 72 74 21 3d 30 20 7c 7c 20 70 45   pStart!=0 || pE
1e300 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  nd!=0 );.    if(
1e310 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70   bRev ){.      p
1e320 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20  Term = pStart;. 
1e330 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45       pStart = pE
1e340 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d  nd;.      pEnd =
1e350 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20   pTerm;.    }.  
1e360 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a    if( pStart ){.
1e370 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20        Expr *pX; 
1e380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e390 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
1e3a0 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 73  at defines the s
1e3b0 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20  tart bound */.  
1e3c0 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d      int r1, rTem
1e3d0 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67  p;        /* Reg
1e3e0 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69  isters for holdi
1e3f0 6e 67 20 74 68 65 20 73 74 61 72 74 20 62 6f 75  ng the start bou
1e400 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20  ndary */..      
1e410 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1e420 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54   constant maps T
1e430 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20  K_xx codes into 
1e440 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20  corresponding . 
1e450 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63       ** seek opc
1e460 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64  odes.  It depend
1e470 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61  s on a particula
1e480 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b  r ordering of TK
1e490 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  _xx.      */.   
1e4a0 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76     const u8 aMov
1e4b0 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  eOp[] = {.      
1e4c0 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f       /* TK_GT */
1e4d0 20 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20    OP_SeekGt,.   
1e4e0 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45          /* TK_LE
1e4f0 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a   */  OP_SeekLe,.
1e500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
1e510 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c  _LT */  OP_SeekL
1e520 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,.           /*
1e530 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65   TK_GE */  OP_Se
1e540 65 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20  ekGe.      };.  
1e550 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
1e560 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20  E==TK_GT+1 );   
1e570 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
1e580 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a  the ordering.. *
1e590 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1e5a0 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29  TK_LT==TK_GT+2 )
1e5b0 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f  ;      /*  ... o
1e5c0 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75  f the TK_xx valu
1e5d0 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61  es... */.      a
1e5e0 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b  ssert( TK_GE==TK
1e5f0 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+3 );      /*
1e600 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63    ... is correcc
1e610 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73  t. */..      ass
1e620 65 72 74 28 20 28 70 53 74 61 72 74 2d 3e 77 74  ert( (pStart->wt
1e630 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
1e640 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  LL)==0 );.      
1e650 74 65 73 74 63 61 73 65 28 20 70 53 74 61 72 74  testcase( pStart
1e660 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1e670 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
1e680 20 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70    pX = pStart->p
1e690 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
1e6a0 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20  rt( pX!=0 );.   
1e6b0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 74     testcase( pSt
1e6c0 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  art->leftCursor!
1e6d0 3d 69 43 75 72 20 29 3b 20 2f 2a 20 74 72 61 6e  =iCur ); /* tran
1e6e0 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e  sitive constrain
1e6f0 74 73 20 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d  ts */.      r1 =
1e700 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e710 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d  Temp(pParse, pX-
1e720 3e 70 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29  >pRight, &rTemp)
1e730 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1e740 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f  dbeAddOp3(v, aMo
1e750 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47  veOp[pX->op-TK_G
1e760 54 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  T], iCur, addrBr
1e770 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  k, r1);.      Vd
1e780 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70  beComment((v, "p
1e790 6b 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  k"));.      sqli
1e7a0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
1e7b0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
1e7c0 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20  e, r1, 1);.     
1e7d0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1e7e0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1e7f0 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 64 69 73  Temp);.      dis
1e800 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
1e810 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65   pStart);.    }e
1e820 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1e830 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e840 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a  bRev ? OP_Last :
1e850 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72   OP_Rewind, iCur
1e860 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  , addrBrk);.    
1e870 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29  }.    if( pEnd )
1e880 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  {.      Expr *pX
1e890 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e  ;.      pX = pEn
1e8a0 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  d->pExpr;.      
1e8b0 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
1e8c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
1e8d0 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  pEnd->wtFlags & 
1e8e0 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
1e8f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e900 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73  ( pEnd->leftCurs
1e910 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54  or!=iCur ); /* T
1e920 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72  ransitive constr
1e930 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 74  aints */.      t
1e940 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77  estcase( pEnd->w
1e950 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
1e960 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d  RTUAL );.      m
1e970 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70  emEndValue = ++p
1e980 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1e990 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1e9a0 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  de(pParse, pX->p
1e9b0 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c  Right, memEndVal
1e9c0 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ue);.      if( p
1e9d0 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20  X->op==TK_LT || 
1e9e0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b  pX->op==TK_GT ){
1e9f0 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20  .        testOp 
1ea00 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a  = bRev ? OP_Le :
1ea10 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65   OP_Ge;.      }e
1ea20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73  lse{.        tes
1ea30 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  tOp = bRev ? OP_
1ea40 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20  Lt : OP_Gt;.    
1ea50 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c    }.      disabl
1ea60 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45  eTerm(pLevel, pE
1ea70 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  nd);.    }.    s
1ea80 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
1ea90 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1eaa0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
1eab0 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65   = bRev ? OP_Pre
1eac0 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  v : OP_Next;.   
1ead0 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
1eae0 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ur;.    pLevel->
1eaf0 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20  p2 = start;.    
1eb00 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
1eb10 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  p5==0 );.    if(
1eb20 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70   testOp!=OP_Noop
1eb30 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64   ){.      iRowid
1eb40 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65  Reg = iReleaseRe
1eb50 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
1eb60 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
1eb70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1eb80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
1eb90 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64  id, iCur, iRowid
1eba0 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
1ebb0 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
1ebc0 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
1ebd0 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
1ebe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ebf0 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f  eAddOp3(v, testO
1ec00 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20  p, memEndValue, 
1ec10 61 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64 52  addrBrk, iRowidR
1ec20 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
1ec30 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1ec40 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  , SQLITE_AFF_NUM
1ec50 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55  ERIC | SQLITE_JU
1ec60 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  MPIFNULL);.    }
1ec70 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f  .  }else if( pLo
1ec80 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1ec90 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
1eca0 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 41 20     /* Case 4: A 
1ecb0 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e  scan using an in
1ecc0 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  dex..    **.    
1ecd0 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20 57  **         The W
1ece0 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79 20  HERE clause may 
1ecf0 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20  contain zero or 
1ed00 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a 20  more equality . 
1ed10 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 65     **         te
1ed20 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e  rms ("==" or "IN
1ed30 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68 61  " operators) tha
1ed40 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 4e  t refer to the N
1ed50 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ed60 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
1ed70 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  s of the index. 
1ed80 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  It may also cont
1ed90 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ain.    **      
1eda0 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f     inequality co
1edb0 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c  nstraints (>, <,
1edc0 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68   >= or <=) on th
1edd0 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a  e indexed.    **
1ede0 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
1edf0 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79  that immediately
1ee00 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65   follows the N e
1ee10 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20  qualities. Only 
1ee20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ee30 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  the right-most c
1ee40 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20  olumn can be an 
1ee50 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65  inequality - the
1ee60 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20 2a   rest must.    *
1ee70 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68  *         use th
1ee80 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20  e "==" and "IN" 
1ee90 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20 65  operators. For e
1eea0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a  xample, if the .
1eeb0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69      **         i
1eec0 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c  ndex is on (x,y,
1eed0 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c  z), then the fol
1eee0 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20 61  lowing clauses a
1eef0 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20  re all .    **  
1ef00 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65 64         optimized
1ef10 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1ef20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a 20             x=5. 
1ef30 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1ef40 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20 20   x=5 AND y=10.  
1ef50 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1ef60 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20  x=5 AND y<10.   
1ef70 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
1ef80 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20 79  =5 AND y>5 AND y
1ef90 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  <10.    **      
1efa0 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d        x=5 AND y=
1efb0 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20  5 AND z<=10.    
1efc0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1efd0 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d 20    The z<10 term 
1efe0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1eff0 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c   cannot be used,
1f000 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20   only.    **    
1f010 20 20 20 20 20 74 68 65 20 78 3d 35 20 74 65 72       the x=5 ter
1f020 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  m:.    **.    **
1f030 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1f040 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a  AND z<10.    **.
1f050 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 4e      **         N
1f060 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66 20   may be zero if 
1f070 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61  there are inequa
1f080 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1f090 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ..    **        
1f0a0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
1f0b0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
1f0c0 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20  traints, then N 
1f0d0 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20 20  is at.    **    
1f0e0 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a       least one..
1f0f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1f100 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65 20        This case 
1f110 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65  is also used whe
1f120 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57  n there are no W
1f130 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20  HERE clause.    
1f140 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  **         const
1f150 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e  raints but an in
1f160 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20  dex is selected 
1f170 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72  anyway, in order
1f180 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f190 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74  to force the out
1f1a0 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e  put order to con
1f1b0 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52  form to an ORDER
1f1c0 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20   BY..    */  .  
1f1d0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1f1e0 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b  8 aStartOp[] = {
1f1f0 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20  .      0,.      
1f200 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77 69  0,.      OP_Rewi
1f210 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  nd,           /*
1f220 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73   2: (!start_cons
1f230 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74  traints && start
1f240 45 71 20 26 26 20 20 21 62 52 65 76 29 20 2a 2f  Eq &&  !bRev) */
1f250 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20  .      OP_Last, 
1f260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33              /* 3
1f270 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72  : (!start_constr
1f280 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71  aints && startEq
1f290 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a 20   &&   bRev) */. 
1f2a0 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20       OP_SeekGt, 
1f2b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a 20            /* 4: 
1f2c0 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1f2d0 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20  ts  && !startEq 
1f2e0 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
1f2f0 20 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20     OP_SeekLt,   
1f300 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28 73          /* 5: (s
1f310 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1f320 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26    && !startEq &&
1f330 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20    bRev) */.     
1f340 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20 20 20   OP_SeekGe,     
1f350 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61        /* 6: (sta
1f360 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
1f370 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20 21  &&  startEq && !
1f380 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
1f390 50 5f 53 65 65 6b 4c 65 20 20 20 20 20 20 20 20  P_SeekLe        
1f3a0 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72 74      /* 7: (start
1f3b0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
1f3c0 20 20 73 74 61 72 74 45 71 20 26 26 20 20 62 52    startEq &&  bR
1f3d0 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  ev) */.    };.  
1f3e0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1f3f0 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20  8 aEndOp[] = {. 
1f400 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20       OP_Noop,   
1f410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20            /* 0: 
1f420 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74  (!end_constraint
1f430 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49  s) */.      OP_I
1f440 64 78 47 45 2c 20 20 20 20 20 20 20 20 20 20 20  dxGE,           
1f450 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 1: (end_cons
1f460 74 72 61 69 6e 74 73 20 26 26 20 21 62 52 65 76  traints && !bRev
1f470 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64  ) */.      OP_Id
1f480 78 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  xLT             
1f490 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 2: (end_const
1f4a0 72 61 69 6e 74 73 20 26 26 20 62 52 65 76 29 20  raints && bRev) 
1f4b0 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  */.    };.    in
1f4c0 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  t nEq = pLoop->u
1f4d0 2e 62 74 72 65 65 2e 6e 45 71 3b 20 20 2f 2a 20  .btree.nEq;  /* 
1f4e0 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20  Number of == or 
1f4f0 49 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  IN terms */.    
1f500 69 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d  int isMinQuery =
1f510 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
1f520 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
1f530 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c 45 43 54  optimized SELECT
1f540 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20   min(x).. */.   
1f550 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20   int regBase;   
1f560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f570 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20 68   Base register h
1f580 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e  olding constrain
1f590 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20  t values */.    
1f5a0 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20 20  int r1;         
1f5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f5c0 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 2a 2f  Temp register */
1f5d0 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
1f5e0 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b  pRangeStart = 0;
1f5f0 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20    /* Inequality 
1f600 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61  constraint at ra
1f610 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20  nge start */.   
1f620 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e   WhereTerm *pRan
1f630 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a  geEnd = 0;    /*
1f640 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   Inequality cons
1f650 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20  traint at range 
1f660 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  end */.    int s
1f670 74 61 72 74 45 71 3b 20 20 20 20 20 20 20 20 20  tartEq;         
1f680 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1f690 69 66 20 72 61 6e 67 65 20 73 74 61 72 74 20 75  if range start u
1f6a0 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d  ses ==, >= or <=
1f6b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45   */.    int endE
1f6c0 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
1f6d0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1f6e0 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d  range end uses =
1f6f0 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20  =, >= or <= */. 
1f700 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e     int start_con
1f710 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20  straints;       
1f720 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67  /* Start of rang
1f730 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64  e is constrained
1f740 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e   */.    int nCon
1f750 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20  straint;        
1f760 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f770 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  f constraint ter
1f780 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  ms */.    Index 
1f790 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
1f7a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
1f7b0 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75  dex we will be u
1f7c0 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sing */.    int 
1f7d0 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20 20  iIdxCur;        
1f7e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f7f0 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
1f800 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
1f810 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20 3d   int nExtraReg =
1f820 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1f830 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
1f840 20 72 65 67 69 73 74 65 72 73 20 6e 65 65 64 65   registers neede
1f850 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b  d */.    int op;
1f860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f870 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63        /* Instruc
1f880 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  tion opcode */. 
1f890 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72 74 41     char *zStartA
1f8a0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
1f8b0 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20  /* Affinity for 
1f8c0 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 63  start of range c
1f8d0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
1f8e0 20 63 68 61 72 20 2a 7a 45 6e 64 41 66 66 3b 20   char *zEndAff; 
1f8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f900 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 65 6e   Affinity for en
1f910 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74  d of range const
1f920 72 61 69 6e 74 20 2a 2f 0a 0a 20 20 20 20 70 49  raint */..    pI
1f930 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  dx = pLoop->u.bt
1f940 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
1f950 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
1f960 2d 3e 69 49 64 78 43 75 72 3b 0a 0a 20 20 20 20  ->iIdxCur;..    
1f970 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20  /* If this loop 
1f980 73 61 74 69 73 66 69 65 73 20 61 20 73 6f 72 74  satisfies a sort
1f990 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42 79   order (pOrderBy
1f9a0 29 20 72 65 71 75 65 73 74 20 74 68 61 74 20 0a  ) request that .
1f9b0 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65      ** was passe
1f9c0 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
1f9d0 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  on to implement 
1f9e0 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  a "SELECT min(x)
1f9f0 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75   ..." .    ** qu
1fa00 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61  ery, then the ca
1fa10 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61  ller will only a
1fa20 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f  llow the loop to
1fa30 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20   run for.    ** 
1fa40 61 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69  a single iterati
1fa50 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  on. This means t
1fa60 68 61 74 20 74 68 65 20 66 69 72 73 74 20 72 6f  hat the first ro
1fa70 77 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a  w returned.    *
1fa80 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76  * should not hav
1fa90 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73  e a NULL value s
1faa0 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66  tored in 'x'. If
1fab0 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20   column 'x' is. 
1fac0 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20     ** the first 
1fad0 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e 45  one after the nE
1fae0 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  q equality const
1faf0 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  raints in the in
1fb00 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73  dex,.    ** this
1fb10 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73   requires some s
1fb20 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e  pecial handling.
1fb30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1fb40 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
1fb50 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
1fb60 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20 26  Y_MIN)!=0.     &
1fb70 26 20 28 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61  & (pWInfo->bOBSa
1fb80 74 21 3d 30 29 0a 20 20 20 20 20 26 26 20 28 70  t!=0).     && (p
1fb90 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71  Idx->nColumn>nEq
1fba0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
1fbb0 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72  * assert( pOrder
1fbc0 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 20  By->nExpr==1 ); 
1fbd0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65  */.      /* asse
1fbe0 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  rt( pOrderBy->a[
1fbf0 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  0].pExpr->iColum
1fc00 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
1fc10 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20 20 20  n[nEq] ); */.   
1fc20 20 20 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20     isMinQuery = 
1fc30 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52  1;.      nExtraR
1fc40 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  eg = 1;.    }.. 
1fc50 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69     /* Find any i
1fc60 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1fc70 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74  aint terms for t
1fc80 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64  he start and end
1fc90 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20   .    ** of the 
1fca0 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20  range. .    */. 
1fcb0 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20 20 20     j = nEq;.    
1fcc0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1fcd0 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
1fce0 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52  IMIT ){.      pR
1fcf0 61 6e 67 65 53 74 61 72 74 20 3d 20 70 4c 6f 6f  angeStart = pLoo
1fd00 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a  p->aLTerm[j++];.
1fd10 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20        nExtraReg 
1fd20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
1fd30 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1fd40 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
1fd50 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61  MIT ){.      pRa
1fd60 6e 67 65 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e  ngeEnd = pLoop->
1fd70 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20  aLTerm[j++];.   
1fd80 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31     nExtraReg = 1
1fd90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1fda0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1fdb0 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f   evaluate all co
1fdc0 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75  nstraint terms u
1fdd0 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20  sing == or IN.  
1fde0 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74    ** and store t
1fdf0 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f  he values of tho
1fe00 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61  se terms in an a
1fe10 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
1fe20 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
1fe30 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20  g at regBase..  
1fe40 20 20 2a 2f 0a 20 20 20 20 72 65 67 42 61 73 65    */.    regBase
1fe50 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69   = codeAllEquali
1fe60 74 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c 70  tyTerms(pParse,p
1fe70 4c 65 76 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72  Level,bRev,nExtr
1fe80 61 52 65 67 2c 26 7a 53 74 61 72 74 41 66 66 29  aReg,&zStartAff)
1fe90 3b 0a 20 20 20 20 7a 45 6e 64 41 66 66 20 3d 20  ;.    zEndAff = 
1fea0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
1feb0 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a  db, zStartAff);.
1fec0 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c      addrNxt = pL
1fed0 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a  evel->addrNxt;..
1fee0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
1fef0 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65   doing a reverse
1ff00 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61   order scan on a
1ff10 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
1ff20 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66  x, or.    ** a f
1ff30 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73 63 61  orward order sca
1ff40 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e  n on a descendin
1ff50 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68  g index, interch
1ff60 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  ange the .    **
1ff70 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74   start and end t
1ff80 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72  erms (pRangeStar
1ff90 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29  t and pRangeEnd)
1ffa0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1ffb0 20 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c   (nEq<pIdx->nCol
1ffc0 75 6d 6e 20 26 26 20 62 52 65 76 3d 3d 28 70 49  umn && bRev==(pI
1ffd0 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  dx->aSortOrder[n
1ffe0 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  Eq]==SQLITE_SO_A
1fff0 53 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52  SC)).     || (bR
20000 65 76 20 26 26 20 70 49 64 78 2d 3e 6e 43 6f 6c  ev && pIdx->nCol
20010 75 6d 6e 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b  umn==nEq).    ){
20020 0a 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72  .      SWAP(Wher
20030 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45  eTerm *, pRangeE
20040 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29  nd, pRangeStart)
20050 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73  ;.    }..    tes
20060 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
20070 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74 61  rt && (pRangeSta
20080 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
20090 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20  WO_LE)!=0 );.   
200a0 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
200b0 65 53 74 61 72 74 20 26 26 20 28 70 52 61 6e 67  eStart && (pRang
200c0 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
200d0 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b  r & WO_GE)!=0 );
200e0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
200f0 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61  RangeEnd && (pRa
20100 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
20110 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b  r & WO_LE)!=0 );
20120 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
20130 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61  RangeEnd && (pRa
20140 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
20150 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b  r & WO_GE)!=0 );
20160 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 21  .    startEq = !
20170 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 70  pRangeStart || p
20180 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
20190 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57  rator & (WO_LE|W
201a0 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45 71  O_GE);.    endEq
201b0 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64 20   =   !pRangeEnd 
201c0 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  || pRangeEnd->eO
201d0 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45  perator & (WO_LE
201e0 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74 61  |WO_GE);.    sta
201f0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d  rt_constraints =
20200 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20   pRangeStart || 
20210 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  nEq>0;..    /* S
20220 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63 75  eek the index cu
20230 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rsor to the star
20240 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  t of the range. 
20250 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  */.    nConstrai
20260 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66  nt = nEq;.    if
20270 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 29 7b  ( pRangeStart ){
20280 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
20290 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74 61 72  ght = pRangeStar
202a0 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t->pExpr->pRight
202b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
202c0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
202d0 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
202e0 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nEq);.      if( 
202f0 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74  (pRangeStart->wt
20300 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
20310 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LL)==0 ){.      
20320 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
20330 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70  eIsNullJump(v, p
20340 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e  Right, regBase+n
20350 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  Eq, addrNxt);.  
20360 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
20370 7a 53 74 61 72 74 41 66 66 20 29 7b 0a 20 20 20  zStartAff ){.   
20380 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
20390 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
203a0 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66  pRight, zStartAf
203b0 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f  f[nEq])==SQLITE_
203c0 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20  AFF_NONE){.     
203d0 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68       /* Since th
203e0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  e comparison is 
203f0 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  to be performed 
20400 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69  with no conversi
20410 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ons.          **
20420 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20   applied to the 
20430 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68  operands, set th
20440 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70  e affinity to ap
20450 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f  ply to pRight to
20460 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53   .          ** S
20470 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20  QLITE_AFF_NONE. 
20480 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 53   */.          zS
20490 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53  tartAff[nEq] = S
204a0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
204b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
204c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
204d0 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79  rNeedsNoAffinity
204e0 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a  Change(pRight, z
204f0 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 20 29  StartAff[nEq]) )
20500 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61  {.          zSta
20510 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c  rtAff[nEq] = SQL
20520 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
20530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
20540 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61   .      nConstra
20550 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73  int++;.      tes
20560 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
20570 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
20580 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
20590 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4d 69    }else if( isMi
205a0 6e 51 75 65 72 79 20 29 7b 0a 20 20 20 20 20 20  nQuery ){.      
205b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
205c0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
205d0 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
205e0 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
205f0 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45  ++;.      startE
20600 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61  q = 0;.      sta
20610 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d  rt_constraints =
20620 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f   1;.    }.    co
20630 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
20640 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
20650 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 7a 53   nConstraint, zS
20660 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 6f 70  tartAff);.    op
20670 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61   = aStartOp[(sta
20680 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c  rt_constraints<<
20690 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31  2) + (startEq<<1
206a0 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61  ) + bRev];.    a
206b0 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a  ssert( op!=0 );.
206c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
206d0 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20  ==OP_Rewind );. 
206e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
206f0 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20  =OP_Last );.    
20700 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
20710 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 74  _SeekGt );.    t
20720 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
20730 53 65 65 6b 47 65 20 29 3b 0a 20 20 20 20 74 65  SeekGe );.    te
20740 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
20750 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65 73  eekLe );.    tes
20760 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
20770 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c 69  ekLt );.    sqli
20780 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
20790 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c  (v, op, iIdxCur,
207a0 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73   addrNxt, regBas
207b0 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  e, nConstraint);
207c0 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
207d0 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
207e0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
207f0 72 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64  raint at the end
20800 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   of the.    ** r
20810 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20  ange (if any).. 
20820 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74     */.    nConst
20830 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20  raint = nEq;.   
20840 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29   if( pRangeEnd )
20850 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
20860 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e 64  ight = pRangeEnd
20870 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
20880 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
20890 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
208a0 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45  arse, regBase+nE
208b0 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  q, 1);.      sql
208c0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
208d0 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67  rse, pRight, reg
208e0 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
208f0 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64 2d   if( (pRangeEnd-
20900 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
20910 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VNULL)==0 ){.   
20920 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
20930 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76  CodeIsNullJump(v
20940 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
20950 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b  e+nEq, addrNxt);
20960 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
20970 66 28 20 7a 45 6e 64 41 66 66 20 29 7b 0a 20 20  f( zEndAff ){.  
20980 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
20990 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
209a0 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66  (pRight, zEndAff
209b0 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41  [nEq])==SQLITE_A
209c0 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20  FF_NONE){.      
209d0 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65      /* Since the
209e0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
209f0 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77  o be performed w
20a00 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f  ith no conversio
20a10 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ns.          ** 
20a20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f  applied to the o
20a30 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65  perands, set the
20a40 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70   affinity to app
20a50 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20  ly to pRight to 
20a60 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51  .          ** SQ
20a70 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20  LITE_AFF_NONE.  
20a80 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e  */.          zEn
20a90 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49  dAff[nEq] = SQLI
20aa0 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
20ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
20ac0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65  f( sqlite3ExprNe
20ad0 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
20ae0 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 45 6e 64  nge(pRight, zEnd
20af0 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20  Aff[nEq]) ){.   
20b00 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e         zEndAff[n
20b10 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  Eq] = SQLITE_AFF
20b20 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
20b30 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20  .      }  .     
20b40 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69   codeApplyAffini
20b50 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ty(pParse, regBa
20b60 73 65 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e 64 41  se, nEq+1, zEndA
20b70 66 66 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73  ff);.      nCons
20b80 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  traint++;.      
20b90 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
20ba0 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
20bb0 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
20bc0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
20bd0 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 61 72  DbFree(db, zStar
20be0 74 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74  tAff);.    sqlit
20bf0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 6e  e3DbFree(db, zEn
20c00 64 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  dAff);..    /* T
20c10 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62  op of the loop b
20c20 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65  ody */.    pLeve
20c30 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56  l->p2 = sqlite3V
20c40 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
20c50 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
20c60 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 63 75   if the index cu
20c70 72 73 6f 72 20 69 73 20 70 61 73 74 20 74 68 65  rsor is past the
20c80 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67   end of the rang
20c90 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d 20 61  e. */.    op = a
20ca0 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64  EndOp[(pRangeEnd
20cb0 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b 20   || nEq) * (1 + 
20cc0 62 52 65 76 29 5d 3b 0a 20 20 20 20 74 65 73 74  bRev)];.    test
20cd0 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f  case( op==OP_Noo
20ce0 70 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  p );.    testcas
20cf0 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20  e( op==OP_IdxGE 
20d00 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
20d10 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b   op==OP_IdxLT );
20d20 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 4f 50 5f  .    if( op!=OP_
20d30 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Noop ){.      sq
20d40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
20d50 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75  nt(v, op, iIdxCu
20d60 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42  r, addrNxt, regB
20d70 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
20d80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20d90 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
20da0 65 6e 64 45 71 21 3d 62 52 65 76 20 3f 31 3a 30  endEq!=bRev ?1:0
20db0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
20dc0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   If there are in
20dd0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
20de0 69 6e 74 73 2c 20 63 68 65 63 6b 20 74 68 61 74  ints, check that
20df0 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 2a   the value.    *
20e00 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  * of the table c
20e10 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 69  olumn that the i
20e20 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 74 72 61  nequality contra
20e30 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e  ins is not NULL.
20e40 0a 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73  .    ** If it is
20e50 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65  , jump to the ne
20e60 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
20e70 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  the loop..    */
20e80 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65  .    r1 = sqlite
20e90 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
20ea0 73 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  se);.    testcas
20eb0 65 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  e( pLoop->wsFlag
20ec0 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
20ed0 4d 49 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63  MIT );.    testc
20ee0 61 73 65 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  ase( pLoop->wsFl
20ef0 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
20f00 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 69 66 28  LIMIT );.    if(
20f10 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
20f20 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49   & (WHERE_BTM_LI
20f30 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49  MIT|WHERE_TOP_LI
20f40 4d 49 54 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  MIT))!=0 ){.    
20f50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20f60 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
20f70 2c 20 69 49 64 78 43 75 72 2c 20 6e 45 71 2c 20  , iIdxCur, nEq, 
20f80 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
20f90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20fa0 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61  OP_IsNull, r1, a
20fb0 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a  ddrCont);.    }.
20fc0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
20fd0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
20fe0 2c 20 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  , r1);..    /* S
20ff0 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75  eek the table cu
21000 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65  rsor, if require
21010 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65  d */.    disable
21020 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61  Term(pLevel, pRa
21030 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 64  ngeStart);.    d
21040 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
21050 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20  l, pRangeEnd);. 
21060 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c     if( !omitTabl
21070 65 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69  e ){.      iRowi
21080 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52  dReg = iReleaseR
21090 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
210a0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
210b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
210c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
210d0 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c  xRowid, iIdxCur,
210e0 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
210f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
21100 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
21110 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69   iCur, -1, iRowi
21120 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
21130 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21140 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c  , OP_Seek, iCur,
21150 20 69 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a   iRowidReg);  /*
21160 20 44 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a   Deferred seek *
21170 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  /.    }..    /* 
21180 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72  Record the instr
21190 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74  uction used to t
211a0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
211b0 70 2e 20 44 69 73 61 62 6c 65 20 0a 20 20 20 20  p. Disable .    
211c0 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
211d0 74 65 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e  terms made redun
211e0 64 61 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65  dant by the inde
211f0 78 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20  x range scan..  
21200 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f    */.    if( pLo
21210 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
21220 45 52 45 5f 4f 4e 45 52 4f 57 20 29 7b 0a 20 20  ERE_ONEROW ){.  
21230 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
21240 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65   OP_Noop;.    }e
21250 6c 73 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a  lse if( bRev ){.
21260 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
21270 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20   = OP_Prev;.    
21280 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
21290 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78  vel->op = OP_Nex
212a0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65  t;.    }.    pLe
212b0 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75  vel->p1 = iIdxCu
212c0 72 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  r;.    if( (pLoo
212d0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
212e0 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 3d 3d  RE_CONSTRAINT)==
212f0 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  0 ){.      pLeve
21300 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53  l->p5 = SQLITE_S
21310 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
21320 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c  AN_STEP;.    }el
21330 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
21340 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20  ( pLevel->p5==0 
21350 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
21360 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
21370 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
21380 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 6f 6f  ATION.  if( pLoo
21390 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
213a0 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
213b0 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54     /* Case 5:  T
213c0 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
213d0 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65  ately indexed te
213e0 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
213f0 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   OR.    **.    *
21400 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
21410 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  *.    **   CREAT
21420 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63  E TABLE t1(a,b,c
21430 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  ,d);.    **   CR
21440 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
21450 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(a);.    **  
21460 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
21470 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a   ON t1(b);.    *
21480 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
21490 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20   i3 ON t1(c);.  
214a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
214b0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
214c0 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20  HERE a=5 OR b=7 
214d0 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31  OR (c=11 AND d=1
214e0 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  3).    **.    **
214f0 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c   In the example,
21500 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65   there are three
21510 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
21520 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a  onnected by OR..
21530 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f      ** The top o
21540 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73  f the loop looks
21550 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
21560 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
21570 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
21580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
21590 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
215a0 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
215b0 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f  .    ** Then, fo
215c0 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74  r each indexed t
215d0 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  erm, the followi
215e0 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  ng. The argument
215f0 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53  s to.    ** RowS
21600 65 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20  etTest are such 
21610 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f  that the rowid o
21620 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
21630 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20  w is inserted.  
21640 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f    ** into the Ro
21650 77 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61  wSet. If it is a
21660 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20  lready present, 
21670 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68  control skips th
21680 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f  e.    ** Gosub o
21690 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20  pcode and jumps 
216a0 73 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20  straight to the 
216b0 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
216c0 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20  y WhereEnd()..  
216d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
216e0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
216f0 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20  egin(<term>).   
21700 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77   **          Row
21710 53 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20  SetTest         
21720 20 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72           # Inser
21730 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77  t rowid into row
21740 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  set.    **      
21750 20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32      Gosub      2
21760 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   A.    **       
21770 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
21780 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ().    **.    **
21790 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61   Following the a
217a0 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65  bove, code to te
217b0 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
217c0 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74  . Label A, the t
217d0 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20  arget.    ** of 
217e0 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c  the Gosub above,
217f0 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e   jumps to the in
21800 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20  struction right 
21810 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a  after the Goto..
21820 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
21830 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20         Null     
21840 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
21850 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f     # Zero the ro
21860 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20  wset in reg 1.  
21870 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
21880 74 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20  to       B      
21890 20 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20            # The 
218a0 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64  loop is finished
218b0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
218c0 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62        A: <loop b
218d0 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20  ody>            
218e0 20 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61       # Return da
218f0 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20  ta, whatever..  
21900 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
21910 20 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20       Return     
21920 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
21930 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20   # Jump back to 
21940 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a  the Gosub.    **
21950 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a  .    **       B:
21960 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70   <after the loop
21970 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a  >.    **.    */.
21980 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
21990 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68  *pOrWc;    /* Th
219a0 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b  e OR-clause brok
219b0 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74  en out into subt
219c0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c  erms */.    SrcL
219d0 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20 20  ist *pOrTab;    
219e0 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20     /* Shortened 
219f0 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52  table list or OR
21a00 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74 69  -clause generati
21a10 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  on */.    Index 
21a20 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20 20 20  *pCov = 0;      
21a30 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74         /* Potent
21a40 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ial covering ind
21a50 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ex (or NULL) */.
21a60 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75 72 20      int iCovCur 
21a70 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
21a80 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65  ;  /* Cursor use
21a90 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63 61 6e  d for index scan
21aa0 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20  s (if any) */.. 
21ab0 20 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e     int regReturn
21ac0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
21ad0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
21ae0 52 65 67 69 73 74 65 72 20 75 73 65 64 20 77 69  Register used wi
21af0 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20  th OP_Gosub */. 
21b00 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73 65 74     int regRowset
21b10 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
21b20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21b30 52 65 67 69 73 74 65 72 20 66 6f 72 20 52 6f 77  Register for Row
21b40 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  Set object */.  
21b50 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d    int regRowid =
21b60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
21b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
21b80 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
21b90 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74  rowid */.    int
21ba0 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c   iLoopBody = sql
21bb0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
21bc0 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72 74 20  l(v);  /* Start 
21bd0 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a  of loop body */.
21be0 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e 69 74      int iRetInit
21bf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21c10 20 41 64 64 72 65 73 73 20 6f 66 20 72 65 67 52   Address of regR
21c20 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20  eturn init */.  
21c30 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64 54 65    int untestedTe
21c40 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  rms = 0;        
21c50 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72       /* Some ter
21c60 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  ms not completel
21c70 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 20 20  y tested */.    
21c80 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
21c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ca0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
21cb0 65 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  er */.    Expr *
21cc0 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20 20  pAndExpr = 0;   
21cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21ce0 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29  An ".. AND (...)
21cf0 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  " expression */.
21d00 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20     .    pTerm = 
21d10 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  pLoop->aLTerm[0]
21d20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
21d30 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  erm!=0 );.    as
21d40 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
21d50 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29  erator & WO_OR )
21d60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
21d70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
21d80 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20  TERM_ORINFO)!=0 
21d90 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26  );.    pOrWc = &
21da0 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
21db0 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c  ->wc;.    pLevel
21dc0 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e  ->op = OP_Return
21dd0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
21de0 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20   = regReturn;.. 
21df0 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e     /* Set up a n
21e00 65 77 20 53 72 63 4c 69 73 74 20 69 6e 20 70 4f  ew SrcList in pO
21e10 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rTab containing 
21e20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
21e30 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62  scanned.    ** b
21e40 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74  y this loop in t
21e50 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64  he a[0] slot and
21e60 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61   all notReady ta
21e70 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73  bles in a[1..] s
21e80 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69  lots..    ** Thi
21e90 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72  s becomes the Sr
21ea0 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65 63  cList in the rec
21eb0 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73  ursive call to s
21ec0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
21ed0 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ()..    */.    i
21ee0 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  f( pWInfo->nLeve
21ef0 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  l>1 ){.      int
21f00 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20   nNotReady;     
21f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21f20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74  he number of not
21f30 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a  Ready tables */.
21f40 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
21f50 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53  List_item *origS
21f60 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  rc;     /* Origi
21f70 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c  nal list of tabl
21f80 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74  es */.      nNot
21f90 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e  Ready = pWInfo->
21fa0 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20  nLevel - iLevel 
21fb0 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61  - 1;.      pOrTa
21fc0 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b  b = sqlite3Stack
21fd0 41 6c 6c 6f 63 52 61 77 28 64 62 2c 0a 20 20 20  AllocRaw(db,.   
21fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ff0 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
22000 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65  *pOrTab)+ nNotRe
22010 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61  ady*sizeof(pOrTa
22020 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20  b->a[0]));.     
22030 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20 29   if( pOrTab==0 )
22040 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79   return notReady
22050 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e  ;.      pOrTab->
22060 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29 28 6e 4e  nAlloc = (u8)(nN
22070 6f 74 52 65 61 64 79 20 2b 20 31 29 3b 0a 20 20  otReady + 1);.  
22080 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63      pOrTab->nSrc
22090 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f   = pOrTab->nAllo
220a0 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  c;.      memcpy(
220b0 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61 62 49  pOrTab->a, pTabI
220c0 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61  tem, sizeof(*pTa
220d0 62 49 74 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f  bItem));.      o
220e0 72 69 67 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d  rigSrc = pWInfo-
220f0 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20  >pTabList->a;.  
22100 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d      for(k=1; k<=
22110 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b  nNotReady; k++){
22120 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
22130 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26  &pOrTab->a[k], &
22140 6f 72 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b  origSrc[pLevel[k
22150 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66  ].iFrom], sizeof
22160 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b  (pOrTab->a[k]));
22170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
22180 73 65 7b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  se{.      pOrTab
22190 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
221a0 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ist;.    }..    
221b0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
221c0 65 20 72 6f 77 73 65 74 20 72 65 67 69 73 74 65  e rowset registe
221d0 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c  r to contain NUL
221e0 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69  L. An SQL NULL i
221f0 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76 61  s .    ** equiva
22200 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74 79  lent to an empty
22210 20 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a   rowset..    **.
22220 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74      ** Also init
22230 69 61 6c 69 7a 65 20 72 65 67 52 65 74 75 72 6e  ialize regReturn
22240 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
22250 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69  address of the i
22260 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20 20 20 20  nstruction .    
22270 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ** immediately f
22280 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f  ollowing the OP_
22290 52 65 74 75 72 6e 20 61 74 20 74 68 65 20 62 6f  Return at the bo
222a0 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ttom of the loop
222b0 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73  . This.    ** is
222c0 20 72 65 71 75 69 72 65 64 20 69 6e 20 61 20 66   required in a f
222d0 65 77 20 6f 62 73 63 75 72 65 20 4c 45 46 54 20  ew obscure LEFT 
222e0 4a 4f 49 4e 20 63 61 73 65 73 20 77 68 65 72 65  JOIN cases where
222f0 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20   control jumps. 
22300 20 20 20 2a 2a 20 6f 76 65 72 20 74 68 65 20 74     ** over the t
22310 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  op of the loop i
22320 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20  nto the body of 
22330 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  it. In this case
22340 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72   the .    ** cor
22350 72 65 63 74 20 72 65 73 70 6f 6e 73 65 20 66 6f  rect response fo
22360 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f  r the end-of-loo
22370 70 20 63 6f 64 65 20 28 74 68 65 20 4f 50 5f 52  p code (the OP_R
22380 65 74 75 72 6e 29 20 69 73 20 74 6f 20 0a 20 20  eturn) is to .  
22390 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67    ** fall throug
223a0 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
223b0 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20  struction, just 
223c0 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f  as an OP_Next do
223d0 65 73 20 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c  es if.    ** cal
223e0 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74  led on an uninit
223f0 69 61 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a  ialized cursor..
22400 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
22410 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
22420 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49  gs & WHERE_DUPLI
22430 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a  CATES_OK)==0 ){.
22440 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20        regRowset 
22450 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
22460 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64  ;.      regRowid
22470 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
22480 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
22490 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
224a0 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77  _Null, 0, regRow
224b0 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  set);.    }.    
224c0 69 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74  iRetInit = sqlit
224d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
224e0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
224f0 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20  egReturn);..    
22500 2f 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  /* If the origin
22510 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  al WHERE clause 
22520 69 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d  is z of the form
22530 3a 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20  :  (x1 OR x2 OR 
22540 2e 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a  ...) AND y.    *
22550 2a 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79  * Then for every
22560 20 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61   term xN, evalua
22570 74 65 20 61 73 20 74 68 65 20 73 75 62 65 78 70  te as the subexp
22580 72 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20  ression: xN AND 
22590 7a 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61  z.    ** That wa
225a0 79 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68  y, terms in y th
225b0 61 74 20 61 72 65 20 66 61 63 74 6f 72 65 64 20  at are factored 
225c0 69 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63  into the disjunc
225d0 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  tion will.    **
225e0 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 62 79   be picked up by
225f0 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63   the recursive c
22600 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57  alls to sqlite3W
22610 68 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f  hereBegin() belo
22620 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  w..    **.    **
22630 20 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20   Actually, each 
22640 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
22650 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78   converted to "x
22660 4e 20 41 4e 44 20 77 22 20 77 68 65 72 65 20 77  N AND w" where w
22670 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22   is.    ** the "
22680 69 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65 72  interesting" ter
22690 6d 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20  ms of z - terms 
226a0 74 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69  that did not ori
226b0 67 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20  ginate in the.  
226c0 20 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47    ** ON or USING
226d0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46   clause of a LEF
226e0 54 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d  T JOIN, and term
226f0 73 20 74 68 61 74 20 61 72 65 20 75 73 61 62 6c  s that are usabl
22700 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64  e as .    ** ind
22710 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ices..    **.   
22720 20 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a   ** This optimiz
22730 61 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20  ation also only 
22740 61 70 70 6c 69 65 73 20 69 66 20 74 68 65 20 28  applies if the (
22750 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29  x1 OR x2 OR ...)
22760 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20   term.    ** is 
22770 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
22780 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f   the ON clause o
22790 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20  f a LEFT JOIN.. 
227a0 20 20 20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74     ** See ticket
227b0 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69   http://www.sqli
227c0 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f  te.org/src/info/
227d0 66 32 33 36 39 33 30 34 65 34 0a 20 20 20 20 2a  f2369304e4.    *
227e0 2f 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 6e  /.    if( pWC->n
227f0 54 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20  Term>1 ){.      
22800 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 20  int iTerm;.     
22810 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69 54   for(iTerm=0; iT
22820 65 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  erm<pWC->nTerm; 
22830 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  iTerm++){.      
22840 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
22850 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45  pWC->a[iTerm].pE
22860 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
22870 20 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20   &pWC->a[iTerm] 
22880 3d 3d 20 70 54 65 72 6d 20 29 20 63 6f 6e 74 69  == pTerm ) conti
22890 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
228a0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
228b0 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
228c0 6f 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  oin) ) continue;
228d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57 43  .        if( pWC
228e0 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61  ->a[iTerm].wtFla
228f0 67 73 20 26 20 28 54 45 52 4d 5f 4f 52 49 4e 46  gs & (TERM_ORINF
22900 4f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  O) ) continue;. 
22910 20 20 20 20 20 20 20 69 66 28 20 28 70 57 43 2d         if( (pWC-
22920 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61  >a[iTerm].eOpera
22930 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30  tor & WO_ALL)==0
22940 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
22950 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
22960 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
22970 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
22980 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71     pAndExpr = sq
22990 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
229a0 20 70 41 6e 64 45 78 70 72 2c 20 70 45 78 70 72   pAndExpr, pExpr
229b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
229c0 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b   if( pAndExpr ){
229d0 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70  .        pAndExp
229e0 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
229f0 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c  (pParse, TK_AND,
22a00 20 30 2c 20 70 41 6e 64 45 78 70 72 2c 20 30 29   0, pAndExpr, 0)
22a10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22a20 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
22a30 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20  i<pOrWc->nTerm; 
22a40 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65  ii++){.      Whe
22a50 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20  reTerm *pOrTerm 
22a60 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b  = &pOrWc->a[ii];
22a70 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
22a80 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
22a90 69 43 75 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d  iCur || (pOrTerm
22aa0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
22ab0 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  _AND)!=0 ){.    
22ac0 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70      WhereInfo *p
22ad0 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  SubWInfo;       
22ae0 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73     /* Info for s
22af0 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63  ingle OR-term sc
22b00 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  an */.        Ex
22b10 70 72 20 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f  pr *pOrExpr = pO
22b20 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  rTerm->pExpr;.  
22b30 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78        if( pAndEx
22b40 70 72 20 26 26 20 21 45 78 70 72 48 61 73 50 72  pr && !ExprHasPr
22b50 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c 20  operty(pOrExpr, 
22b60 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
22b70 20 20 20 20 20 20 20 20 20 20 70 41 6e 64 45 78            pAndEx
22b80 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45  pr->pLeft = pOrE
22b90 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  xpr;.          p
22ba0 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78 70  OrExpr = pAndExp
22bb0 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
22bc0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
22bd0 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69  ough table entri
22be0 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65  es that match te
22bf0 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20  rm pOrTerm. */. 
22c00 20 20 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f         pSubWInfo
22c10 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
22c20 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 4f 72  egin(pParse, pOr
22c30 54 61 62 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c  Tab, pOrExpr, 0,
22c40 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
22c50 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
22c60 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53  E_OMIT_OPEN_CLOS
22c70 45 20 7c 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e  E | WHERE_AND_ON
22c80 4c 59 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  LY |.           
22c90 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
22ca0 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c  RE_FORCE_TABLE |
22cb0 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
22cc0 4f 4e 4c 59 2c 20 69 43 6f 76 43 75 72 29 3b 0a  ONLY, iCovCur);.
22cd0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
22ce0 70 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61  pSubWInfo || pPa
22cf0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
22d00 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
22d10 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75  .        if( pSu
22d20 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  bWInfo ){.      
22d30 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
22d40 53 75 62 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  SubLoop;.       
22d50 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61     explainOneSca
22d60 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n(.             
22d70 20 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c   pParse, pOrTab,
22d80 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30   &pSubWInfo->a[0
22d90 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65  ], iLevel, pLeve
22da0 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20  l->iFrom, 0.    
22db0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
22dc0 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
22dd0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
22de0 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b  RE_DUPLICATES_OK
22df0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
22e00 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28      int iSet = (
22e10 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  (ii==pOrWc->nTer
22e20 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20  m-1)?-1:ii);.   
22e30 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a           int r;.
22e40 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20              r = 
22e50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
22e60 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
22e70 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c   pTabItem->pTab,
22e80 20 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20 20 20   -1, iCur, .    
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22eb0 20 20 20 20 20 72 65 67 52 6f 77 69 64 2c 20 30       regRowid, 0
22ec0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
22ed0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
22ee0 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74  Int(v, OP_RowSet
22ef0 54 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c  Test, regRowset,
22f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
22f30 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72  rentAddr(v)+2, r
22f40 2c 20 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20  , iSet);.       
22f50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
22f60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22f70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
22f80 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f  gReturn, iLoopBo
22f90 64 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  dy);..          
22fa0 2f 2a 20 54 68 65 20 70 53 75 62 57 49 6e 66 6f  /* The pSubWInfo
22fb0 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
22fc0 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20  flag means that 
22fd0 74 68 69 73 20 4f 52 20 74 65 72 6d 0a 20 20 20  this OR term.   
22fe0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
22ff0 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ned one or more 
23000 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20 61 20  AND term from a 
23010 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 2e 20  notReady table. 
23020 20 54 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   The.          *
23030 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  * terms from the
23040 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 20   notReady table 
23050 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 65 73  could not be tes
23060 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20  ted and will.   
23070 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74         ** need t
23080 6f 20 62 65 20 74 65 73 74 65 64 20 6c 61 74 65  o be tested late
23090 72 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  r..          */.
230a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
230b0 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65  ubWInfo->unteste
230c0 64 54 65 72 6d 73 20 29 20 75 6e 74 65 73 74 65  dTerms ) unteste
230d0 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20  dTerms = 1;..   
230e0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
230f0 20 6f 66 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65   of the OR-conne
23100 63 74 65 64 20 74 65 72 6d 73 20 61 72 65 20 6f  cted terms are o
23110 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 74  ptimized using t
23120 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20  he same.        
23130 20 20 2a 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20    ** index, and 
23140 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f 70 65  the index is ope
23150 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61  ned using the sa
23160 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  me cursor number
23170 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79  .          ** by
23180 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71   each call to sq
23190 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
231a0 29 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 6c  ) made by this l
231b0 6f 6f 70 2c 20 69 74 20 6d 61 79 0a 20 20 20 20  oop, it may.    
231c0 20 20 20 20 20 20 2a 2a 20 62 65 20 70 6f 73 73        ** be poss
231d0 69 62 6c 65 20 74 6f 20 75 73 65 20 74 68 61 74  ible to use that
231e0 20 69 6e 64 65 78 20 61 73 20 61 20 63 6f 76 65   index as a cove
231f0 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20 20  ring index..    
23200 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
23210 20 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c     ** If the cal
23220 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  l to sqlite3Wher
23230 65 42 65 67 69 6e 28 29 20 61 62 6f 76 65 20 72  eBegin() above r
23240 65 73 75 6c 74 65 64 20 69 6e 20 61 20 73 63 61  esulted in a sca
23250 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  n that.         
23260 20 2a 2a 20 75 73 65 73 20 61 6e 20 69 6e 64 65   ** uses an inde
23270 78 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 65  x, and this is e
23280 69 74 68 65 72 20 74 68 65 20 66 69 72 73 74 20  ither the first 
23290 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72  OR-connected ter
232a0 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  m.          ** p
232b0 72 6f 63 65 73 73 65 64 20 6f 72 20 74 68 65 20  rocessed or the 
232c0 69 6e 64 65 78 20 69 73 20 74 68 65 20 73 61 6d  index is the sam
232d0 65 20 61 73 20 74 68 61 74 20 75 73 65 64 20 62  e as that used b
232e0 79 20 61 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20  y all previous. 
232f0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d           ** term
23300 73 2c 20 73 65 74 20 70 43 6f 76 20 74 6f 20 74  s, set pCov to t
23310 68 65 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76  he candidate cov
23320 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68  ering index. Oth
23330 65 72 77 69 73 65 2c 20 73 65 74 20 0a 20 20 20  erwise, set .   
23340 20 20 20 20 20 20 20 2a 2a 20 70 43 6f 76 20 74         ** pCov t
23350 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61  o NULL to indica
23360 74 65 20 74 68 61 74 20 6e 6f 20 63 61 6e 64 69  te that no candi
23370 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e  date covering in
23380 64 65 78 20 77 69 6c 6c 20 0a 20 20 20 20 20 20  dex will .      
23390 20 20 20 20 2a 2a 20 62 65 20 61 76 61 69 6c 61      ** be availa
233a0 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ble..          *
233b0 2f 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62  /.          pSub
233c0 4c 6f 6f 70 20 3d 20 70 53 75 62 57 49 6e 66 6f  Loop = pSubWInfo
233d0 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20  ->a[0].pWLoop;. 
233e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
233f0 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c   (pSubLoop->wsFl
23400 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
23410 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20  _INDEX)==0 );.  
23420 20 20 20 20 20 20 20 20 69 66 28 20 28 70 53 75          if( (pSu
23430 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  bLoop->wsFlags &
23440 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
23450 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
23460 20 28 69 69 3d 3d 30 20 7c 7c 20 70 53 75 62 4c   (ii==0 || pSubL
23470 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
23480 64 65 78 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20  dex==pCov).     
23490 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
234a0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
234b0 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78  WInfo->a[0].iIdx
234c0 43 75 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b 0a  Cur==iCovCur );.
234d0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76              pCov
234e0 20 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62   = pSubLoop->u.b
234f0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
23500 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23510 20 20 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d            pCov =
23520 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
23530 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  .          /* Fi
23540 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70 20 74 68  nish the loop th
23550 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72  rough table entr
23560 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  ies that match t
23570 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a  erm pOrTerm. */.
23580 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23590 33 57 68 65 72 65 45 6e 64 28 70 53 75 62 57 49  3WhereEnd(pSubWI
235a0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nfo);.        }.
235b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
235c0 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76    pLevel->u.pCov
235d0 69 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20  idx = pCov;.    
235e0 69 66 28 20 70 43 6f 76 20 29 20 70 4c 65 76 65  if( pCov ) pLeve
235f0 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 43 6f  l->iIdxCur = iCo
23600 76 43 75 72 3b 0a 20 20 20 20 69 66 28 20 70 41  vCur;.    if( pA
23610 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  ndExpr ){.      
23620 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20  pAndExpr->pLeft 
23630 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
23640 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
23650 20 70 41 6e 64 45 78 70 72 29 3b 0a 20 20 20 20   pAndExpr);.    
23660 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
23670 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52 65  eChangeP1(v, iRe
23680 74 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56 64  tInit, sqlite3Vd
23690 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
236a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
236b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
236c0 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  oto, 0, pLevel->
236d0 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 73 71  addrBrk);.    sq
236e0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
236f0 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f  Label(v, iLoopBo
23700 64 79 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 57  dy);..    if( pW
23710 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29  Info->nLevel>1 )
23720 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65   sqlite3StackFre
23730 65 28 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20  e(db, pOrTab);. 
23740 20 20 20 69 66 28 20 21 75 6e 74 65 73 74 65 64     if( !untested
23750 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65 54  Terms ) disableT
23760 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
23770 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  m);.  }else.#end
23780 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
23790 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
237a0 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a  N */..  {.    /*
237b0 20 43 61 73 65 20 36 3a 20 20 54 68 65 72 65 20   Case 6:  There 
237c0 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64  is no usable ind
237d0 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20  ex.  We must do 
237e0 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a  a complete.    *
237f0 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e 20  *          scan 
23800 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 61  of the entire ta
23810 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
23820 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
23830 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e  aStep[] = { OP_N
23840 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a  ext, OP_Prev };.
23850 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
23860 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b   u8 aStart[] = {
23870 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c   OP_Rewind, OP_L
23880 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72  ast };.    asser
23890 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52  t( bRev==0 || bR
238a0 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 70 4c 65  ev==1 );.    pLe
238b0 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b  vel->op = aStep[
238c0 62 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65  bRev];.    pLeve
238d0 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
238e0 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31    pLevel->p2 = 1
238f0 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
23900 64 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62  dOp2(v, aStart[b
23910 52 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72  Rev], iCur, addr
23920 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Brk);.    pLevel
23930 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54  ->p5 = SQLITE_ST
23940 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
23950 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a 0a 20 20 2f  N_STEP;.  }..  /
23960 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f  * Insert code to
23970 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65   test every sube
23980 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
23990 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  an be completely
239a0 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75  .  ** computed u
239b0 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  sing the current
239c0 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a   set of tables..
239d0 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d    */.  for(pTerm
239e0 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e  =pWC->a, j=pWC->
239f0 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  nTerm; j>0; j--,
23a00 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45   pTerm++){.    E
23a10 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74 65 73  xpr *pE;.    tes
23a20 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
23a30 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
23a40 54 55 41 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  TUAL );.    test
23a50 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
23a60 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
23a70 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  D );.    if( pTe
23a80 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
23a90 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
23aa0 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
23ab0 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ue;.    if( (pTe
23ac0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
23ad0 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
23ae0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  )!=0 ){.      te
23af0 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e  stcase( pWInfo->
23b00 75 6e 74 65 73 74 65 64 54 65 72 6d 73 3d 3d 30  untestedTerms==0
23b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23b20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
23b30 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
23b40 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30  NETABLE_ONLY)!=0
23b50 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   );.      pWInfo
23b60 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
23b70 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 1;.      conti
23b80 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nue;.    }.    p
23b90 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
23ba0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
23bb0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
23bc0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
23bd0 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
23be0 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d  erty(pE, EP_From
23bf0 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 63  Join) ){.      c
23c00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
23c10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
23c20 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
23c30 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
23c40 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
23c50 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
23c60 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
23c70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65  ;.  }..  /* Inse
23c80 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20  rt code to test 
23c90 66 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e 73  for implied cons
23ca0 74 72 61 69 6e 74 73 20 62 61 73 65 64 20 6f 6e  traints based on
23cb0 20 74 72 61 6e 73 69 74 69 76 69 74 79 0a 20 20   transitivity.  
23cc0 2a 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22 20 6f  ** of the "==" o
23cd0 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20  perator..  **.  
23ce0 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74  ** Example: If t
23cf0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
23d00 63 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d 74  contains "t1.a=t
23d10 32 2e 62 22 20 61 6e 64 20 22 74 32 2e 62 3d 31  2.b" and "t2.b=1
23d20 32 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20  23".  ** and we 
23d30 61 72 65 20 63 6f 64 69 6e 67 20 74 68 65 20 74  are coding the t
23d40 31 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20 74  1 loop and the t
23d50 32 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20 79  2 loop has not y
23d60 65 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20 74  et coded,.  ** t
23d70 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75 73  hen we cannot us
23d80 65 20 74 68 65 20 22 74 31 2e 61 3d 74 32 2e 62  e the "t1.a=t2.b
23d90 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62 75  " constraint, bu
23da0 74 20 77 65 20 63 61 6e 20 63 6f 64 65 0a 20 20  t we can code.  
23db0 2a 2a 20 74 68 65 20 69 6d 70 6c 69 65 64 20 22  ** the implied "
23dc0 74 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74 72  t1.a=123" constr
23dd0 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  aint..  */.  for
23de0 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
23df0 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30  =pWC->nTerm; j>0
23e00 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
23e10 0a 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20 2a  .    Expr *pE, *
23e20 70 45 41 6c 74 3b 0a 20 20 20 20 57 68 65 72 65  pEAlt;.    Where
23e30 54 65 72 6d 20 2a 70 41 6c 74 3b 0a 20 20 20 20  Term *pAlt;.    
23e40 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
23e50 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
23e60 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  AL|TERM_CODED) )
23e70 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
23e80 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
23e90 74 6f 72 21 3d 28 57 4f 5f 45 51 55 49 56 7c 57  tor!=(WO_EQUIV|W
23ea0 4f 5f 45 51 29 20 29 20 63 6f 6e 74 69 6e 75 65  O_EQ) ) continue
23eb0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
23ec0 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
23ed0 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
23ee0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
23ef0 65 66 74 4a 6f 69 6e 20 29 20 63 6f 6e 74 69 6e  eftJoin ) contin
23f00 75 65 3b 0a 20 20 20 20 70 45 20 3d 20 70 54 65  ue;.    pE = pTe
23f10 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61  rm->pExpr;.    a
23f20 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
23f30 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
23f40 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20 20 20  romJoin) );.    
23f50 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
23f60 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4c  prereqRight & pL
23f70 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21  evel->notReady)!
23f80 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c 74 20 3d  =0 );.    pAlt =
23f90 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
23fa0 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  Cur, pTerm->u.le
23fb0 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61  ftColumn, notRea
23fc0 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c  dy, WO_EQ|WO_IN,
23fd0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 41 6c   0);.    if( pAl
23fe0 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t==0 ) continue;
23ff0 0a 20 20 20 20 69 66 28 20 70 41 6c 74 2d 3e 77  .    if( pAlt->w
24000 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43  tFlags & (TERM_C
24010 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
24020 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
24030 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pAlt->eOperator 
24040 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 74  & WO_EQ );.    t
24050 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65  estcase( pAlt->e
24060 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
24070 20 29 3b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70   );.    VdbeNoop
24080 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67  Comment((v, "beg
24090 69 6e 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f  in transitive co
240a0 6e 73 74 72 61 69 6e 74 22 29 29 3b 0a 20 20 20  nstraint"));.   
240b0 20 70 45 41 6c 74 20 3d 20 73 71 6c 69 74 65 33   pEAlt = sqlite3
240c0 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62  StackAllocRaw(db
240d0 2c 20 73 69 7a 65 6f 66 28 2a 70 45 41 6c 74 29  , sizeof(*pEAlt)
240e0 29 3b 0a 20 20 20 20 69 66 28 20 70 45 41 6c 74  );.    if( pEAlt
240f0 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 41 6c 74   ){.      *pEAlt
24100 20 3d 20 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b   = *pAlt->pExpr;
24110 0a 20 20 20 20 20 20 70 45 41 6c 74 2d 3e 70 4c  .      pEAlt->pL
24120 65 66 74 20 3d 20 70 45 2d 3e 70 4c 65 66 74 3b  eft = pE->pLeft;
24130 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
24140 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
24150 2c 20 70 45 41 6c 74 2c 20 61 64 64 72 43 6f 6e  , pEAlt, addrCon
24160 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  t, SQLITE_JUMPIF
24170 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
24180 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64 62  ite3StackFree(db
24190 2c 20 70 45 41 6c 74 29 3b 0a 20 20 20 20 7d 0a  , pEAlt);.    }.
241a0 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20    }..  /* For a 
241b0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c  LEFT OUTER JOIN,
241c0 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
241d0 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20  hat will record 
241e0 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20  the fact that.  
241f0 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ** at least one 
24200 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68 74  row of the right
24210 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68   table has match
24220 65 64 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  ed the left tabl
24230 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  e.  .  */.  if( 
24240 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
24250 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  n ){.    pLevel-
24260 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c  >addrFirst = sql
24270 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
24280 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
24290 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
242a0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
242b0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
242c0 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  n);.    VdbeComm
242d0 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20  ent((v, "record 
242e0 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29  LEFT JOIN hit"))
242f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
24300 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
24310 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65  se);.    for(pTe
24320 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20  rm=pWC->a, j=0; 
24330 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b  j<pWC->nTerm; j+
24340 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
24350 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
24360 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
24370 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
24380 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
24390 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
243a0 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20  ERM_CODED );.   
243b0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
243c0 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
243d0 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
243e0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
243f0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
24400 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76  prereqAll & pLev
24410 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30  el->notReady)!=0
24420 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
24430 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65  rt( pWInfo->unte
24440 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20  stedTerms );.   
24450 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
24460 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
24470 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ert( pTerm->pExp
24480 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r );.      sqlit
24490 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
244a0 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78  arse, pTerm->pEx
244b0 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  pr, addrCont, SQ
244c0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
244d0 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
244e0 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
244f0 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ODED;.    }.  }.
24500 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
24510 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
24520 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20  iReleaseReg);.. 
24530 20 72 65 74 75 72 6e 20 70 4c 65 76 65 6c 2d 3e   return pLevel->
24540 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66  notReady;.}..#if
24550 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
24560 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69  NABLED./*.** Pri
24570 6e 74 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  nt a WhereLoop o
24580 62 6a 65 63 74 20 66 6f 72 20 64 65 62 75 67 67  bject for debugg
24590 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a  ing purposes.*/.
245a0 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
245b0 65 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65  eLoopPrint(Where
245c0 4c 6f 6f 70 20 2a 70 2c 20 53 72 63 4c 69 73 74  Loop *p, SrcList
245d0 20 2a 70 54 61 62 4c 69 73 74 29 7b 0a 20 20 69   *pTabList){.  i
245e0 6e 74 20 6e 62 20 3d 20 31 2b 28 70 54 61 62 4c  nt nb = 1+(pTabL
245f0 69 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a  ist->nSrc+7)/8;.
24600 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
24610 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
24620 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e  TabList->a + p->
24630 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70  iTab;.  Table *p
24640 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
24650 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  b;.  sqlite3Debu
24660 67 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e 25  gPrintf("%c%2d.%
24670 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70  0*llx.%0*llx", p
24680 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20  ->cId,.         
24690 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69              p->i
246a0 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b  Tab, nb, p->mask
246b0 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65  Self, nb, p->pre
246c0 72 65 71 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  req);.  sqlite3D
246d0 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 31 32  ebugPrintf(" %12
246e0 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
246f0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
24700 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e  zAlias ? pItem->
24710 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a  zAlias : pTab->z
24720 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d  Name);.  if( (p-
24730 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
24740 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
24750 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 ){.    if( p->
24760 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 29  u.btree.pIndex )
24770 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
24780 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75  ar *zName = p->u
24790 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a  .btree.pIndex->z
247a0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Name;.      if( 
247b0 7a 4e 61 6d 65 3d 3d 30 20 29 20 7a 4e 61 6d 65  zName==0 ) zName
247c0 20 3d 20 22 69 70 6b 22 3b 0a 20 20 20 20 20 20   = "ipk";.      
247d0 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d  if( strncmp(zNam
247e0 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69  e, "sqlite_autoi
247f0 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29  ndex_", 17)==0 )
24800 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20  {.        int i 
24810 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
24820 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20  0(zName) - 1;.  
24830 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61        while( zNa
24840 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d  me[i]!='_' ) i--
24850 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
24860 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += i;.      }.  
24870 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24880 50 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25  Printf(".%-16s %
24890 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75  2d", zName, p->u
248a0 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20  .btree.nEq);.   
248b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
248c0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
248d0 28 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20  ("%20s","");.   
248e0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
248f0 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28  char *z;.    if(
24900 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74   p->u.vtab.idxSt
24910 72 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73  r ){.      z = s
24920 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
24930 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c  (%d,\"%s\",%x)",
24940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24950 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75   p->u.vtab.idxNu
24960 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  m, p->u.vtab.idx
24970 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f  Str, p->u.vtab.o
24980 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65  mitMask);.    }e
24990 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73  lse{.      z = s
249a0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
249b0 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76  (%d,%x)", p->u.v
249c0 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75  tab.idxNum, p->u
249d0 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b  .vtab.omitMask);
249e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
249f0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
24a00 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20  %-19s", z);.    
24a10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
24a20 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
24a30 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30  bugPrintf(" f %0
24a40 34 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46  4x N %d", p->wsF
24a50 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29  lags, p->nLTerm)
24a60 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
24a70 50 72 69 6e 74 66 28 22 20 63 6f 73 74 20 25 64  Printf(" cost %d
24a80 2c 25 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53  ,%d,%d\n", p->rS
24a90 65 74 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70  etup, p->rRun, p
24aa0 2d 3e 6e 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69  ->nOut);.}.#endi
24ab0 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
24ac0 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74   bulk memory int
24ad0 6f 20 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c  o a valid WhereL
24ae0 6f 6f 70 20 74 68 61 74 20 63 61 6e 20 62 65 20  oop that can be 
24af0 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65  passed.** to whe
24b00 72 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d  reLoopClear harm
24b10 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  lessly..*/.stati
24b20 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
24b30 49 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a  Init(WhereLoop *
24b40 70 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20  p){.  p->aLTerm 
24b50 3d 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  = p->aLTermSpace
24b60 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  ;.  p->nLTerm = 
24b70 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d  0;.  p->nLSlot =
24b80 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c   ArraySize(p->aL
24b90 54 65 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d  TermSpace);.  p-
24ba0 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a  >wsFlags = 0;.}.
24bb0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
24bc0 20 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69   WhereLoop.u uni
24bd0 6f 6e 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65  on.  Leave Where
24be0 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61  Loop.pLTerm inta
24bf0 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
24c00 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  id whereLoopClea
24c10 72 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  rUnion(sqlite3 *
24c20 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
24c30 29 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c  ){.  if( p->wsFl
24c40 61 67 73 20 26 20 28 57 48 45 52 45 5f 56 49 52  ags & (WHERE_VIR
24c50 54 55 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f  TUALTABLE|WHERE_
24c60 41 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20  AUTO_INDEX) ){. 
24c70 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
24c80 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
24c90 41 4c 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70  ALTABLE)!=0 && p
24ca0 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
24cb0 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
24cc0 65 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61  e3_free(p->u.vta
24cd0 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  b.idxStr);.     
24ce0 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46   p->u.vtab.needF
24cf0 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ree = 0;.      p
24d00 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
24d10 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
24d20 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
24d30 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
24d40 58 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74  X)!=0 && p->u.bt
24d50 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b  ree.pIndex!=0 ){
24d60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
24d70 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74  Free(db, p->u.bt
24d80 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c  ree.pIndex->zCol
24d90 41 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Aff);.      sqli
24da0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
24db0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
24dc0 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  ;.      p->u.btr
24dd0 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
24de0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
24df0 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74  * Deallocate int
24e00 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65  ernal memory use
24e10 64 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70  d by a WhereLoop
24e20 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
24e30 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
24e40 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64  Clear(sqlite3 *d
24e50 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
24e60 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  {.  if( p->aLTer
24e70 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
24e80 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
24e90 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  e(db, p->aLTerm)
24ea0 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  ;.  whereLoopCle
24eb0 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a  arUnion(db, p);.
24ec0 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
24ed0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  p);.}../*.** Inc
24ee0 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79  rease the memory
24ef0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20   allocation for 
24f00 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20  pLoop->aLTerm[] 
24f10 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e  to be at least n
24f20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24f30 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
24f40 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
24f50 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e  reLoop *p, int n
24f60 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
24f70 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d  *paNew;.  if( p-
24f80 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74  >nLSlot>=n ) ret
24f90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
24fa0 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20   n = (n+7)&~7;. 
24fb0 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   paNew = sqlite3
24fc0 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
24fd0 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d  sizeof(p->aLTerm
24fe0 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70  [0])*n);.  if( p
24ff0 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  aNew==0 ) return
25000 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
25010 20 6d 65 6d 63 70 79 28 70 61 4e 65 77 2c 20 70   memcpy(paNew, p
25020 2d 3e 61 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66  ->aLTerm, sizeof
25030 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70  (p->aLTerm[0])*p
25040 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28  ->nLSlot);.  if(
25050 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61   p->aLTerm!=p->a
25060 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c  LTermSpace ) sql
25070 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
25080 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e  ->aLTerm);.  p->
25090 61 4c 54 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a  aLTerm = paNew;.
250a0 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b    p->nLSlot = n;
250b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
250c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  _OK;.}../*.** Tr
250d0 61 6e 73 66 65 72 20 63 6f 6e 74 65 6e 74 20 66  ansfer content f
250e0 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 70  rom the second p
250f0 4c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 66 69  Loop into the fi
25100 72 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rst..*/.static i
25110 6e 74 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72  nt whereLoopXfer
25120 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
25130 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68  ereLoop *pTo, Wh
25140 65 72 65 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b  ereLoop *pFrom){
25150 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
25160 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b  rUnion(db, pTo);
25170 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  .  if( whereLoop
25180 52 65 73 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20  Resize(db, pTo, 
25190 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29  pFrom->nLTerm) )
251a0 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 54  {.    memset(&pT
251b0 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28  o->u, 0, sizeof(
251c0 70 54 6f 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65  pTo->u));.    re
251d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
251e0 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28  M;.  }.  memcpy(
251f0 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52  pTo, pFrom, WHER
25200 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b  E_LOOP_XFER_SZ);
25210 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61  .  memcpy(pTo->a
25220 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c  LTerm, pFrom->aL
25230 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72  Term, pTo->nLTer
25240 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c  m*sizeof(pTo->aL
25250 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28  Term[0]));.  if(
25260 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20   pFrom->wsFlags 
25270 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
25280 41 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72 6f  ABLE ){.    pFro
25290 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  m->u.vtab.needFr
252a0 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  ee = 0;.  }else 
252b0 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c  if( (pFrom->wsFl
252c0 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
252d0 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20  _INDEX)!=0 ){.  
252e0 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65    pFrom->u.btree
252f0 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d  .pIndex = 0;.  }
25300 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
25310 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
25320 6c 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70  lete a WhereLoop
25330 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
25340 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
25350 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
25360 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
25370 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c  ){.  whereLoopCl
25380 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71  ear(db, p);.  sq
25390 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
253a0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  p);.}../*.** Fre
253b0 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74  e a WhereInfo st
253c0 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69  ructure.*/.stati
253d0 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f  c void whereInfo
253e0 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62  Free(sqlite3 *db
253f0 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  , WhereInfo *pWI
25400 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  nfo){.  if( ALWA
25410 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20  YS(pWInfo) ){.  
25420 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
25430 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  ar(&pWInfo->sWC)
25440 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57 49  ;.    while( pWI
25450 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20  nfo->pLoops ){. 
25460 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a       WhereLoop *
25470 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  p = pWInfo->pLoo
25480 70 73 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ps;.      pWInfo
25490 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e  ->pLoops = p->pN
254a0 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77  extLoop;.      w
254b0 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64  hereLoopDelete(d
254c0 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  b, p);.    }.   
254d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
254e0 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
254f0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
25500 6f 72 20 72 65 70 6c 61 63 65 20 61 20 57 68 65  or replace a Whe
25510 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 75 73 69  reLoop entry usi
25520 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20  ng the template 
25530 73 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  supplied..**.** 
25540 41 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  An existing Wher
25550 65 4c 6f 6f 70 20 65 6e 74 72 79 20 6d 69 67 68  eLoop entry migh
25560 74 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  t be overwritten
25570 20 69 66 20 74 68 65 20 6e 65 77 20 74 65 6d 70   if the new temp
25580 6c 61 74 65 0a 2a 2a 20 69 73 20 62 65 74 74 65  late.** is bette
25590 72 20 61 6e 64 20 68 61 73 20 66 65 77 65 72 20  r and has fewer 
255a0 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f  dependencies.  O
255b0 72 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 77  r the template w
255c0 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a  ill be ignored.*
255d0 2a 20 61 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20  * and no insert 
255e0 77 69 6c 6c 20 6f 63 63 75 72 20 69 66 20 61 6e  will occur if an
255f0 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
25600 6f 6f 70 20 69 73 20 66 61 73 74 65 72 20 61 6e  oop is faster an
25610 64 20 68 61 73 0a 2a 2a 20 66 65 77 65 72 20 64  d has.** fewer d
25620 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e  ependencies than
25630 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 20 20   the template.  
25640 4f 74 68 65 72 77 69 73 65 20 61 20 6e 65 77 20  Otherwise a new 
25650 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20  WhereLoop is.** 
25660 61 64 64 65 64 20 62 61 73 65 64 20 6f 6e 20 74  added based on t
25670 68 65 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a  he template..**.
25680 2a 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e  ** If pBuilder->
25690 70 4f 72 53 65 74 20 69 73 20 6e 6f 74 20 4e 55  pOrSet is not NU
256a0 4c 4c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20  LL then we only 
256b0 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79 20  care about only 
256c0 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75 69 73  the.** prerequis
256d0 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20 61 6e  ites and rRun an
256e0 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66 20  d nOut costs of 
256f0 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70 73  the N best loops
25700 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f 72  .  That.** infor
25710 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68 65 72  mation is gather
25720 65 64 20 69 6e 20 74 68 65 20 70 42 75 69 6c 64  ed in the pBuild
25730 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65 63  er->pOrSet objec
25740 74 2e 20 20 54 68 69 73 20 73 70 65 63 69 61 6c  t.  This special
25750 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 6d  .** processing m
25760 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ode is used only
25770 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70   for OR clause p
25780 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
25790 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74 69   When accumulati
257a0 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70  ng multiple loop
257b0 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65 72  s (when pBuilder
257c0 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55 4c 4c  ->pOrSet is NULL
257d0 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69  ) we.** still mi
257e0 67 68 74 20 6f 76 65 72 77 72 69 74 65 20 73 69  ght overwrite si
257f0 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74 68  milar loops with
25800 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74   the new templat
25810 65 20 69 66 20 74 68 65 0a 2a 2a 20 74 65 6d 70  e if the.** temp
25820 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 2e 20  late is better. 
25830 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20 6f 76   Loops may be ov
25840 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
25850 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63   following .** c
25860 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20 6d 65  onditions are me
25870 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  t:.**.**    (1) 
25880 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73   They have the s
25890 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20  ame iTab..**    
258a0 28 32 29 20 20 54 68 65 79 20 68 61 76 65 20 74  (2)  They have t
258b0 68 65 20 73 61 6d 65 20 69 53 6f 72 74 49 64 78  he same iSortIdx
258c0 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20 54 68 65  ..**    (3)  The
258d0 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 73 61   template has sa
258e0 6d 65 20 6f 72 20 66 65 77 65 72 20 64 65 70 65  me or fewer depe
258f0 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68  ndencies than th
25900 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a  e current loop.*
25910 2a 20 20 20 20 28 34 29 20 20 54 68 65 20 74 65  *    (4)  The te
25920 6d 70 6c 61 74 65 20 68 61 73 20 74 68 65 20 73  mplate has the s
25930 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ame or lower cos
25940 74 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  t than the curre
25950 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 35  nt loop.**    (5
25960 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
25970 75 73 65 73 20 6d 6f 72 65 20 74 65 72 6d 73 20  uses more terms 
25980 6f 66 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65  of the same inde
25990 78 20 62 75 74 20 68 61 73 20 6e 6f 20 61 64 64  x but has no add
259a0 69 74 69 6f 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  itional.**      
259b0 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20     dependencies 
259c0 20 20 20 20 20 20 20 20 20 0a 2a 2f 0a 73 74 61           .*/.sta
259d0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
259e0 70 49 6e 73 65 72 74 28 57 68 65 72 65 4c 6f 6f  pInsert(WhereLoo
259f0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
25a00 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  er, WhereLoop *p
25a10 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68 65  Template){.  Whe
25a20 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c  reLoop **ppPrev,
25a30 20 2a 70 2c 20 2a 70 4e 65 78 74 20 3d 20 30 3b   *p, *pNext = 0;
25a40 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
25a50 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
25a60 3e 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74  >pWInfo;.  sqlit
25a70 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
25a80 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20  >pParse->db;..  
25a90 2f 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e  /* If pBuilder->
25aa0 70 4f 72 53 65 74 20 69 73 20 64 65 66 69 6e 65  pOrSet is define
25ab0 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b 65 65  d, then only kee
25ac0 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 63  p track of the c
25ad0 6f 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 70 72  osts.  ** and pr
25ae0 65 72 65 71 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  ereqs..  */.  if
25af0 28 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  ( pBuilder->pOrS
25b00 65 74 21 3d 30 20 29 7b 0a 23 69 66 20 57 48 45  et!=0 ){.#if WHE
25b10 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
25b20 20 20 20 20 75 31 36 20 6e 20 3d 20 70 42 75 69      u16 n = pBui
25b30 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b  lder->pOrSet->n;
25b40 0a 20 20 20 20 69 6e 74 20 78 20 3d 0a 23 65 6e  .    int x =.#en
25b50 64 69 66 0a 20 20 20 20 77 68 65 72 65 4f 72 49  dif.    whereOrI
25b60 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2d 3e  nsert(pBuilder->
25b70 70 4f 72 53 65 74 2c 20 70 54 65 6d 70 6c 61 74  pOrSet, pTemplat
25b80 65 2d 3e 70 72 65 72 65 71 2c 20 70 54 65 6d 70  e->prereq, pTemp
25b90 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20  late->rRun,.    
25ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bc0 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29  pTemplate->nOut)
25bd0 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  ;.#if WHERETRACE
25be0 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28  _ENABLED.    if(
25bf0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
25c00 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
25c10 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
25c20 69 6e 74 66 28 78 3f 22 20 20 20 6f 72 2d 25 64  intf(x?"   or-%d
25c30 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20 20  :  ":"   or-X:  
25c40 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20 77 68 65  ", n);.      whe
25c50 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d  reLoopPrint(pTem
25c60 70 6c 61 74 65 2c 20 70 57 49 6e 66 6f 2d 3e 70  plate, pWInfo->p
25c70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  TabList);.    }.
25c80 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
25c90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
25ca0 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f  ..  /* Search fo
25cb0 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  r an existing Wh
25cc0 65 72 65 4c 6f 6f 70 20 74 6f 20 6f 76 65 72 77  ereLoop to overw
25cd0 72 69 74 65 2c 20 6f 72 20 77 68 69 63 68 20 74  rite, or which t
25ce0 61 6b 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 69  akes.  ** priori
25cf0 74 79 20 6f 76 65 72 20 70 54 65 6d 70 6c 61 74  ty over pTemplat
25d00 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 70  e..  */.  for(pp
25d10 50 72 65 76 3d 26 70 57 49 6e 66 6f 2d 3e 70 4c  Prev=&pWInfo->pL
25d20 6f 6f 70 73 2c 20 70 3d 2a 70 70 50 72 65 76 3b  oops, p=*ppPrev;
25d30 20 70 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e 70   p; ppPrev=&p->p
25d40 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50  NextLoop, p=*ppP
25d50 72 65 76 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  rev){.    if( p-
25d60 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65  >iTab!=pTemplate
25d70 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f  ->iTab || p->iSo
25d80 72 74 49 64 78 21 3d 70 54 65 6d 70 6c 61 74 65  rtIdx!=pTemplate
25d90 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a 20 20  ->iSortIdx ){.  
25da0 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72      /* If either
25db0 20 74 68 65 20 69 54 61 62 20 6f 72 20 69 53 6f   the iTab or iSo
25dc0 72 74 49 64 78 20 76 61 6c 75 65 73 20 66 6f 72  rtIdx values for
25dd0 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61   two WhereLoop a
25de0 72 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20  re different.   
25df0 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65     ** then those
25e00 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64   WhereLoops need
25e10 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65   to be considere
25e20 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 4e  d separately.  N
25e30 65 69 74 68 65 72 20 69 73 0a 20 20 20 20 20 20  either is.      
25e40 2a 2a 20 61 20 63 61 6e 64 69 64 61 74 65 20 74  ** a candidate t
25e50 6f 20 72 65 70 6c 61 63 65 20 74 68 65 20 6f 74  o replace the ot
25e60 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f  her. */.      co
25e70 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
25e80 20 20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72    /* In the curr
25e90 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
25ea0 6f 6e 2c 20 74 68 65 20 72 53 65 74 75 70 20 76  on, the rSetup v
25eb0 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 7a  alue is either z
25ec0 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68  ero.    ** or th
25ed0 65 20 63 6f 73 74 20 6f 66 20 62 75 69 6c 64 69  e cost of buildi
25ee0 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  ng an automatic 
25ef0 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e  index (NlogN) an
25f00 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20  d the NlogN.    
25f10 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 66  ** is the same f
25f20 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65 20 57 68  or compatible Wh
25f30 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20  ereLoops. */.   
25f40 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74   assert( p->rSet
25f50 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61  up==0 || pTempla
25f60 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20  te->rSetup==0 . 
25f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f80 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54  || p->rSetup==pT
25f90 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
25fa0 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72 65  );..    /* where
25fb0 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 29 20 61  LoopAddBtree() a
25fc0 6c 77 61 79 73 20 67 65 6e 65 72 61 74 65 73 20  lways generates 
25fd0 61 6e 64 20 69 6e 73 65 72 74 73 20 74 68 65 20  and inserts the 
25fe0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a  automatic index.
25ff0 20 20 20 20 2a 2a 20 63 61 73 65 20 66 69 72 73      ** case firs
26000 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70 61 74  t.  Hence compat
26010 69 62 6c 65 20 63 61 6e 64 69 64 61 74 65 20 57  ible candidate W
26020 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20  hereLoops never 
26030 68 61 76 65 20 61 20 6c 61 72 67 65 72 0a 20 20  have a larger.  
26040 20 20 2a 2a 20 72 53 65 74 75 70 2e 20 43 61 6c    ** rSetup. Cal
26050 6c 20 74 68 69 73 20 53 45 54 55 50 2d 49 4e 56  l this SETUP-INV
26060 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73  ARIANT */.    as
26070 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e  sert( p->rSetup>
26080 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
26090 75 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 28  up );..    if( (
260a0 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
260b0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
260c0 70 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20 26  p->prereq.     &
260d0 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65  & p->rSetup<=pTe
260e0 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 0a 20  mplate->rSetup. 
260f0 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d      && p->rRun<=
26100 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 0a  pTemplate->rRun.
26110 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c       && p->nOut<
26120 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74  =pTemplate->nOut
26130 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
26140 20 54 68 69 73 20 62 72 61 6e 63 68 20 74 61 6b   This branch tak
26150 65 6e 20 77 68 65 6e 20 70 20 69 73 20 65 71 75  en when p is equ
26160 61 6c 20 6f 72 20 62 65 74 74 65 72 20 74 68 61  al or better tha
26170 6e 20 70 54 65 6d 70 6c 61 74 65 20 69 6e 20 0a  n pTemplate in .
26180 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 6f 66 20        ** all of 
26190 28 31 29 20 64 65 70 65 6e 64 65 6e 63 69 65 73  (1) dependencies
261a0 20 28 32 29 20 73 65 74 75 70 2d 63 6f 73 74 2c   (2) setup-cost,
261b0 20 28 33 29 20 72 75 6e 2d 63 6f 73 74 2c 20 61   (3) run-cost, a
261c0 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 34 29 20  nd.      ** (4) 
261d0 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
261e0 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20   rows. */.      
261f0 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
26200 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p==pTemplate->rS
26210 65 74 75 70 20 29 3b 0a 20 20 20 20 20 20 69 66  etup );.      if
26220 28 20 70 2d 3e 70 72 65 72 65 71 3d 3d 70 54 65  ( p->prereq==pTe
26230 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20  mplate->prereq. 
26240 20 20 20 20 20 20 26 26 20 70 2d 3e 6e 4c 54 65        && p->nLTe
26250 72 6d 3c 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c  rm<pTemplate->nL
26260 54 65 72 6d 0a 20 20 20 20 20 20 20 26 26 20 28  Term.       && (
26270 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 70 54 65  p->wsFlags & pTe
26280 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20  mplate->wsFlags 
26290 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
262a0 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70  !=0.       && (p
262b0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
262c0 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 75 2e 62  ==pTemplate->u.b
262d0 74 72 65 65 2e 70 49 6e 64 65 78 0a 20 20 20 20  tree.pIndex.    
262e0 20 20 20 20 20 20 7c 7c 20 70 54 65 6d 70 6c 61        || pTempla
262f0 74 65 2d 3e 72 52 75 6e 2b 70 2d 3e 6e 4c 54 65  te->rRun+p->nLTe
26300 72 6d 3c 3d 70 2d 3e 72 52 75 6e 2b 70 54 65 6d  rm<=p->rRun+pTem
26310 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 29 0a 20  plate->nLTerm). 
26320 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
26330 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 61 6e 20  /* Overwrite an 
26340 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
26350 6f 70 20 77 69 74 68 20 61 6e 20 73 69 6d 69 6c  op with an simil
26360 61 72 20 6f 6e 65 20 74 68 61 74 20 75 73 65 73  ar one that uses
26370 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 72 65  .        ** more
26380 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e   terms of the in
26390 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  dex */.        p
263a0 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c  Next = p->pNextL
263b0 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65  oop;.        bre
263c0 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
263d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 54 65 6d  .        /* pTem
263e0 70 6c 61 74 65 20 69 73 20 6e 6f 74 20 68 65 6c  plate is not hel
263f0 70 66 75 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2a  pful..        **
26400 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
26410 63 68 61 6e 67 69 6e 67 20 6f 72 20 61 64 64 69  changing or addi
26420 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20  ng anything */. 
26430 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72         goto wher
26440 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70  eLoopInsert_noop
26450 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
26460 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
26470 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e  eq & pTemplate->
26480 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61  prereq)==pTempla
26490 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20  te->prereq.     
264a0 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d  && p->rRun>=pTem
264b0 70 6c 61 74 65 2d 3e 72 52 75 6e 0a 20 20 20 20  plate->rRun.    
264c0 20 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65   && p->nOut>=pTe
264d0 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 0a 20 20 20  mplate->nOut.   
264e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 76 65   ){.      /* Ove
264f0 72 77 72 69 74 65 20 61 6e 20 65 78 69 73 74 69  rwrite an existi
26500 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74  ng WhereLoop wit
26510 68 20 61 20 62 65 74 74 65 72 20 6f 6e 65 3a 20  h a better one: 
26520 6f 6e 65 20 74 68 61 74 20 69 73 0a 20 20 20 20  one that is.    
26530 20 20 2a 2a 20 62 65 74 74 65 72 20 61 74 20 6f    ** better at o
26540 6e 65 20 6f 66 20 28 31 29 20 64 65 70 65 6e 64  ne of (1) depend
26550 65 6e 63 69 65 73 2c 20 28 32 29 20 73 65 74 75  encies, (2) setu
26560 70 2d 63 6f 73 74 2c 20 28 33 29 20 72 75 6e 2d  p-cost, (3) run-
26570 63 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 6f 72  cost.      ** or
26580 20 28 34 29 20 6e 75 6d 62 65 72 20 6f 66 20 6f   (4) number of o
26590 75 74 70 75 74 20 72 6f 77 73 2c 20 61 6e 64 20  utput rows, and 
265a0 69 73 20 6e 6f 20 77 6f 72 73 65 20 69 6e 20 61  is no worse in a
265b0 6e 79 20 6f 66 20 74 68 6f 73 65 0a 20 20 20 20  ny of those.    
265c0 20 20 2a 2a 20 63 61 74 65 67 6f 72 69 65 73 2e    ** categories.
265d0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
265e0 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65  ( p->rSetup>=pTe
265f0 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
26600 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41 52  ; /* SETUP-INVAR
26610 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20  IANT above */.  
26620 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
26630 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  NextLoop;.      
26640 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
26650 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
26660 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  ch this point it
26670 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68   means that eith
26680 65 72 20 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65  er p[] should be
26690 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20 2a   overwritten.  *
266a0 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65  * with pTemplate
266b0 5b 5d 20 69 66 20 70 5b 5d 20 65 78 69 73 74 73  [] if p[] exists
266c0 2c 20 6f 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20  , or if p==NULL 
266d0 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20  then allocate a 
266e0 6e 65 77 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f  new.  ** WhereLo
266f0 6f 70 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  op and insert it
26700 2e 0a 20 20 2a 2f 0a 23 69 66 20 57 48 45 52 45  ..  */.#if WHERE
26710 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
26720 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
26730 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
26740 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20     if( p!=0 ){. 
26750 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
26760 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 64 65 6c  gPrintf("ins-del
26770 3a 20 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65  :  ");.      whe
26780 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70  reLoopPrint(p, p
26790 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29  WInfo->pTabList)
267a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
267b0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
267c0 69 6e 73 2d 6e 65 77 3a 20 20 22 29 3b 0a 20 20  ins-new:  ");.  
267d0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
267e0 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e  (pTemplate, pWIn
267f0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20  fo->pTabList);. 
26800 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
26810 70 3d 3d 30 20 29 7b 0a 20 20 20 20 70 20 3d 20  p==0 ){.    p = 
26820 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
26830 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 57 68  aw(db, sizeof(Wh
26840 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20 20 69  ereLoop));.    i
26850 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
26860 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
26870 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74     whereLoopInit
26880 28 70 29 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65  (p);.  }.  where
26890 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20  LoopXfer(db, p, 
268a0 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70 2d  pTemplate);.  p-
268b0 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 70 4e 65  >pNextLoop = pNe
268c0 78 74 3b 0a 20 20 2a 70 70 50 72 65 76 20 3d 20  xt;.  *ppPrev = 
268d0 70 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46  p;.  if( (p->wsF
268e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
268f0 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b  TUALTABLE)==0 ){
26900 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  .    Index *pInd
26910 65 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e  ex = p->u.btree.
26920 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  pIndex;.    if( 
26930 70 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78  pIndex && pIndex
26940 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20  ->tnum==0 ){.   
26950 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49     p->u.btree.pI
26960 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ndex = 0;.    }.
26970 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
26980 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
26990 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20 69  mp here if the i
269a0 6e 73 65 72 74 20 69 73 20 61 20 6e 6f 2d 6f 70  nsert is a no-op
269b0 20 2a 2f 0a 77 68 65 72 65 4c 6f 6f 70 49 6e 73   */.whereLoopIns
269c0 65 72 74 5f 6e 6f 6f 70 3a 0a 23 69 66 20 57 48  ert_noop:.#if WH
269d0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
269e0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
269f0 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
26a00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
26a10 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 6e 6f  ugPrintf("ins-no
26a20 6f 70 3a 20 22 29 3b 0a 20 20 20 20 77 68 65 72  op: ");.    wher
26a30 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
26a40 6c 61 74 65 2c 20 70 57 49 6e 66 6f 2d 3e 70 54  late, pWInfo->pT
26a50 61 62 4c 69 73 74 29 3b 0a 20 20 7d 0a 23 65 6e  abList);.  }.#en
26a60 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
26a70 49 54 45 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a  ITE_OK;  .}../*.
26a80 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 57 68  ** Adjust the Wh
26a90 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c  ereLoop.nOut val
26aa0 75 65 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 61  ue downward to a
26ab0 63 63 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d 73  ccount for terms
26ac0 20 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45 52 45   of the.** WHERE
26ad0 20 63 6c 61 75 73 65 20 74 68 61 74 20 72 65 66   clause that ref
26ae0 65 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20  erence the loop 
26af0 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f  but which are no
26b00 74 20 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20  t used by an.** 
26b10 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  index..**.** In 
26b20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
26b30 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20  ementation, the 
26b40 66 69 72 73 74 20 65 78 74 72 61 20 57 48 45 52  first extra WHER
26b50 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 72 65  E clause term re
26b60 64 75 63 65 73 0a 2a 2a 20 74 68 65 20 6e 75 6d  duces.** the num
26b70 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
26b80 77 73 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f  ws by a factor o
26b90 66 20 31 30 20 61 6e 64 20 65 61 63 68 20 61 64  f 10 and each ad
26ba0 64 69 74 69 6f 6e 61 6c 20 74 65 72 6d 0a 2a 2a  ditional term.**
26bb0 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d   reduces the num
26bc0 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
26bd0 77 73 20 62 79 20 73 71 72 74 28 32 29 2e 0a 2a  ws by sqrt(2)..*
26be0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
26bf0 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a  ereLoopOutputAdj
26c00 75 73 74 28 57 68 65 72 65 43 6c 61 75 73 65 20  ust(WhereClause 
26c10 2a 70 57 43 2c 20 57 68 65 72 65 4c 6f 6f 70 20  *pWC, WhereLoop 
26c20 2a 70 4c 6f 6f 70 2c 20 69 6e 74 20 69 43 75 72  *pLoop, int iCur
26c30 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
26c40 70 54 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69  pTerm, *pX;.  Bi
26c50 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64  tmask notAllowed
26c60 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72   = ~(pLoop->prer
26c70 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  eq|pLoop->maskSe
26c80 6c 66 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  lf);.  int i, j;
26c90 0a 0a 20 20 69 66 28 20 21 4f 70 74 69 6d 69 7a  ..  if( !Optimiz
26ca0 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 43  ationEnabled(pWC
26cb0 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
26cc0 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 41 64 6a  ->db, SQLITE_Adj
26cd0 75 73 74 4f 75 74 45 73 74 29 20 29 7b 0a 20 20  ustOutEst) ){.  
26ce0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
26cf0 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d  for(i=pWC->nTerm
26d00 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
26d10 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b  i>0; i--, pTerm+
26d20 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65  +){.    if( (pTe
26d30 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
26d40 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 29  RM_VIRTUAL)!=0 )
26d50 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
26d60 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
26d70 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  l & pLoop->maskS
26d80 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  elf)==0 ) contin
26d90 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ue;.    if( (pTe
26da0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
26db0 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29  notAllowed)!=0 )
26dc0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
26dd0 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  or(j=pLoop->nLTe
26de0 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  rm-1; j>=0; j--)
26df0 7b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 4c 6f  {.      pX = pLo
26e00 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20  op->aLTerm[j];. 
26e10 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65       if( pX==pTe
26e20 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rm ) break;.    
26e30 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e    if( pX->iParen
26e40 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61  t>=0 && (&pWC->a
26e50 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d  [pX->iParent])==
26e60 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20  pTerm ) break;. 
26e70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30     }.    if( j<0
26e80 20 29 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b   ) pLoop->nOut +
26e90 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  = pTerm->truthPr
26ea0 6f 62 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ob;.  }.}../*.**
26eb0 20 57 65 20 68 61 76 65 20 73 6f 20 66 61 72 20   We have so far 
26ec0 6d 61 74 63 68 65 64 20 70 42 75 69 6c 64 65 72  matched pBuilder
26ed0 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
26ee0 6e 45 71 20 74 65 72 6d 73 20 6f 66 20 74 68 65  nEq terms of the
26ef0 20 69 6e 64 65 78 20 70 49 6e 64 65 78 2e 0a 2a   index pIndex..*
26f00 2a 20 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f  * Try to match o
26f10 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ne more..**.** I
26f20 66 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d  f pProbe->tnum==
26f30 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 70 49  0, that means pI
26f40 6e 64 65 78 20 69 73 20 61 20 66 61 6b 65 20 69  ndex is a fake i
26f50 6e 64 65 78 20 75 73 65 64 20 66 6f 72 20 74 68  ndex used for th
26f60 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
26f70 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61  MARY KEY..*/.sta
26f80 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
26f90 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 0a  pAddBtreeIndex(.
26fa0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
26fb0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 20  er *pBuilder,   
26fc0 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
26fd0 6f 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20  op factory */.  
26fe0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
26ff0 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20  tem *pSrc,      
27000 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  /* FROM clause t
27010 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  erm being analyz
27020 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
27030 50 72 6f 62 65 2c 20 20 20 20 20 20 20 20 20 20  Probe,          
27040 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
27050 64 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20  dex on pSrc */. 
27060 20 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20   LogEst nInMul  
27070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27080 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f   /* log(Number o
27090 66 20 69 74 65 72 61 74 69 6f 6e 73 20 64 75 65  f iterations due
270a0 20 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20   to IN) */.){.  
270b0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
270c0 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
270d0 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20  Info;  /* WHERE 
270e0 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78 74 20  analyse context 
270f0 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
27100 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
27110 72 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50  rse;        /* P
27120 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
27130 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
27140 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
27150 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
27160 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f  connection mallo
27170 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  c context */.  W
27180 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20  hereLoop *pNew; 
27190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
271a0 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65  * Template Where
271b0 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73 74  Loop under const
271c0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65  ruction */.  Whe
271d0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
271e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
271f0 41 20 57 68 65 72 65 54 65 72 6d 20 75 6e 64 65  A WhereTerm unde
27200 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20  r consideration 
27210 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b  */.  int opMask;
27220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27230 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70       /* Valid op
27240 65 72 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73  erators for cons
27250 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65  traints */.  Whe
27260 72 65 53 63 61 6e 20 73 63 61 6e 3b 20 20 20 20  reScan scan;    
27270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27280 49 74 65 72 61 74 6f 72 20 66 6f 72 20 57 48 45  Iterator for WHE
27290 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69  RE terms */.  Bi
272a0 74 6d 61 73 6b 20 73 61 76 65 64 5f 70 72 65 72  tmask saved_prer
272b0 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  eq;           /*
272c0 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
272d0 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  of pNew->prereq 
272e0 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
272f0 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  LTerm;          
27300 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
27310 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
27320 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  nLTerm */.  int 
27330 73 61 76 65 64 5f 6e 45 71 3b 20 20 20 20 20 20  saved_nEq;      
27340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
27350 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
27360 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
27370 45 71 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65  Eq */.  u32 save
27380 64 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20  d_wsFlags;      
27390 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
273a0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
273b0 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20  w->wsFlags */.  
273c0 4c 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75  LogEst saved_nOu
273d0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
273e0 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
273f0 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  e of pNew->nOut 
27400 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
27410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27420 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
27430 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74   the column in t
27440 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
27450 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
27460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
27470 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
27480 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73 74    LogEst nRowEst
27490 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
274a0 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 69    /* Estimated i
274b0 6e 64 65 78 20 73 65 6c 65 63 74 69 76 69 74 79  ndex selectivity
274c0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f   */.  LogEst rLo
274d0 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
274e0 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74        /* Logarit
274f0 68 6d 20 6f 66 20 74 61 62 6c 65 20 73 69 7a 65  hm of table size
27500 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
27510 2a 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d  *pTop = 0, *pBtm
27520 20 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64   = 0; /* Top and
27530 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f   bottom range co
27540 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20  nstraints */..  
27550 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
27560 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20 64 62 2d  >pNew;.  if( db-
27570 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
27580 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
27590 4d 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  MEM;..  assert( 
275a0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
275b0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
275c0 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  BLE)==0 );.  ass
275d0 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c  ert( (pNew->wsFl
275e0 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
275f0 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69  LIMIT)==0 );.  i
27600 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  f( pNew->wsFlags
27610 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
27620 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b  IT ){.    opMask
27630 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a   = WO_LT|WO_LE;.
27640 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 72 6f    }else if( pPro
27650 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28  be->tnum<=0 || (
27660 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  pSrc->jointype &
27670 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a   JT_LEFT)!=0 ){.
27680 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
27690 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57  EQ|WO_IN|WO_GT|W
276a0 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
276b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
276c0 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f  pMask = WO_EQ|WO
276d0 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f  _IN|WO_ISNULL|WO
276e0 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c  _GT|WO_GE|WO_LT|
276f0 57 4f 5f 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28  WO_LE;.  }.  if(
27700 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65   pProbe->bUnorde
27710 72 65 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20  red ) opMask &= 
27720 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  ~(WO_GT|WO_GE|WO
27730 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61  _LT|WO_LE);..  a
27740 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62  ssert( pNew->u.b
27750 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65  tree.nEq<=pProbe
27760 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69  ->nColumn );.  i
27770 66 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  f( pNew->u.btree
27780 2e 6e 45 71 20 3c 20 70 50 72 6f 62 65 2d 3e 6e  .nEq < pProbe->n
27790 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 69 43  Column ){.    iC
277a0 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43  ol = pProbe->aiC
277b0 6f 6c 75 6d 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74  olumn[pNew->u.bt
277c0 72 65 65 2e 6e 45 71 5d 3b 0a 20 20 20 20 6e 52  ree.nEq];.    nR
277d0 6f 77 45 73 74 20 3d 20 73 71 6c 69 74 65 33 4c  owEst = sqlite3L
277e0 6f 67 45 73 74 28 70 50 72 6f 62 65 2d 3e 61 69  ogEst(pProbe->ai
277f0 52 6f 77 45 73 74 5b 70 4e 65 77 2d 3e 75 2e 62  RowEst[pNew->u.b
27800 74 72 65 65 2e 6e 45 71 2b 31 5d 29 3b 0a 20 20  tree.nEq+1]);.  
27810 20 20 69 66 28 20 6e 52 6f 77 45 73 74 3d 3d 30    if( nRowEst==0
27820 20 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72   && pProbe->onEr
27830 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 6e  ror==OE_None ) n
27840 52 6f 77 45 73 74 20 3d 20 31 3b 0a 20 20 7d 65  RowEst = 1;.  }e
27850 6c 73 65 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  lse{.    iCol = 
27860 2d 31 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20  -1;.    nRowEst 
27870 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  = 0;.  }.  pTerm
27880 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74   = whereScanInit
27890 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72  (&scan, pBuilder
278a0 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75  ->pWC, pSrc->iCu
278b0 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20 20 20  rsor, iCol,.    
278c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278d0 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f      opMask, pPro
278e0 62 65 29 3b 0a 20 20 73 61 76 65 64 5f 6e 45 71  be);.  saved_nEq
278f0 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65   = pNew->u.btree
27900 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4c  .nEq;.  saved_nL
27910 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54  Term = pNew->nLT
27920 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73 46  erm;.  saved_wsF
27930 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46  lags = pNew->wsF
27940 6c 61 67 73 3b 0a 20 20 73 61 76 65 64 5f 70 72  lags;.  saved_pr
27950 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65  ereq = pNew->pre
27960 72 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75  req;.  saved_nOu
27970 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a  t = pNew->nOut;.
27980 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
27990 20 30 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d   0;.  rLogSize =
279a0 20 65 73 74 4c 6f 67 28 73 71 6c 69 74 65 33 4c   estLog(sqlite3L
279b0 6f 67 45 73 74 28 70 50 72 6f 62 65 2d 3e 61 69  ogEst(pProbe->ai
279c0 52 6f 77 45 73 74 5b 30 5d 29 29 3b 0a 20 20 66  RowEst[0]));.  f
279d0 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  or(; rc==SQLITE_
279e0 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20  OK && pTerm!=0; 
279f0 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61  pTerm = whereSca
27a00 6e 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20  nNext(&scan)){. 
27a10 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a     int nIn = 0;.
27a20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
27a30 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
27a40 41 54 34 0a 20 20 20 20 69 6e 74 20 6e 52 65 63  AT4.    int nRec
27a50 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72  Valid = pBuilder
27a60 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e  ->nRecValid;.#en
27a70 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 54 65  dif.    if( (pTe
27a80 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
27a90 4f 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65  O_ISNULL || (pTe
27aa0 72 6d 2d 3e 77 74 46 6c 61 67 73 26 54 45 52 4d  rm->wtFlags&TERM
27ab0 5f 56 4e 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20  _VNULL)!=0).    
27ac0 20 26 26 20 28 69 43 6f 6c 3c 30 20 7c 7c 20 70   && (iCol<0 || p
27ad0 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  Src->pTab->aCol[
27ae0 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 29 0a 20  iCol].notNull). 
27af0 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74     ){.      cont
27b00 69 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f 72 65 20  inue; /* ignore 
27b10 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f  IS [NOT] NULL co
27b20 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 4e 4f 54  nstraints on NOT
27b30 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f   NULL columns */
27b40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
27b50 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
27b60 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  t & pNew->maskSe
27b70 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  lf ) continue;..
27b80 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
27b90 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f  ->nOut==saved_nO
27ba0 75 74 20 29 3b 0a 0a 20 20 20 20 70 4e 65 77 2d  ut );..    pNew-
27bb0 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64  >wsFlags = saved
27bc0 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e  _wsFlags;.    pN
27bd0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
27be0 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20  = saved_nEq;.   
27bf0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
27c00 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20  saved_nLTerm;.  
27c10 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
27c20 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
27c30 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20  pNew->nLTerm+1) 
27c40 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20  ) break; /* OOM 
27c50 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  */.    pNew->aLT
27c60 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
27c70 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  ++] = pTerm;.   
27c80 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
27c90 28 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20  (saved_prereq | 
27ca0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
27cb0 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73  ht) & ~pNew->mas
27cc0 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4e 65 77 2d  kSelf;.    pNew-
27cd0 3e 72 52 75 6e 20 3d 20 72 4c 6f 67 53 69 7a 65  >rRun = rLogSize
27ce0 3b 20 2f 2a 20 42 61 73 65 6c 69 6e 65 20 63 6f  ; /* Baseline co
27cf0 73 74 20 69 73 20 6c 6f 67 32 28 4e 29 2e 20 20  st is log2(N).  
27d00 41 64 6a 75 73 74 6d 65 6e 74 73 20 62 65 6c 6f  Adjustments belo
27d10 77 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65  w */.    if( pTe
27d20 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
27d30 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45  WO_IN ){.      E
27d40 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
27d50 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
27d60 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
27d70 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  = WHERE_COLUMN_I
27d80 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  N;.      if( Exp
27d90 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
27da0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
27db0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
27dc0 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  "x IN (SELECT ..
27dd0 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68  .)":  TUNING: th
27de0 65 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73  e SELECT returns
27df0 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20   25 rows */.    
27e00 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61      nIn = 46;  a
27e10 73 73 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74  ssert( 46==sqlit
27e20 65 33 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a  e3LogEst(25) );.
27e30 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
27e40 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e  ALWAYS(pExpr->x.
27e50 70 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e  pList && pExpr->
27e60 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  x.pList->nExpr) 
27e70 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78  ){.        /* "x
27e80 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75   IN (value, valu
27e90 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20  e, ...)" */.    
27ea0 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65      nIn = sqlite
27eb0 33 4c 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78  3LogEst(pExpr->x
27ec0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  .pList->nExpr);.
27ed0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e        }.      pN
27ee0 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 3b  ew->rRun += nIn;
27ef0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  .      pNew->u.b
27f00 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20  tree.nEq++;.    
27f10 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e    pNew->nOut = n
27f20 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 20  RowEst + nInMul 
27f30 2b 20 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65  + nIn;.    }else
27f40 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
27f50 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 29 20  rator & (WO_EQ) 
27f60 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
27f70 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
27f80 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  & (WHERE_COLUMN_
27f90 4e 55 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  NULL|WHERE_COLUM
27fa0 4e 5f 49 4e 29 29 21 3d 30 0a 20 20 20 20 20 20  N_IN))!=0.      
27fb0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6e              || n
27fc0 49 6e 4d 75 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  InMul==0 );.    
27fd0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
27fe0 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
27ff0 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  EQ;.      if( iC
28000 6f 6c 3c 30 20 20 0a 20 20 20 20 20 20 20 7c 7c  ol<0  .       ||
28010 20 28 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f   (pProbe->onErro
28020 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 6e 49  r!=OE_None && nI
28030 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20  nMul==0.        
28040 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74     && pNew->u.bt
28050 72 65 65 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d  ree.nEq==pProbe-
28060 3e 6e 43 6f 6c 75 6d 6e 2d 31 29 0a 20 20 20 20  >nColumn-1).    
28070 20 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73    ){.        ass
28080 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c  ert( (pNew->wsFl
28090 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
280a0 4d 4e 5f 49 4e 29 3d 3d 30 20 7c 7c 20 69 43 6f  MN_IN)==0 || iCo
280b0 6c 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  l<0 );.        p
280c0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
280d0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
280e0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77      }.      pNew
280f0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b  ->u.btree.nEq++;
28100 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
28110 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49  t = nRowEst + nI
28120 6e 4d 75 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  nMul;.    }else 
28130 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
28140 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c  ator & (WO_ISNUL
28150 4c 29 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  L) ){.      pNew
28160 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
28170 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a  RE_COLUMN_NULL;.
28180 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
28190 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20  ree.nEq++;.     
281a0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 53 20 4e   /* TUNING: IS N
281b0 55 4c 4c 20 73 65 6c 65 63 74 73 20 32 20 72 6f  ULL selects 2 ro
281c0 77 73 20 2a 2f 0a 20 20 20 20 20 20 6e 49 6e 20  ws */.      nIn 
281d0 3d 20 31 30 3b 20 20 61 73 73 65 72 74 28 20 31  = 10;  assert( 1
281e0 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
281f0 28 32 29 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  (2) );.      pNe
28200 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73  w->nOut = nRowEs
28210 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e  t + nInMul + nIn
28220 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
28230 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
28240 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
28250 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
28260 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
28270 61 74 6f 72 20 26 20 57 4f 5f 47 54 20 29 3b 0a  ator & WO_GT );.
28280 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28290 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
282a0 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20   & WO_GE );.    
282b0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
282c0 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
282d0 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f  RANGE|WHERE_BTM_
282e0 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 42 74  LIMIT;.      pBt
282f0 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  m = pTerm;.     
28300 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 7d   pTop = 0;.    }
28310 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
28320 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
28330 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f  ator & (WO_LT|WO
28340 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65  _LE) );.      te
28350 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
28360 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 54  Operator & WO_LT
28370 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
28380 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
28390 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a  ator & WO_LE );.
283a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
283b0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
283c0 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
283d0 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  TOP_LIMIT;.     
283e0 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20   pTop = pTerm;. 
283f0 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65       pBtm = (pNe
28400 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
28410 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30  RE_BTM_LIMIT)!=0
28420 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
28430 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c          pNew->aL
28440 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
28450 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a  m-2] : 0;.    }.
28460 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73      if( pNew->ws
28470 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
28480 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20  LUMN_RANGE ){.  
28490 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f      /* Adjust nO
284a0 75 74 20 61 6e 64 20 72 52 75 6e 20 66 6f 72 20  ut and rRun for 
284b0 53 54 41 54 33 20 72 61 6e 67 65 20 76 61 6c 75  STAT3 range valu
284c0 65 73 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  es */.      asse
284d0 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d  rt( pNew->nOut==
284e0 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20  saved_nOut );.  
284f0 20 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63      whereRangeSc
28500 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
28510 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54  uilder, pBtm, pT
28520 6f 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d  op, pNew);.    }
28530 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
28540 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
28550 54 41 54 34 0a 20 20 20 20 69 66 28 20 6e 49 6e  TAT4.    if( nIn
28560 4d 75 6c 3d 3d 30 20 0a 20 20 20 20 20 26 26 20  Mul==0 .     && 
28570 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20  pProbe->nSample 
28580 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75  .     && pNew->u
28590 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f  .btree.nEq<=pPro
285a0 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20  be->nSampleCol. 
285b0 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
285c0 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
285d0 51 4c 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20  QLITE_Stat3) .  
285e0 20 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20    ){.      Expr 
285f0 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
28600 70 45 78 70 72 3b 0a 20 20 20 20 20 20 74 52 6f  pExpr;.      tRo
28610 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20  wcnt nOut = 0;. 
28620 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
28630 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
28640 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21  _EQ|WO_ISNULL))!
28650 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  =0 ){.        te
28660 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
28670 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
28680 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
28690 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
286a0 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
286b0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  LL );.        rc
286c0 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61   = whereEqualSca
286d0 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
286e0 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 70 52  ilder, pExpr->pR
286f0 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20  ight, &nOut);.  
28700 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
28710 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
28720 26 20 57 4f 5f 49 4e 29 0a 20 20 20 20 20 20 20  & WO_IN).       
28730 20 20 20 20 20 20 26 26 20 20 21 45 78 70 72 48        &&  !ExprH
28740 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
28750 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
28760 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
28770 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28   whereInScanEst(
28780 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
28790 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
287a0 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  , &nOut);.      
287b0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
287c0 6e 4f 75 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  nOut==0 || rc==S
287d0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
287e0 20 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a 20 20    if( nOut ){.  
287f0 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 73 71 6c        nOut = sql
28800 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29  ite3LogEst(nOut)
28810 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
28820 6e 4f 75 74 20 3d 20 4d 49 4e 28 6e 4f 75 74 2c  nOut = MIN(nOut,
28830 20 73 61 76 65 64 5f 6e 4f 75 74 29 3b 0a 20 20   saved_nOut);.  
28840 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
28850 69 66 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77  if.    if( (pNew
28860 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
28870 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52  RE_IDX_ONLY|WHER
28880 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20  E_IPK))==0 ){.  
28890 20 20 20 20 2f 2a 20 45 61 63 68 20 72 6f 77 20      /* Each row 
288a0 69 6e 76 6f 6c 76 65 73 20 61 20 73 74 65 70 20  involves a step 
288b0 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68  of the index, th
288c0 65 6e 20 61 20 62 69 6e 61 72 79 20 73 65 61 72  en a binary sear
288d0 63 68 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ch of.      ** t
288e0 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 2a 2f  he main table */
288f0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
28900 6e 20 3d 20 20 73 71 6c 69 74 65 33 4c 6f 67 45  n =  sqlite3LogE
28910 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e  stAdd(pNew->rRun
28920 2c 72 4c 6f 67 53 69 7a 65 3e 32 37 20 3f 20 72  ,rLogSize>27 ? r
28930 4c 6f 67 53 69 7a 65 2d 31 37 20 3a 20 31 30 29  LogSize-17 : 10)
28940 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 53  ;.    }.    /* S
28950 74 65 70 20 63 6f 73 74 20 66 6f 72 20 65 61 63  tep cost for eac
28960 68 20 6f 75 74 70 75 74 20 72 6f 77 20 2a 2f 0a  h output row */.
28970 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
28980 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
28990 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e  d(pNew->rRun, pN
289a0 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 77  ew->nOut);.    w
289b0 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64  hereLoopOutputAd
289c0 6a 75 73 74 28 70 42 75 69 6c 64 65 72 2d 3e 70  just(pBuilder->p
289d0 57 43 2c 20 70 4e 65 77 2c 20 70 53 72 63 2d 3e  WC, pNew, pSrc->
289e0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 72 63  iCursor);.    rc
289f0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
28a00 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
28a10 77 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65  w);.    if( (pNe
28a20 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
28a30 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30  RE_TOP_LIMIT)==0
28a40 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75  .     && pNew->u
28a50 2e 62 74 72 65 65 2e 6e 45 71 3c 28 70 50 72 6f  .btree.nEq<(pPro
28a60 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20 28 70  be->nColumn + (p
28a70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 21 3d 30 29  Probe->zName!=0)
28a80 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77  ).    ){.      w
28a90 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
28aa0 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20  Index(pBuilder, 
28ab0 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49  pSrc, pProbe, nI
28ac0 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d  nMul+nIn);.    }
28ad0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
28ae0 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69  = saved_nOut;.#i
28af0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
28b00 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
28b10 34 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  4.    pBuilder->
28b20 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63  nRecValid = nRec
28b30 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20  Valid;.#endif.  
28b40 7d 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  }.  pNew->prereq
28b50 20 3d 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b   = saved_prereq;
28b60 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  .  pNew->u.btree
28b70 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71  .nEq = saved_nEq
28b80 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  ;.  pNew->wsFlag
28b90 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67  s = saved_wsFlag
28ba0 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  s;.  pNew->nOut 
28bb0 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20  = saved_nOut;.  
28bc0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73  pNew->nLTerm = s
28bd0 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 72  aved_nLTerm;.  r
28be0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
28bf0 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 69  ** Return True i
28c00 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
28c10 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67   that pIndex mig
28c20 68 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a  ht be useful in.
28c30 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  ** implementing 
28c40 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
28c50 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e  use in pBuilder.
28c60 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61  .**.** Return Fa
28c70 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65 72 20  lse if pBuilder 
28c80 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
28c90 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
28ca0 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65  use or.** if the
28cb0 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72  re is no way for
28cc0 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73   pIndex to be us
28cd0 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e  eful in implemen
28ce0 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44  ting that.** ORD
28cf0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f  ER BY clause..*/
28d00 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65  .static int inde
28d10 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72  xMightHelpWithOr
28d20 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f  derBy(.  WhereLo
28d30 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
28d40 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49  der,.  Index *pI
28d50 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72  ndex,.  int iCur
28d60 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73  sor.){.  ExprLis
28d70 74 20 2a 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69  t *pOB;.  int ii
28d80 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e  , jj;..  if( pIn
28d90 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  dex->bUnordered 
28da0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
28db0 28 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64 65  ( (pOB = pBuilde
28dc0 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  r->pWInfo->pOrde
28dd0 72 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  rBy)==0 ) return
28de0 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   0;.  for(ii=0; 
28df0 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69  ii<pOB->nExpr; i
28e00 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
28e10 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
28e20 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
28e30 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29  OB->a[ii].pExpr)
28e40 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
28e50 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
28e60 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
28e70 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
28e80 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
28e90 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c     for(jj=0; jj<
28ea0 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pIndex->nColumn;
28eb0 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   jj++){.        
28ec0 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
28ed0 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f  mn==pIndex->aiCo
28ee0 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72  lumn[jj] ) retur
28ef0 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
28f00 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
28f10 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
28f20 72 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65  rn a bitmask whe
28f30 72 65 20 31 73 20 69 6e 64 69 63 61 74 65 20 74  re 1s indicate t
28f40 68 61 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f  hat the correspo
28f50 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a  nding column of.
28f60 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  ** the table is 
28f70 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78  used by an index
28f80 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73  .  Only the firs
28f90 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65  t 63 columns are
28fa0 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a   considered..*/.
28fb0 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63  static Bitmask c
28fc0 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e  olumnsInIndex(In
28fd0 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69  dex *pIdx){.  Bi
28fe0 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69  tmask m = 0;.  i
28ff0 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49  nt j;.  for(j=pI
29000 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a  dx->nColumn-1; j
29010 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69  >=0; j--){.    i
29020 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43  nt x = pIdx->aiC
29030 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 61 73  olumn[j];.    as
29040 73 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20  sert( x>=0 );.  
29050 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42    testcase( x==B
29060 4d 53 2d 31 20 29 3b 0a 20 20 20 20 74 65 73 74  MS-1 );.    test
29070 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29  case( x==BMS-2 )
29080 3b 0a 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d  ;.    if( x<BMS-
29090 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54  1 ) m |= MASKBIT
290a0 28 78 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (x);.  }.  retur
290b0 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b  n m;.}../* Check
290c0 20 74 6f 20 73 65 65 20 69 66 20 61 20 70 61 72   to see if a par
290d0 74 69 61 6c 20 69 6e 64 65 78 20 77 69 74 68 20  tial index with 
290e0 70 50 61 72 74 49 6e 64 65 78 57 68 65 72 65 20  pPartIndexWhere 
290f0 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 69  can be used.** i
29100 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 71 75  n the current qu
29110 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ery.  Return tru
29120 65 20 69 66 20 69 74 20 63 61 6e 20 62 65 20 61  e if it can be a
29130 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  nd false if not.
29140 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
29150 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
29160 6c 49 6e 64 65 78 28 69 6e 74 20 69 54 61 62 2c  lIndex(int iTab,
29170 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
29180 43 2c 20 45 78 70 72 20 2a 70 57 68 65 72 65 29  C, Expr *pWhere)
29190 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  {.  int i;.  Whe
291a0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
291b0 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d   for(i=0, pTerm=
291c0 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
291d0 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
291e0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
291f0 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
29200 78 70 72 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  xpr(pTerm->pExpr
29210 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62 29 20  , pWhere, iTab) 
29220 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
29230 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
29240 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65  *.** Add all Whe
29250 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66  reLoop objects f
29260 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  or a single tabl
29270 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77 68  e of the join wh
29280 65 72 65 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a  ere the table.**
29290 20 69 73 20 69 64 65 6e 66 69 65 64 20 62 79 20   is idenfied by 
292a0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
292b0 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c  iTab.  That tabl
292c0 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
292d0 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72 65  to be.** a b-tre
292e0 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 76  e table, not a v
292f0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  irtual table..*/
29300 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
29310 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 0a 20  eLoopAddBtree(. 
29320 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
29330 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20  r *pBuilder, /* 
29340 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66  WHERE clause inf
29350 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  ormation */.  Bi
29360 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 20 20 20  tmask mExtra    
29370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
29380 72 61 20 70 72 65 72 65 71 75 65 73 69 74 65 73  ra prerequesites
29390 20 66 6f 72 20 75 73 69 6e 67 20 74 68 69 73 20   for using this 
293a0 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68  table */.){.  Wh
293b0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
293c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
293d0 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74  RE analysis cont
293e0 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
293f0 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20  pProbe;         
29400 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
29410 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69   we are evaluati
29420 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50  ng */.  Index sP
29430 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
29440 20 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e      /* A fake in
29450 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  dex object for t
29460 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a  he primary key *
29470 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 69 52 6f  /.  tRowcnt aiRo
29480 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20  wEstPk[2];      
29490 2f 2a 20 54 68 65 20 61 69 52 6f 77 45 73 74 5b  /* The aiRowEst[
294a0 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  ] value for the 
294b0 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  sPk index */.  i
294c0 6e 74 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20  nt aiColumnPk = 
294d0 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  -1;        /* Th
294e0 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75  e aColumn[] valu
294f0 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e  e for the sPk in
29500 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  dex */.  SrcList
29510 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
29520 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
29530 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
29540 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
29550 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20   *pSrc;  /* The 
29560 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65  FROM clause btre
29570 65 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f  e term to add */
29580 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
29590 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew;            /
295a0 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65  * Template Where
295b0 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Loop object */. 
295c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
295d0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  _OK;         /* 
295e0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
295f0 20 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20   int iSortIdx = 
29600 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  1;           /* 
29610 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  Index number */.
29620 20 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20    int b;        
29630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29640 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   A boolean value
29650 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69   */.  LogEst rSi
29660 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
29670 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72    /* number of r
29680 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
29690 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f   */.  LogEst rLo
296a0 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
296b0 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f    /* Logarithm o
296c0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
296d0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
296e0 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
296f0 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20  se *pWC;        
29700 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64     /* The parsed
29710 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
29720 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
29730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29740 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75  * Table being qu
29750 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e  eried */.  .  pN
29760 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
29770 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20  New;.  pWInfo = 
29780 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
29790 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
297a0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
297b0 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69  .  pSrc = pTabLi
297c0 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54  st->a + pNew->iT
297d0 61 62 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72  ab;.  pTab = pSr
297e0 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 20 3d  c->pTab;.  pWC =
297f0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
29800 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72    assert( !IsVir
29810 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29  tual(pSrc->pTab)
29820 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d   );..  if( pSrc-
29830 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f  >pIndex ){.    /
29840 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20  * An INDEXED BY 
29850 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73  clause specifies
29860 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e   a particular in
29870 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  dex to use */.  
29880 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d    pProbe = pSrc-
29890 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65  >pIndex;.  }else
298a0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69  {.    /* There i
298b0 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20  s no INDEXED BY 
298c0 63 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65 20  clause.  Create 
298d0 61 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a  a fake Index obj
298e0 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20  ect in local.   
298f0 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b   ** variable sPk
29900 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68   to represent th
29910 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20  e rowid primary 
29920 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65  key index.  Make
29930 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b   this.    ** fak
29940 65 20 69 6e 64 65 78 20 74 68 65 20 66 69 72 73  e index the firs
29950 74 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20  t in a chain of 
29960 49 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69  Index objects wi
29970 74 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65  th all of the re
29980 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  al.    ** indice
29990 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20  s to follow */. 
299a0 20 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74     Index *pFirst
299b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
299c0 20 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72     /* First of r
299d0 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74  eal indices on t
299e0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  he table */.    
299f0 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20  memset(&sPk, 0, 
29a00 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a  sizeof(Index));.
29a10 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20      sPk.nColumn 
29a20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43  = 1;.    sPk.aiC
29a30 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d  olumn = &aiColum
29a40 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52  nPk;.    sPk.aiR
29a50 6f 77 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74  owEst = aiRowEst
29a60 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72  Pk;.    sPk.onEr
29a70 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65  ror = OE_Replace
29a80 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65  ;.    sPk.pTable
29a90 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 61 69 52   = pTab;.    aiR
29aa0 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54 61  owEstPk[0] = pTa
29ab0 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20  b->nRowEst;.    
29ac0 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20  aiRowEstPk[1] = 
29ad0 31 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d 20  1;.    pFirst = 
29ae0 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64  pSrc->pTab->pInd
29af0 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72 63  ex;.    if( pSrc
29b00 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  ->notIndexed==0 
29b10 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
29b20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66 20  real indices of 
29b30 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f 6e  the table are on
29b40 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69 66  ly considered if
29b50 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f   the.      ** NO
29b60 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69 66  T INDEXED qualif
29b70 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  ier is omitted f
29b80 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  rom the FROM cla
29b90 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b  use */.      sPk
29ba0 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b  .pNext = pFirst;
29bb0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f 62  .    }.    pProb
29bc0 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20  e = &sPk;.  }.  
29bd0 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4c  rSize = sqlite3L
29be0 6f 67 45 73 74 28 70 54 61 62 2d 3e 6e 52 6f 77  ogEst(pTab->nRow
29bf0 45 73 74 29 3b 0a 20 20 72 4c 6f 67 53 69 7a 65  Est);.  rLogSize
29c00 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29   = estLog(rSize)
29c10 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
29c20 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
29c30 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f  _INDEX.  /* Auto
29c40 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f  matic indexes */
29c50 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64 65 72  .  if( !pBuilder
29c60 2d 3e 70 4f 72 53 65 74 0a 20 20 20 26 26 20 28  ->pOrSet.   && (
29c70 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
29c80 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
29c90 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30  TE_AutoIndex)!=0
29ca0 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70 49 6e  .   && pSrc->pIn
29cb0 64 65 78 3d 3d 30 0a 20 20 20 26 26 20 21 70 53  dex==0.   && !pS
29cc0 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  rc->viaCoroutine
29cd0 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 6e 6f  .   && !pSrc->no
29ce0 74 49 6e 64 65 78 65 64 0a 20 20 20 26 26 20 21  tIndexed.   && !
29cf0 70 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74  pSrc->isCorrelat
29d00 65 64 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47  ed.  ){.    /* G
29d10 65 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64  enerate auto-ind
29d20 65 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f  ex WhereLoops */
29d30 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
29d40 70 54 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65  pTerm;.    Where
29d50 54 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70  Term *pWCEnd = p
29d60 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65  WC->a + pWC->nTe
29d70 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72  rm;.    for(pTer
29d80 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51  m=pWC->a; rc==SQ
29d90 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d  LITE_OK && pTerm
29da0 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  <pWCEnd; pTerm++
29db0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ){.      if( pTe
29dc0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
29dd0 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  & pNew->maskSelf
29de0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
29df0 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
29e00 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
29e10 70 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20  pSrc, 0) ){.    
29e20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
29e30 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20  e.nEq = 1;.     
29e40 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
29e50 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  .pIndex = 0;.   
29e60 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72       pNew->nLTer
29e70 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  m = 1;.        p
29e80 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  New->aLTerm[0] =
29e90 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
29ea0 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74  /* TUNING: One-t
29eb0 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d  ime cost for com
29ec0 70 75 74 69 6e 67 20 74 68 65 20 61 75 74 6f 6d  puting the autom
29ed0 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a 20 20  atic index is.  
29ee0 20 20 20 20 20 20 2a 2a 20 61 70 70 72 6f 78 69        ** approxi
29ef0 6d 61 74 65 6c 79 20 37 2a 4e 2a 6c 6f 67 32 28  mately 7*N*log2(
29f00 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  N) where N is th
29f10 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
29f20 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   in.        ** t
29f30 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69  he table being i
29f40 6e 64 65 78 65 64 2e 20 2a 2f 0a 20 20 20 20 20  ndexed. */.     
29f50 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
29f60 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69  = rLogSize + rSi
29f70 7a 65 20 2b 20 32 38 3b 20 20 61 73 73 65 72 74  ze + 28;  assert
29f80 28 20 32 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 28==sqlite3Log
29f90 45 73 74 28 37 29 20 29 3b 0a 20 20 20 20 20 20  Est(7) );.      
29fa0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63    /* TUNING: Eac
29fb0 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79  h index lookup y
29fc0 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e  ields 20 rows in
29fd0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69   the table.  Thi
29fe0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  s.        ** is 
29ff0 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75 73  more than the us
2a000 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20  ual guess of 10 
2a010 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68  rows, since we h
2a020 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20  ave no way.     
2a030 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 6e 69 6e     ** of knownin
2a040 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20  g how selective 
2a050 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75  the index will u
2a060 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49  ltimately be.  I
2a070 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20  t would.        
2a080 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73  ** not be unreas
2a090 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74  onable to make t
2a0a0 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c  his value much l
2a0b0 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  arger. */.      
2a0c0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34    pNew->nOut = 4
2a0d0 33 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d  3;  assert( 43==
2a0e0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 30  sqlite3LogEst(20
2a0f0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) );.        pNe
2a100 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
2a110 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53  3LogEstAdd(rLogS
2a120 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b  ize,pNew->nOut);
2a130 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
2a140 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41  sFlags = WHERE_A
2a150 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20  UTO_INDEX;.     
2a160 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
2a170 3d 20 6d 45 78 74 72 61 20 7c 20 70 54 65 72 6d  = mExtra | pTerm
2a180 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
2a190 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
2a1a0 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
2a1b0 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
2a1c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
2a1d0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2a1e0 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
2a1f0 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f  NDEX */..  /* Lo
2a200 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69  op over all indi
2a210 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b  ces.  */.  for(;
2a220 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2a230 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65  & pProbe; pProbe
2a240 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20  =pProbe->pNext, 
2a250 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20  iSortIdx++){.   
2a260 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50 61   if( pProbe->pPa
2a270 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20  rtIdxWhere!=0.  
2a280 20 20 20 26 26 20 21 77 68 65 72 65 55 73 61 62     && !whereUsab
2a290 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 70  lePartialIndex(p
2a2a0 4e 65 77 2d 3e 69 54 61 62 2c 20 70 57 43 2c 20  New->iTab, pWC, 
2a2b0 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78  pProbe->pPartIdx
2a2c0 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20  Where) ){.      
2a2d0 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61  continue;  /* Pa
2a2e0 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61 70  rtial index inap
2a2f0 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
2a300 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  is query */.    
2a310 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  }.    pNew->u.bt
2a320 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20  ree.nEq = 0;.   
2a330 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
2a340 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f  0;.    pNew->iSo
2a350 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70  rtIdx = 0;.    p
2a360 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
2a370 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
2a380 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20  q = mExtra;.    
2a390 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
2a3a0 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ze;.    pNew->u.
2a3b0 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
2a3c0 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69  Probe;.    b = i
2a3d0 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
2a3e0 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64 65  hOrderBy(pBuilde
2a3f0 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d  r, pProbe, pSrc-
2a400 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f  >iCursor);.    /
2a410 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45  * The ONEPASS_DE
2a420 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65  SIRED flags neve
2a430 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65  r occurs togethe
2a440 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59 20  r with ORDER BY 
2a450 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
2a460 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2a470 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2a480 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
2a490 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  | b==0 );.    if
2a4a0 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d  ( pProbe->tnum<=
2a4b0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  0 ){.      /* In
2a4c0 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65  teger primary ke
2a4d0 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  y index */.     
2a4e0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
2a4f0 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20   WHERE_IPK;..   
2a500 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65     /* Full table
2a510 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70   scan */.      p
2a520 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
2a530 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30  b ? iSortIdx : 0
2a540 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
2a550 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20  G: Cost of full 
2a560 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 33 2a  table scan is 3*
2a570 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20  (N + log2(N)).. 
2a580 20 20 20 20 20 2a 2a 20 20 2b 20 20 54 68 65 20       **  +  The 
2a590 65 78 74 72 61 20 33 20 66 61 63 74 6f 72 20 69  extra 3 factor i
2a5a0 73 20 74 6f 20 65 6e 63 6f 75 72 61 67 65 20 74  s to encourage t
2a5b0 68 65 20 75 73 65 20 6f 66 20 69 6e 64 65 78 65  he use of indexe
2a5c0 64 20 6c 6f 6f 6b 75 70 73 0a 20 20 20 20 20 20  d lookups.      
2a5d0 2a 2a 20 20 20 20 20 6f 76 65 72 20 66 75 6c 6c  **     over full
2a5e0 20 73 63 61 6e 73 2e 20 20 46 49 58 4d 45 20 2a   scans.  FIXME *
2a5f0 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52  /.      pNew->rR
2a600 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
2a610 73 74 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67  stAdd(rSize,rLog
2a620 53 69 7a 65 29 20 2b 20 31 36 3b 0a 20 20 20 20  Size) + 16;.    
2a630 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
2a640 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65  tAdjust(pWC, pNe
2a650 77 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  w, pSrc->iCursor
2a660 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  );.      rc = wh
2a670 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
2a680 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
2a690 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
2a6a0 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  = rSize;.      i
2a6b0 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
2a6c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a6d0 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63  Bitmask m = pSrc
2a6e0 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c  ->colUsed & ~col
2a6f0 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50 72 6f  umnsInIndex(pPro
2a700 62 65 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  be);.      pNew-
2a710 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30  >wsFlags = (m==0
2a720 29 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f  ) ? (WHERE_IDX_O
2a730 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45  NLY|WHERE_INDEXE
2a740 44 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58  D) : WHERE_INDEX
2a750 45 44 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75  ED;..      /* Fu
2a760 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e 64 65  ll scan via inde
2a770 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62  x */.      if( b
2a780 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d  .       || ( m==
2a790 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50  0.         && pP
2a7a0 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64  robe->bUnordered
2a7b0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
2a7c0 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
2a7d0 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a  <pTab->szTabRow.
2a7e0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
2a7f0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2a800 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
2a810 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20  DESIRED)==0.    
2a820 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 47       && sqlite3G
2a830 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65  lobalConfig.bUse
2a840 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26 20  Cis.         && 
2a850 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
2a860 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  led(pWInfo->pPar
2a870 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43  se->db, SQLITE_C
2a880 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20  overIdxScan).   
2a890 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 29         ).      )
2a8a0 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
2a8b0 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69  iSortIdx = b ? i
2a8c0 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20  SortIdx : 0;.   
2a8d0 20 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b       if( m==0 ){
2a8e0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55  .          /* TU
2a8f0 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20  NING: Cost of a 
2a900 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73  covering index s
2a910 63 61 6e 20 69 73 20 4b 2a 28 4e 20 2b 20 6c 6f  can is K*(N + lo
2a920 67 32 28 4e 29 29 2e 0a 20 20 20 20 20 20 20 20  g2(N))..        
2a930 20 20 2a 2a 20 20 2b 20 20 54 68 65 20 65 78 74    **  +  The ext
2a940 72 61 20 66 61 63 74 6f 72 20 4b 20 6f 66 20 62  ra factor K of b
2a950 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33  etween 1.1 and 3
2a960 2e 30 20 74 68 61 74 20 64 65 70 65 6e 64 73 0a  .0 that depends.
2a970 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20            **    
2a980 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65   on the relative
2a990 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20 74 61   sizes of the ta
2a9a0 62 6c 65 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ble and the inde
2a9b0 78 2e 20 20 4b 0a 20 20 20 20 20 20 20 20 20 20  x.  K.          
2a9c0 2a 2a 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65  **     is smalle
2a9d0 72 20 66 6f 72 20 73 6d 61 6c 6c 65 72 20 69 6e  r for smaller in
2a9e0 64 69 63 65 73 2c 20 74 68 75 73 20 66 61 76 6f  dices, thus favo
2a9f0 72 69 6e 67 20 74 68 65 6d 2e 0a 20 20 20 20 20  ring them..     
2aa00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2aa10 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
2aa20 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
2aa30 72 53 69 7a 65 2c 72 4c 6f 67 53 69 7a 65 29 20  rSize,rLogSize) 
2aa40 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20  + 1 +.          
2aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31                (1
2aa60 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52  5*pProbe->szIdxR
2aa70 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52  ow)/pTab->szTabR
2aa80 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ow;.        }els
2aa90 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
2aaa0 65 72 74 28 20 62 21 3d 30 20 29 3b 20 0a 20 20  ert( b!=0 ); .  
2aab0 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
2aac0 47 3a 20 43 6f 73 74 20 6f 66 20 73 63 61 6e 6e  G: Cost of scann
2aad0 69 6e 67 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69  ing a non-coveri
2aae0 6e 67 20 69 6e 64 65 78 20 69 73 20 28 4e 2b 31  ng index is (N+1
2aaf0 29 2a 6c 6f 67 32 28 4e 29 0a 20 20 20 20 20 20  )*log2(N).      
2ab00 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77 65 20      ** which we 
2ab10 77 69 6c 6c 20 73 69 6d 70 6c 69 66 79 20 74 6f  will simplify to
2ab20 20 6a 75 73 74 20 4e 2a 6c 6f 67 32 28 4e 29 20   just N*log2(N) 
2ab30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  */.          pNe
2ab40 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20  w->rRun = rSize 
2ab50 2b 20 72 4c 6f 67 53 69 7a 65 3b 0a 20 20 20 20  + rLogSize;.    
2ab60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77 68      }.        wh
2ab70 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a  ereLoopOutputAdj
2ab80 75 73 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 70  ust(pWC, pNew, p
2ab90 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  Src->iCursor);. 
2aba0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
2abb0 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
2abc0 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
2abd0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
2abe0 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  = rSize;.       
2abf0 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
2ac00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2ac10 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2ac20 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
2ac30 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
2ac40 70 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64  pProbe, 0);.#ifd
2ac50 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2ac60 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
2ac70 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 34      sqlite3Stat4
2ac80 50 72 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64  ProbeFree(pBuild
2ac90 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70  er->pRec);.    p
2aca0 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
2acb0 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69  id = 0;.    pBui
2acc0 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a  lder->pRec = 0;.
2acd0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
2ace0 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49  f there was an I
2acf0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
2ad00 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74  , then only that
2ad10 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20   one index is.  
2ad20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e    ** considered.
2ad30 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63   */.    if( pSrc
2ad40 2d 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b  ->pIndex ) break
2ad50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2ad60 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
2ad70 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2ad80 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64  LTABLE./*.** Add
2ad90 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
2ada0 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62  bjects for a tab
2adb0 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69  le of the join i
2adc0 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20  dentified by.** 
2add0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
2ade0 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c  iTab.  That tabl
2adf0 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
2ae00 74 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20  to be a virtual 
2ae10 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
2ae20 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
2ae30 64 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72  dVirtual(.  Wher
2ae40 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
2ae50 75 69 6c 64 65 72 20 20 20 2f 2a 20 57 48 45 52  uilder   /* WHER
2ae60 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61  E clause informa
2ae70 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  tion */.){.  Whe
2ae80 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
2ae90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
2aea0 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74  RE analysis cont
2aeb0 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
2aec0 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
2aed0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
2aee0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
2aef0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
2af00 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  WC;            /
2af10 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
2af20 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
2af30 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
2af40 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
2af50 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
2af60 73 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c  search */.  Tabl
2af70 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
2af80 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65  e3 *db;.  sqlite
2af90 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
2afa0 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  dxInfo;.  struct
2afb0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
2afc0 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
2afd0 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
2afe0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
2aff0 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55  traint_usage *pU
2b000 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72  sage;.  WhereTer
2b010 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
2b020 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72  i, j;.  int iTer
2b030 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74  m, mxTerm;.  int
2b040 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20   nConstraint;.  
2b050 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20  int seenIn = 0; 
2b060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b070 54 72 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70  True if an IN op
2b080 65 72 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a  erator is seen *
2b090 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20  /.  int seenVar 
2b0a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2b0b0 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f   /* True if a no
2b0c0 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74  n-constant const
2b0d0 72 61 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f  raint is seen */
2b0e0 0a 20 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20  .  int iPhase;  
2b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b100 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20  /* 0: const w/o 
2b110 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a  IN, 1: const, 2:
2b120 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a   no IN,  2: IN *
2b130 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
2b140 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  New;.  int rc = 
2b150 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57  SQLITE_OK;..  pW
2b160 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
2b170 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73  >pWInfo;.  pPars
2b180 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
2b190 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
2b1a0 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20 70  e->db;.  pWC = p
2b1b0 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
2b1c0 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
2b1d0 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20  >pNew;.  pSrc = 
2b1e0 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  &pWInfo->pTabLis
2b1f0 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d  t->a[pNew->iTab]
2b200 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  ;.  pTab = pSrc-
2b210 3e 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28  >pTab;.  assert(
2b220 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
2b230 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d   );.  pIdxInfo =
2b240 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e   allocateIndexIn
2b250 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20  fo(pParse, pWC, 
2b260 70 53 72 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e  pSrc, pBuilder->
2b270 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28  pOrderBy);.  if(
2b280 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72   pIdxInfo==0 ) r
2b290 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2b2a0 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72  EM;.  pNew->prer
2b2b0 65 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  eq = 0;.  pNew->
2b2c0 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e  rSetup = 0;.  pN
2b2d0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
2b2e0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
2b2f0 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ;.  pNew->nLTerm
2b300 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e   = 0;.  pNew->u.
2b310 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
2b320 30 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49  0;.  pUsage = pI
2b330 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
2b340 69 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e  intUsage;.  nCon
2b350 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e  straint = pIdxIn
2b360 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
2b370 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  .  if( whereLoop
2b380 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
2b390 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b   nConstraint) ){
2b3a0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
2b3b0 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29  ee(db, pIdxInfo)
2b3c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2b3d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
2b3e0 20 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20    for(iPhase=0; 
2b3f0 69 50 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73  iPhase<=3; iPhas
2b400 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73  e++){.    if( !s
2b410 65 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65  eenIn && (iPhase
2b420 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  &1)!=0 ){.      
2b430 69 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20  iPhase++;.      
2b440 69 66 28 20 69 50 68 61 73 65 3e 33 20 29 20 62  if( iPhase>3 ) b
2b450 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2b460 69 66 28 20 21 73 65 65 6e 56 61 72 20 26 26 20  if( !seenVar && 
2b470 69 50 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b  iPhase>1 ) break
2b480 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d  ;.    pIdxCons =
2b490 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
2b4a0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
2b4b0 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
2b4c0 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20  aConstraint;.   
2b4d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
2b4e0 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
2b4f0 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73  t; i++, pIdxCons
2b500 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70  ++){.      j = p
2b510 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66  IdxCons->iTermOf
2b520 66 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72  fset;.      pTer
2b530 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
2b540 20 20 20 20 20 20 73 77 69 74 63 68 28 20 69 50        switch( iP
2b550 68 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  hase ){.        
2b560 63 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f  case 0:    /* Co
2b570 6e 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20  nstants without 
2b580 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
2b590 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
2b5a0 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20  s->usable = 0;. 
2b5b0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
2b5c0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2b5d0 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20   WO_IN)!=0 ){.  
2b5e0 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e            seenIn
2b5f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2b600 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
2b610 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
2b620 68 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ht!=0 ){.       
2b630 20 20 20 20 20 73 65 65 6e 56 61 72 20 3d 20 31       seenVar = 1
2b640 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2b650 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f  e if( (pTerm->eO
2b660 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
2b670 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2b680 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
2b690 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ble = 1;.       
2b6a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
2b6b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
2b6c0 73 65 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73  se 1:    /* Cons
2b6d0 74 61 6e 74 73 20 77 69 74 68 20 49 4e 20 6f 70  tants with IN op
2b6e0 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20  erators */.     
2b6f0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65       assert( see
2b700 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nIn );.         
2b710 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
2b720 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  e = (pTerm->prer
2b730 65 71 52 69 67 68 74 3d 3d 30 29 3b 0a 20 20 20  eqRight==0);.   
2b740 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2b750 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 20 20        case 2:   
2b760 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69   /* Variables wi
2b770 74 68 6f 75 74 20 49 4e 20 2a 2f 0a 20 20 20 20  thout IN */.    
2b780 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
2b790 65 6e 56 61 72 20 29 3b 0a 20 20 20 20 20 20 20  enVar );.       
2b7a0 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
2b7b0 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 65 4f  ble = (pTerm->eO
2b7c0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
2b7d0 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ==0;.          b
2b7e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65  reak;.        de
2b7f0 66 61 75 6c 74 3a 20 20 20 2f 2a 20 56 61 72 69  fault:   /* Vari
2b800 61 62 6c 65 73 20 77 69 74 68 20 49 4e 20 2a 2f  ables with IN */
2b810 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2b820 74 28 20 73 65 65 6e 56 61 72 20 26 26 20 73 65  t( seenVar && se
2b830 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  enIn );.        
2b840 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
2b850 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  le = 1;.        
2b860 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2b870 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
2b880 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a  t(pUsage, 0, siz
2b890 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70  eof(pUsage[0])*p
2b8a0 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
2b8b0 61 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  aint);.    if( p
2b8c0 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
2b8d0 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69  reeIdxStr ) sqli
2b8e0 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66  te3_free(pIdxInf
2b8f0 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  o->idxStr);.    
2b900 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
2b910 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 0;.    pIdxIn
2b920 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a  fo->idxNum = 0;.
2b930 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65      pIdxInfo->ne
2b940 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d  edToFreeIdxStr =
2b950 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
2b960 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
2b970 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  d = 0;.    pIdxI
2b980 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
2b990 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f  st = SQLITE_BIG_
2b9a0 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b  DBL / (double)2;
2b9b0 0a 20 20 20 20 72 63 20 3d 20 76 74 61 62 42 65  .    rc = vtabBe
2b9c0 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  stIndex(pParse, 
2b9d0 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  pTab, pIdxInfo);
2b9e0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2b9f0 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  to whereLoopAddV
2ba00 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 70 49  tab_exit;.    pI
2ba10 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63  dxCons = *(struc
2ba20 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
2ba30 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
2ba40 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
2ba50 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  int;.    pNew->p
2ba60 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 20 20 6d  rereq = 0;.    m
2ba70 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 20 20  xTerm = -1;.    
2ba80 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c  assert( pNew->nL
2ba90 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e  Slot>=nConstrain
2baa0 74 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t );.    for(i=0
2bab0 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
2bac0 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65   i++) pNew->aLTe
2bad0 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 70  rm[i] = 0;.    p
2bae0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  New->u.vtab.omit
2baf0 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 66 6f  Mask = 0;.    fo
2bb00 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72  r(i=0; i<nConstr
2bb10 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43  aint; i++, pIdxC
2bb20 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ons++){.      if
2bb30 28 20 28 69 54 65 72 6d 20 3d 20 70 55 73 61 67  ( (iTerm = pUsag
2bb40 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d  e[i].argvIndex -
2bb50 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20   1)>=0 ){.      
2bb60 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e    j = pIdxCons->
2bb70 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
2bb80 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d       if( iTerm>=
2bb90 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20  nConstraint.    
2bba0 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20       || j<0.    
2bbb0 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e       || j>=pWC->
2bbc0 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 7c  nTerm.         |
2bbd0 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69  | pNew->aLTerm[i
2bbe0 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20  Term]!=0.       
2bbf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2bc00 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2bc10 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2bc20 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2bc30 65 2c 20 22 25 73 2e 78 42 65 73 74 49 6e 64 65  e, "%s.xBestInde
2bc40 78 28 29 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22  x() malfunction"
2bc50 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
2bc60 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77            goto w
2bc70 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f  hereLoopAddVtab_
2bc80 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  exit;.        }.
2bc90 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2bca0 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72  ( iTerm==nConstr
2bcb0 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20 20  aint-1 );.      
2bcc0 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30    testcase( j==0
2bcd0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
2bce0 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54  case( j==pWC->nT
2bcf0 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  erm-1 );.       
2bd00 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
2bd10 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  [j];.        pNe
2bd20 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65  w->prereq |= pTe
2bd30 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  rm->prereqRight;
2bd40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2bd50 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53   iTerm<pNew->nLS
2bd60 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  lot );.        p
2bd70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72  New->aLTerm[iTer
2bd80 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  m] = pTerm;.    
2bd90 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d 78      if( iTerm>mx
2bda0 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20  Term ) mxTerm = 
2bdb0 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 74  iTerm;.        t
2bdc0 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
2bdd0 31 35 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  15 );.        te
2bde0 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31  stcase( iTerm==1
2bdf0 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  6 );.        if(
2be00 20 69 54 65 72 6d 3c 31 36 20 26 26 20 70 55 73   iTerm<16 && pUs
2be10 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70 4e  age[i].omit ) pN
2be20 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d  ew->u.vtab.omitM
2be30 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b  ask |= 1<<iTerm;
2be40 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
2be50 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2be60 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20   WO_IN)!=0 ){.  
2be70 20 20 20 20 20 20 20 20 69 66 28 20 70 55 73 61          if( pUsa
2be80 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b  ge[i].omit==0 ){
2be90 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
2bea0 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  Do not attempt t
2beb0 6f 20 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e 73  o use an IN cons
2bec0 74 72 61 69 6e 74 20 69 66 20 74 68 65 20 76 69  traint if the vi
2bed0 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20  rtual table.    
2bee0 20 20 20 20 20 20 20 20 2a 2a 20 73 61 79 73 20          ** says 
2bef0 74 68 61 74 20 74 68 65 20 65 71 75 69 76 61 6c  that the equival
2bf00 65 6e 74 20 45 51 20 63 6f 6e 73 74 72 61 69 6e  ent EQ constrain
2bf10 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 66 65  t cannot be safe
2bf20 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20  ly omitted..    
2bf30 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65          ** If we
2bf40 20 64 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 75   do attempt to u
2bf50 73 65 20 73 75 63 68 20 61 20 63 6f 6e 73 74 72  se such a constr
2bf60 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73 20  aint, some rows 
2bf70 6d 69 67 68 74 20 62 65 0a 20 20 20 20 20 20 20  might be.       
2bf80 20 20 20 20 20 2a 2a 20 72 65 70 65 61 74 65 64       ** repeated
2bf90 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 20   in the output. 
2bfa0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  */.            b
2bfb0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2bfc0 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  }.          /* A
2bfd0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
2bfe0 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  hat is constrain
2bff0 65 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75  ed by an IN clau
2c000 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20  se may not.     
2c010 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20       ** consume 
2c020 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2c030 75 73 65 20 62 65 63 61 75 73 65 20 28 31 29 20  use because (1) 
2c040 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20  the order of IN 
2c050 74 65 72 6d 73 0a 20 20 20 20 20 20 20 20 20 20  terms.          
2c060 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ** is not necess
2c070 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f  arily related to
2c080 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75   the order of ou
2c090 74 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20  tput terms and. 
2c0a0 20 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20           ** (2) 
2c0b0 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73  Multiple outputs
2c0c0 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49   from a single I
2c0d0 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74  N value will not
2c0e0 20 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20 20   merge.         
2c0f0 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20 20 2a   ** together.  *
2c100 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  /.          pIdx
2c110 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
2c120 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  sumed = 0;.     
2c130 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2c140 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 43   }.    if( i>=nC
2c150 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20  onstraint ){.   
2c160 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
2c170 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 20 20  = mxTerm+1;.    
2c180 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
2c190 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c  nLTerm<=pNew->nL
2c1a0 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70 4e  Slot );.      pN
2c1b0 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75  ew->u.vtab.idxNu
2c1c0 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  m = pIdxInfo->id
2c1d0 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77  xNum;.      pNew
2c1e0 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
2c1f0 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  e = pIdxInfo->ne
2c200 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3b 0a  edToFreeIdxStr;.
2c210 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
2c220 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
2c230 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
2c240 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
2c250 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  = pIdxInfo->idxS
2c260 74 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  tr;.      pNew->
2c270 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64  u.vtab.isOrdered
2c280 20 3d 20 28 75 38 29 28 28 70 49 64 78 49 6e 66   = (u8)((pIdxInf
2c290 6f 2d 3e 6e 4f 72 64 65 72 42 79 21 3d 30 29 0a  o->nOrderBy!=0).
2c2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2c0 20 20 20 20 20 26 26 20 70 49 64 78 49 6e 66 6f       && pIdxInfo
2c2d0 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
2c2e0 64 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  d);.      pNew->
2c2f0 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20  rSetup = 0;.    
2c300 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
2c310 71 6c 69 74 65 33 4c 6f 67 45 73 74 46 72 6f 6d  qlite3LogEstFrom
2c320 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d  Double(pIdxInfo-
2c330 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b  >estimatedCost);
2c340 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  .      /* TUNING
2c350 3a 20 45 76 65 72 79 20 76 69 72 74 75 61 6c 20  : Every virtual 
2c360 74 61 62 6c 65 20 71 75 65 72 79 20 72 65 74 75  table query retu
2c370 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20  rns 25 rows */. 
2c380 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
2c390 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34  = 46;  assert( 4
2c3a0 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
2c3b0 28 32 35 29 20 29 3b 0a 20 20 20 20 20 20 77 68  (25) );.      wh
2c3c0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
2c3d0 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
2c3e0 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75       if( pNew->u
2c3f0 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29  .vtab.needFree )
2c400 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2c410 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76  3_free(pNew->u.v
2c420 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20  tab.idxStr);.   
2c430 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
2c440 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
2c450 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c460 7d 20 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64  }  ..whereLoopAd
2c470 64 56 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66  dVtab_exit:.  if
2c480 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  ( pIdxInfo->need
2c490 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73  ToFreeIdxStr ) s
2c4a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78  qlite3_free(pIdx
2c4b0 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20  Info->idxStr);. 
2c4c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2c4d0 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20  b, pIdxInfo);.  
2c4e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
2c4f0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2c500 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
2c510 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68  */../*.** Add Wh
2c520 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20  ereLoop entries 
2c530 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72  to handle OR ter
2c540 6d 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20  ms.  This works 
2c550 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74  for either.** bt
2c560 72 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20  rees or virtual 
2c570 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tables..*/.stati
2c580 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
2c590 64 64 4f 72 28 57 68 65 72 65 4c 6f 6f 70 42 75  ddOr(WhereLoopBu
2c5a0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
2c5b0 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 29   Bitmask mExtra)
2c5c0 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
2c5d0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
2c5e0 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72  ->pWInfo;.  Wher
2c5f0 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20  eClause *pWC;.  
2c600 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
2c610 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
2c620 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20  erm, *pWCEnd;.  
2c630 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2c640 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a  OK;.  int iCur;.
2c650 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65    WhereClause te
2c660 6d 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  mpWC;.  WhereLoo
2c670 70 42 75 69 6c 64 65 72 20 73 53 75 62 42 75 69  pBuilder sSubBui
2c680 6c 64 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74  ld;.  WhereOrSet
2c690 20 73 53 75 6d 2c 20 73 43 75 72 2c 20 73 50 72   sSum, sCur, sPr
2c6a0 65 76 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  ev;.  struct Src
2c6b0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2c6c0 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75  ;.  .  pWC = pBu
2c6d0 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66  ilder->pWC;.  if
2c6e0 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
2c6f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44  lags & WHERE_AND
2c700 5f 4f 4e 4c 59 20 29 20 72 65 74 75 72 6e 20 53  _ONLY ) return S
2c710 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 57 43 45  QLITE_OK;.  pWCE
2c720 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57  nd = pWC->a + pW
2c730 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77  C->nTerm;.  pNew
2c740 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
2c750 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 75  w;.  memset(&sSu
2c760 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 75  m, 0, sizeof(sSu
2c770 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70  m));.  pItem = p
2c780 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
2c790 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b  >a + pNew->iTab;
2c7a0 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d  .  iCur = pItem-
2c7b0 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72  >iCursor;..  for
2c7c0 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
2c7d0 54 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72  Term<pWCEnd && r
2c7e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54  c==SQLITE_OK; pT
2c7f0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
2c800 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
2c810 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20  r & WO_OR)!=0.  
2c820 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e     && (pTerm->u.
2c830 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
2c840 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  le & pNew->maskS
2c850 65 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  elf)!=0 .    ){.
2c860 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73        WhereClaus
2c870 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20  e * const pOrWC 
2c880 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  = &pTerm->u.pOrI
2c890 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57  nfo->wc;.      W
2c8a0 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74  hereTerm * const
2c8b0 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72   pOrWCEnd = &pOr
2c8c0 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65  WC->a[pOrWC->nTe
2c8d0 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65  rm];.      Where
2c8e0 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20  Term *pOrTerm;. 
2c8f0 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20       int once = 
2c900 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20  1;.      int i, 
2c910 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 73 53  j;.    .      sS
2c920 75 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c  ubBuild = *pBuil
2c930 64 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42  der;.      sSubB
2c940 75 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d 20  uild.pOrderBy = 
2c950 30 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69  0;.      sSubBui
2c960 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43 75  ld.pOrSet = &sCu
2c970 72 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 4f  r;..      for(pO
2c980 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20  rTerm=pOrWC->a; 
2c990 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64  pOrTerm<pOrWCEnd
2c9a0 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  ; pOrTerm++){.  
2c9b0 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65        if( (pOrTe
2c9c0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
2c9d0 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20  WO_AND)!=0 ){.  
2c9e0 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c          sSubBuil
2c9f0 64 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d  d.pWC = &pOrTerm
2ca00 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63  ->u.pAndInfo->wc
2ca10 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
2ca20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
2ca30 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b  tCursor==iCur ){
2ca40 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
2ca50 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e  C.pWInfo = pWC->
2ca60 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  pWInfo;.        
2ca70 20 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20    tempWC.pOuter 
2ca80 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20  = pWC;.         
2ca90 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f   tempWC.op = TK_
2caa0 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74  AND;.          t
2cab0 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b  empWC.nTerm = 1;
2cac0 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
2cad0 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20  C.a = pOrTerm;. 
2cae0 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69           sSubBui
2caf0 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43  ld.pWC = &tempWC
2cb00 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2cb10 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
2cb20 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
2cb30 20 20 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20         sCur.n = 
2cb40 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
2cb50 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2cb60 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28 20  BLE.        if( 
2cb70 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d  IsVirtual(pItem-
2cb80 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
2cb90 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2cba0 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26 73 53  opAddVirtual(&sS
2cbb0 75 62 42 75 69 6c 64 29 3b 0a 20 20 20 20 20 20  ubBuild);.      
2cbc0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
2cbd0 43 75 72 2e 6e 3b 20 69 2b 2b 29 20 73 43 75 72  Cur.n; i++) sCur
2cbe0 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c 3d 20  .a[i].prereq |= 
2cbf0 6d 45 78 74 72 61 3b 0a 20 20 20 20 20 20 20 20  mExtra;.        
2cc00 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
2cc10 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
2cc20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2cc30 64 64 42 74 72 65 65 28 26 73 53 75 62 42 75 69  ddBtree(&sSubBui
2cc40 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  ld, mExtra);.   
2cc50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2cc60 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2cc70 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d  E_OK || sCur.n==
2cc80 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
2cc90 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20   sCur.n==0 ){.  
2cca0 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d          sSum.n =
2ccb0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   0;.          br
2ccc0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
2ccd0 73 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20  se if( once ){. 
2cce0 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72           whereOr
2ccf0 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75  Move(&sSum, &sCu
2cd00 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e  r);.          on
2cd10 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ce = 0;.        
2cd20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2cd30 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 50   whereOrMove(&sP
2cd40 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20  rev, &sSum);.   
2cd50 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20         sSum.n = 
2cd60 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  0;.          for
2cd70 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b  (i=0; i<sPrev.n;
2cd80 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
2cd90 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43     for(j=0; j<sC
2cda0 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ur.n; j++){.    
2cdb0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f            whereO
2cdc0 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c 20 73  rInsert(&sSum, s
2cdd0 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71  Prev.a[i].prereq
2cde0 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65   | sCur.a[j].pre
2cdf0 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20  req,.           
2ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce10 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
2ce20 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75  d(sPrev.a[i].rRu
2ce30 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75  n, sCur.a[j].rRu
2ce40 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n),.            
2ce50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce60 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
2ce70 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74  (sPrev.a[i].nOut
2ce80 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74  , sCur.a[j].nOut
2ce90 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
2cea0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2ceb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2cec0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
2ced0 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e  rm = 1;.      pN
2cee0 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20  ew->aLTerm[0] = 
2cef0 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65  pTerm;.      pNe
2cf00 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
2cf10 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20  RE_MULTI_OR;.   
2cf20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
2cf30 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 0;.      pNew-
2cf40 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20  >iSortIdx = 0;. 
2cf50 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65       memset(&pNe
2cf60 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28  w->u, 0, sizeof(
2cf70 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20  pNew->u));.     
2cf80 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
2cf90 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75  LITE_OK && i<sSu
2cfa0 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  m.n; i++){.     
2cfb0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 75     /* TUNING: Mu
2cfc0 6c 74 69 70 6c 65 20 62 79 20 33 2e 35 20 66 6f  ltiple by 3.5 fo
2cfd0 72 20 74 68 65 20 73 65 63 6f 6e 64 61 72 79 20  r the secondary 
2cfe0 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 20 2a 2f 0a  table lookup */.
2cff0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
2d000 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72  un = sSum.a[i].r
2d010 52 75 6e 20 2b 20 31 38 3b 0a 20 20 20 20 20 20  Run + 18;.      
2d020 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
2d030 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20  Sum.a[i].nOut;. 
2d040 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65         pNew->pre
2d050 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e  req = sSum.a[i].
2d060 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20  prereq;.        
2d070 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
2d080 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
2d090 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
2d0a0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2d0b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
2d0c0 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
2d0d0 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20  objects for all 
2d0e0 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69  tables .*/.stati
2d0f0 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
2d100 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42  ddAll(WhereLoopB
2d110 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
2d120 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
2d130 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
2d140 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74  r->pWInfo;.  Bit
2d150 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b  mask mExtra = 0;
2d160 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f  .  Bitmask mPrio
2d170 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61  r = 0;.  int iTa
2d180 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  b;.  SrcList *pT
2d190 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
2d1a0 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72  >pTabList;.  str
2d1b0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2d1c0 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
2d1d0 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
2d1e0 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69  >pParse->db;.  i
2d1f0 6e 74 20 6e 54 61 62 4c 69 73 74 20 3d 20 70 57  nt nTabList = pW
2d200 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20  Info->nLevel;.  
2d210 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2d220 4f 4b 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f  OK;.  u8 priorJo
2d230 69 6e 54 79 70 65 20 3d 20 30 3b 0a 20 20 57 68  inType = 0;.  Wh
2d240 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a  ereLoop *pNew;..
2d250 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74    /* Loop over t
2d260 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
2d270 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74   join, from left
2d280 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70   to right */.  p
2d290 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
2d2a0 70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  pNew;.  whereLoo
2d2b0 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66  pInit(pNew);.  f
2d2c0 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d  or(iTab=0, pItem
2d2d0 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 54  =pTabList->a; iT
2d2e0 61 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54 61  ab<nTabList; iTa
2d2f0 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  b++, pItem++){. 
2d300 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20     pNew->iTab = 
2d310 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  iTab;.    pNew->
2d320 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61  maskSelf = getMa
2d330 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
2d340 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75  kSet, pItem->iCu
2d350 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28  rsor);.    if( (
2d360 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  (pItem->jointype
2d370 7c 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 29 20  |priorJoinType) 
2d380 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  & (JT_LEFT|JT_CR
2d390 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  OSS))!=0 ){.    
2d3a0 20 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f    mExtra = mPrio
2d3b0 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  r;.    }.    pri
2d3c0 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70 49 74  orJoinType = pIt
2d3d0 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  em->jointype;.  
2d3e0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
2d3f0 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a  pItem->pTab) ){.
2d400 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2d410 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70  LoopAddVirtual(p
2d420 42 75 69 6c 64 65 72 29 3b 0a 20 20 20 20 7d 65  Builder);.    }e
2d430 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2d440 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
2d450 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74  e(pBuilder, mExt
2d460 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ra);.    }.    i
2d470 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d480 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
2d490 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42  hereLoopAddOr(pB
2d4a0 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b  uilder, mExtra);
2d4b0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f  .    }.    mPrio
2d4c0 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  r |= pNew->maskS
2d4d0 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20  elf;.    if( rc 
2d4e0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
2d4f0 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  led ) break;.  }
2d500 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
2d510 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72  r(db, pNew);.  r
2d520 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2d530 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65  ** Examine a Whe
2d540 72 65 50 61 74 68 20 28 77 69 74 68 20 74 68 65  rePath (with the
2d550 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65   addition of the
2d560 20 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70   extra WhereLoop
2d570 20 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a 20 70   of the 5th.** p
2d580 61 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65  arameters) to se
2d590 65 20 69 66 20 69 74 20 6f 75 74 70 75 74 73 20  e if it outputs 
2d5a0 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75  rows in the requ
2d5b0 65 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a  ested ORDER BY.*
2d5c0 2a 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20  * (or GROUP BY) 
2d5d0 77 69 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e  without requirin
2d5e0 67 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72  g a separate sor
2d5f0 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65  t operation.  Re
2d600 74 75 72 6e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20  turn:.** .**    
2d610 30 3a 20 20 4f 52 44 45 52 20 42 59 20 69 73 20  0:  ORDER BY is 
2d620 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2e 20 20  not satisfied.  
2d630 53 6f 72 74 69 6e 67 20 72 65 71 75 69 72 65 64  Sorting required
2d640 0a 2a 2a 20 20 20 20 31 3a 20 20 4f 52 44 45 52  .**    1:  ORDER
2d650 20 42 59 20 69 73 20 73 61 74 69 73 66 69 65 64   BY is satisfied
2d660 2e 20 20 20 20 20 20 4f 6d 69 74 20 73 6f 72 74  .      Omit sort
2d670 69 6e 67 0a 2a 2a 20 20 20 2d 31 3a 20 20 55 6e  ing.**   -1:  Un
2d680 6b 6e 6f 77 6e 20 61 74 20 74 68 69 73 20 74 69  known at this ti
2d690 6d 65 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  me.**.** Note th
2d6a0 61 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  at processing fo
2d6b0 72 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  r WHERE_GROUPBY 
2d6c0 61 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e  and WHERE_DISTIN
2d6d0 43 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a  CTBY is not as.*
2d6e0 2a 20 73 74 72 69 63 74 2e 20 20 57 69 74 68 20  * strict.  With 
2d6f0 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53  GROUP BY and DIS
2d700 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72  TINCT the only r
2d710 65 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68  equirement is th
2d720 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74  at.** equivalent
2d730 20 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d   rows appear imm
2d740 65 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e  ediately adjacen
2d750 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72  t to one another
2d760 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61  .  GROUP BY.** a
2d770 6e 64 20 44 49 53 54 49 4e 54 20 64 6f 20 6e 6f  nd DISTINT do no
2d780 74 20 72 65 71 75 69 72 65 20 72 6f 77 73 20 74  t require rows t
2d790 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20  o appear in any 
2d7a0 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
2d7b0 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65   as long.** as e
2d7c0 71 75 69 76 65 6c 65 6e 74 20 72 6f 77 73 20 61  quivelent rows a
2d7d0 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74  re grouped toget
2d7e0 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47  her.  Thus for G
2d7f0 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
2d800 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64  INCT.** the pOrd
2d810 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62  erBy terms can b
2d820 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79  e matched in any
2d830 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52   order.  With OR
2d840 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20  DER BY, the .** 
2d850 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d  pOrderBy terms m
2d860 75 73 74 20 62 65 20 6d 61 74 63 68 65 64 20 69  ust be matched i
2d870 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f  n strict left-to
2d880 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f  -right order..*/
2d890 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
2d8a0 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
2d8b0 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e  derBy(.  WhereIn
2d8c0 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f  fo *pWInfo,    /
2d8d0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
2d8e0 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
2d8f0 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
2d900 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
2d910 55 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43  UP BY or DISTINC
2d920 54 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63  T clause to chec
2d930 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  k */.  WherePath
2d940 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20   *pPath,     /* 
2d950 54 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f  The WherePath to
2d960 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20   check */.  u16 
2d970 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20  wctrlFlags,     
2d980 20 20 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61    /* Might conta
2d990 69 6e 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  in WHERE_GROUPBY
2d9a0 20 6f 72 20 57 48 45 52 45 5f 44 49 53 54 49 4e   or WHERE_DISTIN
2d9b0 43 54 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c  CTBY */.  u16 nL
2d9c0 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  oop,            
2d9d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
2d9e0 72 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61  ries in pPath->a
2d9f0 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  Loop[] */.  Wher
2da00 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20  eLoop *pLast,   
2da10 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68    /* Add this Wh
2da20 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65  ereLoop to the e
2da30 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f  nd of pPath->aLo
2da40 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73  op[] */.  Bitmas
2da50 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20  k *pRevMask     
2da60 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20  /* OUT: Mask of 
2da70 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75  WhereLoops to ru
2da80 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
2da90 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65  er */.){.  u8 re
2daa0 76 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  vSet;           
2dab0 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76 20   /* True if rev 
2dac0 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38  is known */.  u8
2dad0 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20   rev;           
2dae0 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65      /* Composite
2daf0 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20   sort order */. 
2db00 20 75 38 20 72 65 76 49 64 78 3b 20 20 20 20 20   u8 revIdx;     
2db10 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2db20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20  sort order */.  
2db30 75 38 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  u8 isOrderDistin
2db40 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69  ct;   /* All pri
2db50 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72  or WhereLoops ar
2db60 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
2db70 20 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63   */.  u8 distinc
2db80 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54  tColumns;   /* T
2db90 72 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20  rue if the loop 
2dba0 68 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e  has UNIQUE NOT N
2dbb0 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ULL columns */. 
2dbc0 20 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20   u8 isMatch;    
2dbd0 20 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d         /* iColum
2dbe0 6e 20 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d  n matches a term
2dbf0 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
2dc00 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36   clause */.  u16
2dc10 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   nColumn;       
2dc20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2dc30 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65  columns in pInde
2dc40 78 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65  x */.  u16 nOrde
2dc50 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy;         /* 
2dc60 4e 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20  Number terms in 
2dc70 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2dc80 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f  use */.  int iLo
2dc90 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  op;            /
2dca0 2a 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65  * Index of Where
2dcb0 4c 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65  Loop in pPath be
2dcc0 69 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f  ing processed */
2dcd0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
2dce0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2dcf0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
2dd00 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
2dd10 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
2dd20 75 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e  umber for curren
2dd30 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20  t WhereLoop */. 
2dd40 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20   int iColumn;   
2dd50 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75         /* A colu
2dd60 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e  mn number within
2dd70 20 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20   table iCur */. 
2dd80 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
2dd90 70 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e  p = 0; /* Curren
2dda0 74 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e  t WhereLoop bein
2ddb0 67 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a  g processed. */.
2ddc0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
2ddd0 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e  rm;     /* A sin
2dde0 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
2ddf0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
2de00 20 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b    Expr *pOBExpr;
2de10 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
2de20 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68  pression from th
2de30 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2de40 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e */.  CollSeq *
2de50 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20  pColl;       /* 
2de60 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e  COLLATE function
2de70 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42   from an ORDER B
2de80 59 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f  Y clause term */
2de90 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
2dea0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
2deb0 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
2dec0 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20   with pLoop */. 
2ded0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2dee0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
2def0 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  b;  /* Database 
2df00 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
2df10 42 69 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20  Bitmask obSat = 
2df20 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  0;    /* Mask of
2df30 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
2df40 73 61 74 69 73 66 69 65 64 20 73 6f 20 66 61 72  satisfied so far
2df50 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62   */.  Bitmask ob
2df60 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d  Done;       /* M
2df70 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52  ask of all ORDER
2df80 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42   BY terms */.  B
2df90 69 74 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74  itmask orderDist
2dfa0 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61  inctMask;  /* Ma
2dfb0 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f  sk of all well-o
2dfc0 72 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a  rdered loops */.
2dfd0 20 20 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b    Bitmask ready;
2dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dff0 20 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c   Mask of inner l
2e000 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20  oops */..  /*.  
2e010 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68  ** We say the Wh
2e020 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d  ereLoop is "one-
2e030 72 6f 77 22 20 69 66 20 69 74 20 67 65 6e 65 72  row" if it gener
2e040 61 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61  ates no more tha
2e050 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f  n one.  ** row o
2e060 66 20 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65  f output.  A Whe
2e070 72 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f  reLoop is one-ro
2e080 77 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  w if all of the 
2e090 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
2e0a0 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c  ue:.  **  (a) Al
2e0b0 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  l index columns 
2e0c0 6d 61 74 63 68 20 77 69 74 68 20 57 48 45 52 45  match with WHERE
2e0d0 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a  _COLUMN_EQ..  **
2e0e0 20 20 28 62 29 20 54 68 65 20 69 6e 64 65 78 20    (b) The index 
2e0f0 69 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41  is unique.  ** A
2e100 6e 79 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74  ny WhereLoop wit
2e110 68 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d  h an WHERE_COLUM
2e120 4e 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20  N_EQ constraint 
2e130 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 69 73 20  on the rowid is 
2e140 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76  one-row..  ** Ev
2e150 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72  ery one-row Wher
2e160 65 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20  eLoop will have 
2e170 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  the WHERE_ONEROW
2e180 20 62 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c   bit set in wsFl
2e190 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ags..  **.  ** W
2e1a0 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c  e say the WhereL
2e1b0 6f 6f 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69  oop is "order-di
2e1c0 73 74 69 6e 63 74 22 20 69 66 20 74 68 65 20 73  stinct" if the s
2e1d0 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72  et of columns fr
2e1e0 6f 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65  om.  ** that Whe
2e1f0 72 65 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20  reLoop that are 
2e200 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
2e210 63 6c 61 75 73 65 20 61 72 65 20 64 69 66 66 65  clause are diffe
2e220 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20  rent for every. 
2e230 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57   ** row of the W
2e240 68 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79  hereLoop.  Every
2e250 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f   one-row WhereLo
2e260 6f 70 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  op is automatica
2e270 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64  lly.  ** order-d
2e280 69 73 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65  istinct.   A Whe
2e290 72 65 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20  reLoop that has 
2e2a0 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  no columns in th
2e2b0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2e2c0 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72  e.  ** is not or
2e2d0 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f  der-distinct. To
2e2e0 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   be order-distin
2e2f0 63 74 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20  ct is not quite 
2e300 74 68 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e  the same as bein
2e310 67 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69  g.  ** UNIQUE si
2e320 6e 63 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c  nce a UNIQUE col
2e330 75 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e  umn or index can
2e340 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72   have multiple r
2e350 6f 77 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61  ows that .  ** a
2e360 72 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c  re NULL and NULL
2e370 20 76 61 6c 75 65 73 20 61 72 65 20 65 71 75 69   values are equi
2e380 76 61 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70  valent for the p
2e390 75 72 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d  urpose of order-
2e3a0 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54  distinct..  ** T
2e3b0 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69  o be order-disti
2e3c0 6e 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73  nct, the columns
2e3d0 20 6d 75 73 74 20 62 65 20 55 4e 49 51 55 45 20   must be UNIQUE 
2e3e0 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20  and NOT NULL..  
2e3f0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  **.  ** The rowi
2e400 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73  d for a table is
2e410 20 61 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61   always UNIQUE a
2e420 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77  nd NOT NULL so w
2e430 68 65 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a  henever the.  **
2e440 20 72 6f 77 69 64 20 61 70 70 65 61 72 73 20 69   rowid appears i
2e450 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
2e460 6c 61 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65  lause, the corre
2e470 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f  sponding WhereLo
2e480 6f 70 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d  op is.  ** autom
2e490 61 74 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64  atically order-d
2e4a0 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20  istinct..  */.. 
2e4b0 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
2e4c0 79 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 6f  y!=0 );..  /* So
2e4d0 72 74 61 62 69 6c 69 74 79 20 6f 66 20 76 69 72  rtability of vir
2e4e0 74 75 61 6c 20 74 61 62 6c 65 73 20 69 73 20 64  tual tables is d
2e4f0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
2e500 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
2e510 6f 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 76  od.  ** of the v
2e520 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 74 73  irtual table its
2e530 65 6c 66 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61  elf */.  if( pLa
2e540 73 74 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  st->wsFlags & WH
2e550 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
2e560 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65   ){.    testcase
2e570 28 20 6e 4c 6f 6f 70 3e 30 20 29 3b 20 20 2f 2a  ( nLoop>0 );  /*
2e580 20 54 72 75 65 20 77 68 65 6e 20 6f 75 74 65 72   True when outer
2e590 20 6c 6f 6f 70 73 20 61 72 65 20 6f 6e 65 2d 72   loops are one-r
2e5a0 6f 77 20 61 6e 64 20 6d 61 74 63 68 20 0a 20 20  ow and match .  
2e5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e5c0 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 20 4f 52          ** no OR
2e5d0 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a  DER BY terms */.
2e5e0 20 20 20 20 72 65 74 75 72 6e 20 70 4c 61 73 74      return pLast
2e5f0 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72  ->u.vtab.isOrder
2e600 65 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c  ed;.  }.  if( nL
2e610 6f 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  oop && Optimizat
2e620 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
2e630 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64  SQLITE_OrderById
2e640 78 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  xJoin) ) return 
2e650 30 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d  0;..  nOrderBy =
2e660 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
2e670 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f  ;.  testcase( nO
2e680 72 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b  rderBy==BMS-1 );
2e690 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e  .  if( nOrderBy>
2e6a0 42 4d 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30  BMS-1 ) return 0
2e6b0 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74  ;  /* Cannot opt
2e6c0 69 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72  imize overly lar
2e6d0 67 65 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a  ge ORDER BYs */.
2e6e0 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2e6f0 74 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20  t = 1;.  obDone 
2e700 3d 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72  = MASKBIT(nOrder
2e710 42 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69  By)-1;.  orderDi
2e720 73 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a  stinctMask = 0;.
2e730 20 20 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 66    ready = 0;.  f
2e740 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72  or(iLoop=0; isOr
2e750 64 65 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f  derDistinct && o
2e760 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69  bSat<obDone && i
2e770 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f  Loop<=nLoop; iLo
2e780 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69  op++){.    if( i
2e790 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c  Loop>0 ) ready |
2e7a0 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  = pLoop->maskSel
2e7b0 66 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69  f;.    pLoop = i
2e7c0 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61  Loop<nLoop ? pPa
2e7d0 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  th->aLoop[iLoop]
2e7e0 20 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20 61 73   : pLast;.    as
2e7f0 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  sert( (pLoop->ws
2e800 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
2e810 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
2e820 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 70 57 49  ;.    iCur = pWI
2e830 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
2e840 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43  [pLoop->iTab].iC
2e850 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d  ursor;..    /* M
2e860 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44 45  ark off any ORDE
2e870 52 20 42 59 20 74 65 72 6d 20 58 20 74 68 61 74  R BY term X that
2e880 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
2e890 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20  the table of.   
2e8a0 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
2e8b0 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63 68 20 74  loop for which t
2e8c0 68 65 72 65 20 69 73 20 74 65 72 6d 20 69 6e 20  here is term in 
2e8d0 74 68 65 20 57 48 45 52 45 0a 20 20 20 20 2a 2a  the WHERE.    **
2e8e0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66   clause of the f
2e8f0 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72  orm X IS NULL or
2e900 20 58 3d 3f 20 74 68 61 74 20 72 65 66 65 72 65   X=? that refere
2e910 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20  nce only outer. 
2e920 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20     ** loops..   
2e930 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
2e940 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
2e950 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4d 41 53  ){.      if( MAS
2e960 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
2e970 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2e980 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69    pOBExpr = sqli
2e990 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2e9a0 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  te(pOrderBy->a[i
2e9b0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
2e9c0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21  if( pOBExpr->op!
2e9d0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e  =TK_COLUMN ) con
2e9e0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
2e9f0 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65   pOBExpr->iTable
2ea00 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  !=iCur ) continu
2ea10 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  e;.      pTerm =
2ea20 20 66 69 6e 64 54 65 72 6d 28 26 70 57 49 6e 66   findTerm(&pWInf
2ea30 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70 4f  o->sWC, iCur, pO
2ea40 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a  BExpr->iColumn,.
2ea50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea60 20 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20 57         ~ready, W
2ea70 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2c 20  O_EQ|WO_ISNULL, 
2ea80 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  0);.      if( pT
2ea90 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  erm==0 ) continu
2eaa0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  e;.      if( (pT
2eab0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57  erm->eOperator&W
2eac0 4f 5f 45 51 29 21 3d 30 20 26 26 20 70 4f 42 45  O_EQ)!=0 && pOBE
2ead0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20  xpr->iColumn>=0 
2eae0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
2eaf0 20 63 68 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a   char *z1, *z2;.
2eb00 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
2eb10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
2eb20 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  eq(pWInfo->pPars
2eb30 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
2eb40 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
2eb50 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
2eb60 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
2eb70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31  Coll;.        z1
2eb80 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b   = pColl->zName;
2eb90 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
2eba0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2ebb0 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  Seq(pWInfo->pPar
2ebc0 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
2ebd0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
2ebe0 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
2ebf0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
2ec00 20 20 20 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c         z2 = pCol
2ec10 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l->zName;.      
2ec20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
2ec30 49 43 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20  ICmp(z1, z2)!=0 
2ec40 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2ec50 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74 20    }.      obSat 
2ec60 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20  |= MASKBIT(i);. 
2ec70 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70     }..    if( (p
2ec80 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2ec90 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30  WHERE_ONEROW)==0
2eca0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   ){.      if( pL
2ecb0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2ecc0 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20  HERE_IPK ){.    
2ecd0 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
2ece0 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20          nColumn 
2ecf0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
2ed00 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70   if( (pIndex = p
2ed10 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
2ed20 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64  ndex)==0 || pInd
2ed30 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
2ed40 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2ed50 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
2ed60 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e  .        nColumn
2ed70 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   = pIndex->nColu
2ed80 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72  mn;.        isOr
2ed90 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 70 49  derDistinct = pI
2eda0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
2edb0 45 5f 4e 6f 6e 65 3b 0a 20 20 20 20 20 20 7d 0a  E_None;.      }.
2edc0 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74  .      /* Loop t
2edd0 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d  hrough all colum
2ede0 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ns of the index 
2edf0 61 6e 64 20 64 65 61 6c 20 77 69 74 68 20 74 68  and deal with th
2ee00 65 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20  e ones.      ** 
2ee10 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e  that are not con
2ee20 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f  strained by == o
2ee30 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  r IN..      */. 
2ee40 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 53 65       rev = revSe
2ee50 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 69 73  t = 0;.      dis
2ee60 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30  tinctColumns = 0
2ee70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
2ee80 20 6a 3c 3d 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b   j<=nColumn; j++
2ee90 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62 4f  ){.        u8 bO
2eea0 6e 63 65 3b 20 20 20 2f 2a 20 54 72 75 65 20 74  nce;   /* True t
2eeb0 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45 52 20  o run the ORDER 
2eec0 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a  BY search loop *
2eed0 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 6b  /..        /* Sk
2eee0 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49  ip over == and I
2eef0 53 20 4e 55 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a  S NULL terms */.
2ef00 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c          if( j<pL
2ef10 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
2ef20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 69  .         && ((i
2ef30 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
2ef40 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20  [j]->eOperator) 
2ef50 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55  & (WO_EQ|WO_ISNU
2ef60 4c 4c 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  LL))!=0.        
2ef70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2ef80 20 69 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29   i & WO_ISNULL )
2ef90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
2efa0 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
2efb0 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
2efc0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
2efd0 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
2efe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2eff0 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20    continue;  .  
2f000 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2f010 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75   /* Get the colu
2f020 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  mn number in the
2f030 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29   table (iColumn)
2f040 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a   and sort order.
2f050 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49          ** (revI
2f060 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68  dx) for the j-th
2f070 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
2f080 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ndex..        */
2f090 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 6e  .        if( j<n
2f0a0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
2f0b0 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 69 6e      /* Normal in
2f0c0 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  dex columns */. 
2f0d0 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e           iColumn
2f0e0 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c   = pIndex->aiCol
2f0f0 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  umn[j];.        
2f100 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65    revIdx = pInde
2f110 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  x->aSortOrder[j]
2f120 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2f130 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d  iColumn==pIndex-
2f140 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29  >pTable->iPKey )
2f150 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20   iColumn = -1;. 
2f160 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2f170 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 52          /* The R
2f180 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 61 74 20 74  OWID column at t
2f190 68 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20  he end */.      
2f1a0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e      assert( j==n
2f1b0 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20  Column );.      
2f1c0 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31      iColumn = -1
2f1d0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49  ;.          revI
2f1e0 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dx = 0;.        
2f1f0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  }..        /* An
2f200 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 63   unconstrained c
2f210 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67 68 74  olumn that might
2f220 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74   be NULL means t
2f230 68 61 74 20 74 68 69 73 0a 20 20 20 20 20 20 20  hat this.       
2f240 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69 73   ** WhereLoop is
2f250 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65   not well-ordere
2f260 64 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d .        */.  
2f270 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65        if( isOrde
2f280 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20  rDistinct.      
2f290 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30     && iColumn>=0
2f2a0 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d  .         && j>=
2f2b0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
2f2c0 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  Eq.         && p
2f2d0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61  Index->pTable->a
2f2e0 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74  Col[iColumn].not
2f2f0 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20  Null==0.        
2f300 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f  ){.          isO
2f310 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
2f320 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
2f330 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65       /* Find the
2f340 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 74   ORDER BY term t
2f350 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
2f360 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75  to the j-th colu
2f370 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  mn.        ** of
2f380 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 61   the index and a
2f390 6e 64 20 6d 61 72 6b 20 74 68 61 74 20 4f 52 44  nd mark that ORD
2f3a0 45 52 20 42 59 20 74 65 72 6d 20 6f 66 66 20 0a  ER BY term off .
2f3b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2f3c0 20 20 20 62 4f 6e 63 65 20 3d 20 31 3b 0a 20 20     bOnce = 1;.  
2f3d0 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
2f3e0 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  0;.        for(i
2f3f0 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e  =0; bOnce && i<n
2f400 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
2f410 20 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53           if( MAS
2f420 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
2f430 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2f440 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20        pOBExpr = 
2f450 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
2f460 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d  ollate(pOrderBy-
2f470 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
2f480 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2f490 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
2f4a0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a  HERE_GROUPBY );.
2f4b0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2f4c0 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  se( wctrlFlags &
2f4d0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
2f4e0 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Y );.          i
2f4f0 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
2f500 20 28 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c   (WHERE_GROUPBY|
2f510 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
2f520 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20  ))==0 ) bOnce = 
2f530 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
2f540 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b   pOBExpr->op!=TK
2f550 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e  _COLUMN ) contin
2f560 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
2f570 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c  ( pOBExpr->iTabl
2f580 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  e!=iCur ) contin
2f590 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
2f5a0 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75  ( pOBExpr->iColu
2f5b0 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f  mn!=iColumn ) co
2f5c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2f5d0 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30    if( iColumn>=0
2f5e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f5f0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
2f600 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
2f610 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65  o->pParse, pOrde
2f620 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
2f630 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2f640 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
2f650 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
2f660 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2f670 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
2f680 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70  (pColl->zName, p
2f690 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d  Index->azColl[j]
2f6a0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
2f6b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f6c0 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d         isMatch =
2f6d0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
2f6e0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
2f6f0 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74         if( isMat
2f700 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ch ){.          
2f710 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  if( iColumn<0 ){
2f720 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
2f730 74 63 61 73 65 28 20 64 69 73 74 69 6e 63 74 43  tcase( distinctC
2f740 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20  olumns==0 );.   
2f750 20 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63           distinc
2f760 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20  tColumns = 1;.  
2f770 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f780 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
2f790 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20  KBIT(i);.       
2f7a0 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
2f7b0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2f7c0 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29  RE_GROUPBY)==0 )
2f7d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
2f7e0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   Make sure the s
2f7f0 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d  ort order is com
2f800 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52  patible in an OR
2f810 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
2f820 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f             ** So
2f830 72 74 20 6f 72 64 65 72 20 69 73 20 69 72 72 65  rt order is irre
2f840 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f  levant for a GRO
2f850 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f  UP BY clause. */
2f860 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2f870 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20   revSet ){.     
2f880 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65           if( (re
2f890 76 20 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72  v ^ revIdx)!=pOr
2f8a0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
2f8b0 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 30  Order ) return 0
2f8c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
2f8d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2f8e0 20 20 20 72 65 76 20 3d 20 72 65 76 49 64 78 20     rev = revIdx 
2f8f0 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  ^ pOrderBy->a[i]
2f900 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
2f910 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
2f920 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d  v ) *pRevMask |=
2f930 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b   MASKBIT(iLoop);
2f940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
2f950 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20  evSet = 1;.     
2f960 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f970 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
2f980 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2f990 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20   No match found 
2f9a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
2f9b0 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 43 6f 6c 75   j==0 || j<nColu
2f9c0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
2f9d0 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
2f9e0 64 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29  derDistinct!=0 )
2f9f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73  ;.            is
2fa00 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
2fa10 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
2fa20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2fa30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fa40 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76  } /* end Loop ov
2fa50 65 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c  er all index col
2fa60 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  umns */.      if
2fa70 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  ( distinctColumn
2fa80 73 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  s ){.        tes
2fa90 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69  tcase( isOrderDi
2faa0 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20  stinct==0 );.   
2fab0 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
2fac0 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  inct = 1;.      
2fad0 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69  }.    } /* end-i
2fae0 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f  f not one-row */
2faf0 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66  ..    /* Mark of
2fb00 66 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45  f any other ORDE
2fb10 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20  R BY terms that 
2fb20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20  reference pLoop 
2fb30 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64  */.    if( isOrd
2fb40 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  erDistinct ){.  
2fb50 20 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63      orderDistinc
2fb60 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e  tMask |= pLoop->
2fb70 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
2fb80 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
2fb90 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
2fba0 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20     Expr *p;.    
2fbb0 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
2fbc0 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
2fbd0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70  tinue;.        p
2fbe0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
2fbf0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
2fc00 20 69 66 28 20 28 65 78 70 72 54 61 62 6c 65 55   if( (exprTableU
2fc10 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  sage(&pWInfo->sM
2fc20 61 73 6b 53 65 74 2c 20 70 29 26 7e 6f 72 64 65  askSet, p)&~orde
2fc30 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d  rDistinctMask)==
2fc40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  0 ){.          o
2fc50 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
2fc60 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
2fc70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
2fc80 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20  /* End the loop 
2fc90 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f  over all WhereLo
2fca0 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d  ops from outer-m
2fcb0 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65  ost down to inne
2fcc0 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20  r-most */.  if( 
2fcd0 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20  obSat==obDone ) 
2fce0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
2fcf0 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74  !isOrderDistinct
2fd00 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
2fd10 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 23 69 66  eturn -1;.}..#if
2fd20 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
2fd30 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65  NABLED./* For de
2fd40 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79  bugging use only
2fd50 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  : */.static cons
2fd60 74 20 63 68 61 72 20 2a 77 68 65 72 65 50 61 74  t char *wherePat
2fd70 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68 20  hName(WherePath 
2fd80 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f  *pPath, int nLoo
2fd90 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  p, WhereLoop *pL
2fda0 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ast){.  static c
2fdb0 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20  har zName[65];. 
2fdc0 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
2fdd0 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29  0; i<nLoop; i++)
2fde0 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61  { zName[i] = pPa
2fdf0 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49  th->aLoop[i]->cI
2fe00 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74  d; }.  if( pLast
2fe10 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20   ) zName[i++] = 
2fe20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e  pLast->cId;.  zN
2fe30 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65  ame[i] = 0;.  re
2fe40 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65  turn zName;.}.#e
2fe50 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ndif.../*.** Giv
2fe60 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57  en the list of W
2fe70 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
2fe80 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f   at pWInfo->pLoo
2fe90 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ps, this routine
2fea0 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
2feb0 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20  find the lowest 
2fec0 63 6f 73 74 20 70 61 74 68 20 74 68 61 74 20 76  cost path that v
2fed0 69 73 69 74 73 20 65 61 63 68 20 57 68 65 72 65  isits each Where
2fee0 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54  Loop.** once.  T
2fef0 68 69 73 20 70 61 74 68 20 69 73 20 74 68 65 6e  his path is then
2ff00 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65   loaded into the
2ff10 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c   pWInfo->a[].pWL
2ff20 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a  oop fields..**.*
2ff30 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20 74 68  * Assume that th
2ff40 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
2ff50 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68  f output rows th
2ff60 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  at will need to 
2ff70 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c  be sorted.** wil
2ff80 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e  l be nRowEst (in
2ff90 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70   the 10*log2 rep
2ffa0 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f  resentation).  O
2ffb0 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e  r, ignore sortin
2ffc0 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52  g.** costs if nR
2ffd0 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  owEst==0..**.** 
2ffe0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2fff0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53   on success or S
30000 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61  QLITE_NOMEM of a
30010 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
30020 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  on.** error occu
30030 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
30040 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65  t wherePathSolve
30050 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  r(WhereInfo *pWI
30060 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77  nfo, LogEst nRow
30070 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68  Est){.  int mxCh
30080 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  oice;           
30090 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
300a0 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65  ber of simultane
300b0 6f 75 73 20 70 61 74 68 73 20 74 72 61 63 6b 65  ous paths tracke
300c0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70  d */.  int nLoop
300d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
300e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
300f0 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20  rms in the join 
30100 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
30110 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  se;            /
30120 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
30130 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
30140 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
30150 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
30160 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
30170 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20   int iLoop;     
30180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
30190 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20  op counter over 
301a0 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
301b0 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69   join */.  int i
301c0 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20  i, jj;          
301d0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
301e0 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d  nters */.  int m
301f0 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  xI = 0;         
30200 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
30210 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20 72   next entry to r
30220 65 70 6c 61 63 65 20 2a 2f 0a 20 20 4c 6f 67 45  eplace */.  LogE
30230 73 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20  st rCost;       
30240 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66        /* Cost of
30250 20 61 20 70 61 74 68 20 2a 2f 0a 20 20 4c 6f 67   a path */.  Log
30260 45 73 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20  Est nOut;       
30270 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
30280 20 6f 66 20 6f 75 74 70 75 74 73 20 2a 2f 0a 20   of outputs */. 
30290 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74 20 3d   LogEst mxCost =
302a0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   0;        /* Ma
302b0 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20  ximum cost of a 
302c0 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a  set of paths */.
302d0 20 20 4c 6f 67 45 73 74 20 6d 78 4f 75 74 20 3d    LogEst mxOut =
302e0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d   0;         /* M
302f0 61 78 69 6d 75 6d 20 6e 4f 75 74 20 76 61 6c 75  aximum nOut valu
30300 65 20 6f 6e 20 74 68 65 20 73 65 74 20 6f 66 20  e on the set of 
30310 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73  paths */.  LogEs
30320 74 20 72 53 6f 72 74 43 6f 73 74 3b 20 20 20 20  t rSortCost;    
30330 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 74 6f 20       /* Cost to 
30340 64 6f 20 61 20 73 6f 72 74 20 2a 2f 0a 20 20 69  do a sort */.  i
30350 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20  nt nTo, nFrom;  
30360 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
30370 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72  er of valid entr
30380 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64  ies in aTo[] and
30390 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68   aFrom[] */.  Wh
303a0 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20  erePath *aFrom; 
303b0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e          /* All n
303c0 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68  From paths at th
303d0 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c  e previous level
303e0 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
303f0 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20  *aTo;           
30400 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20  /* The nTo best 
30410 70 61 74 68 73 20 61 74 20 74 68 65 20 63 75 72  paths at the cur
30420 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  rent level */.  
30430 57 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d  WherePath *pFrom
30440 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ;         /* An 
30450 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d  element of aFrom
30460 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
30470 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
30480 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20  herePath *pTo;  
30490 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
304a0 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20  lement of aTo[] 
304b0 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b  that we are work
304c0 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ing on */.  Wher
304d0 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20  eLoop *pWLoop;  
304e0 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
304f0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
30500 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65  jects */.  Where
30510 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20  Loop **pX;      
30520 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
30530 64 69 76 79 20 75 70 20 74 68 65 20 70 53 70 61  divy up the pSpa
30540 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 63  ce memory */.  c
30550 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20  har *pSpace;    
30560 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
30570 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65  orary memory use
30580 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
30590 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d  e */..  pParse =
305a0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
305b0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
305c0 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57  db;.  nLoop = pW
305d0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20  Info->nLevel;.  
305e0 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73  /* TUNING: For s
305f0 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f  imple queries, o
30600 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70 61 74  nly the best pat
30610 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20  h is tracked..  
30620 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69  ** For 2-way joi
30630 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74 20 70  ns, the 5 best p
30640 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65  aths are followe
30650 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e  d..  ** For join
30660 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74  s of 3 or more t
30670 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65  ables, track the
30680 20 31 30 20 62 65 73 74 20 70 61 74 68 73 20 2a   10 best paths *
30690 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28  /.  mxChoice = (
306a0 6e 4c 6f 6f 70 3d 3d 31 29 20 3f 20 31 20 3a 20  nLoop==1) ? 1 : 
306b0 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20  (nLoop==2 ? 5 : 
306c0 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  10);.  assert( n
306d0 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54  Loop<=pWInfo->pT
306e0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
306f0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30    WHERETRACE(0x0
30700 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e  02, ("---- begin
30710 20 73 6f 6c 76 65 72 5c 6e 22 29 29 3b 0a 0a 20   solver\n"));.. 
30720 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
30730 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63   initialize spac
30740 65 20 66 6f 72 20 61 54 6f 20 61 6e 64 20 61 46  e for aTo and aF
30750 72 6f 6d 20 2a 2f 0a 20 20 69 69 20 3d 20 28 73  rom */.  ii = (s
30760 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68 29  izeof(WherePath)
30770 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f  +sizeof(WhereLoo
30780 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f  p*)*nLoop)*mxCho
30790 69 63 65 2a 32 3b 0a 20 20 70 53 70 61 63 65 20  ice*2;.  pSpace 
307a0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
307b0 63 52 61 77 28 64 62 2c 20 69 69 29 3b 0a 20 20  cRaw(db, ii);.  
307c0 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20  if( pSpace==0 ) 
307d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
307e0 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68  MEM;.  aTo = (Wh
307f0 65 72 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b  erePath*)pSpace;
30800 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d  .  aFrom = aTo+m
30810 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65  xChoice;.  memse
30820 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65  t(aFrom, 0, size
30830 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20  of(aFrom[0]));. 
30840 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70   pX = (WhereLoop
30850 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69  **)(aFrom+mxChoi
30860 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78  ce);.  for(ii=mx
30870 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d  Choice*2, pFrom=
30880 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c  aTo; ii>0; ii--,
30890 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20   pFrom++, pX += 
308a0 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f  nLoop){.    pFro
308b0 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20  m->aLoop = pX;. 
308c0 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68   }..  /* Seed th
308d0 65 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20  e search with a 
308e0 73 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68  single WherePath
308f0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f   containing zero
30900 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a   WhereLoops..  *
30910 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44  *.  ** TUNING: D
30920 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75  o not let the nu
30930 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f  mber of iteratio
30940 6e 73 20 67 6f 20 61 62 6f 76 65 20 32 35 2e 20  ns go above 25. 
30950 20 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a   If the cost.  *
30960 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61  * of computing a
30970 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
30980 78 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61  x is not paid ba
30990 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  ck within the fi
309a0 72 73 74 20 32 35 0a 20 20 2a 2a 20 72 6f 77 73  rst 25.  ** rows
309b0 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73  , then do not us
309c0 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
309d0 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f  index. */.  aFro
309e0 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28  m[0].nRow = MIN(
309f0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
30a00 6f 70 2c 20 34 36 29 3b 20 20 61 73 73 65 72 74  op, 46);  assert
30a10 28 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 46==sqlite3Log
30a20 45 73 74 28 32 35 29 20 29 3b 0a 20 20 6e 46 72  Est(25) );.  nFr
30a30 6f 6d 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 50 72  om = 1;..  /* Pr
30a40 65 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 73  ecompute the cos
30a50 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65  t of sorting the
30a60 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 73 65   final result se
30a70 74 2c 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72  t, if the caller
30a80 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  .  ** to sqlite3
30a90 57 68 65 72 65 42 65 67 69 6e 28 29 20 77 61 73  WhereBegin() was
30aa0 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
30ab0 20 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 72 53   sorting */.  rS
30ac0 6f 72 74 43 6f 73 74 20 3d 20 30 3b 0a 20 20 69  ortCost = 0;.  i
30ad0 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
30ae0 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73  rBy==0 || nRowEs
30af0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 46 72 6f  t==0 ){.    aFro
30b00 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 56 61  m[0].isOrderedVa
30b10 6c 69 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  lid = 1;.  }else
30b20 7b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  {.    /* TUNING:
30b30 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20   Estimated cost 
30b40 6f 66 20 73 6f 72 74 69 6e 67 20 69 73 20 34 38  of sorting is 48
30b50 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65  *N*log2(N) where
30b60 20 4e 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a   N is the.    **
30b70 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
30b80 74 20 72 6f 77 73 2e 20 54 68 65 20 34 38 20 69  t rows. The 48 i
30b90 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 73  s the expected s
30ba0 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 74 6f 20  ize of a row to 
30bb0 73 6f 72 74 2e 20 0a 20 20 20 20 2a 2a 20 46 49  sort. .    ** FI
30bc0 58 4d 45 3a 20 20 63 6f 6d 70 75 74 65 20 61 20  XME:  compute a 
30bd0 62 65 74 74 65 72 20 65 73 74 69 6d 61 74 65 20  better estimate 
30be0 6f 66 20 74 68 65 20 34 38 20 6d 75 6c 74 69 70  of the 48 multip
30bf0 6c 69 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68  lier based on th
30c00 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20  e.    ** result 
30c10 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  set expressions.
30c20 20 2a 2f 0a 20 20 20 20 72 53 6f 72 74 43 6f 73   */.    rSortCos
30c30 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 65 73  t = nRowEst + es
30c40 74 4c 6f 67 28 6e 52 6f 77 45 73 74 29 3b 0a 20  tLog(nRowEst);. 
30c50 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
30c60 30 30 32 2c 28 22 2d 2d 2d 2d 20 73 6f 72 74 20  002,("---- sort 
30c70 63 6f 73 74 3d 25 2d 33 64 5c 6e 22 2c 20 72 53  cost=%-3d\n", rS
30c80 6f 72 74 43 6f 73 74 29 29 3b 0a 20 20 7d 0a 0a  ortCost));.  }..
30c90 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75 63    /* Compute suc
30ca0 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72  cessively longer
30cb0 20 57 68 65 72 65 50 61 74 68 73 20 75 73 69 6e   WherePaths usin
30cc0 67 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 67  g the previous g
30cd0 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f  eneration.  ** o
30ce0 66 20 57 68 65 72 65 50 61 74 68 73 20 61 73 20  f WherePaths as 
30cf0 74 68 65 20 62 61 73 69 73 20 66 6f 72 20 74 68  the basis for th
30d00 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20 74 72  e next.  Keep tr
30d10 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43 68 6f  ack of the mxCho
30d20 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20 70 61  ice.  ** best pa
30d30 74 68 73 20 61 74 20 65 61 63 68 20 67 65 6e 65  ths at each gene
30d40 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28  ration */.  for(
30d50 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e  iLoop=0; iLoop<n
30d60 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
30d70 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20      nTo = 0;.   
30d80 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d   for(ii=0, pFrom
30d90 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d  =aFrom; ii<nFrom
30da0 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  ; ii++, pFrom++)
30db0 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57 4c 6f  {.      for(pWLo
30dc0 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  op=pWInfo->pLoop
30dd0 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f  s; pWLoop; pWLoo
30de0 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c  p=pWLoop->pNextL
30df0 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20 42 69  oop){.        Bi
30e00 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 0a 20  tmask maskNew;. 
30e10 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72         Bitmask r
30e20 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  evMask = 0;.    
30e30 20 20 20 20 75 38 20 69 73 4f 72 64 65 72 65 64      u8 isOrdered
30e40 56 61 6c 69 64 20 3d 20 70 46 72 6f 6d 2d 3e 69  Valid = pFrom->i
30e50 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b 0a 20  sOrderedValid;. 
30e60 20 20 20 20 20 20 20 75 38 20 69 73 4f 72 64 65         u8 isOrde
30e70 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f  red = pFrom->isO
30e80 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20  rdered;.        
30e90 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65  if( (pWLoop->pre
30ea0 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61  req & ~pFrom->ma
30eb0 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
30ec0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
30ed0 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  f( (pWLoop->mask
30ee0 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61  Self & pFrom->ma
30ef0 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
30f00 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 2f  tinue;.        /
30f10 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
30f20 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e   pWLoop is a can
30f30 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 68 65  didate to be the
30f40 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20   next loop. .   
30f50 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20       ** Compute 
30f60 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20  its cost */.    
30f70 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69      rCost = sqli
30f80 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 57 4c  te3LogEstAdd(pWL
30f90 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f  oop->rSetup,pWLo
30fa0 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d  op->rRun + pFrom
30fb0 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 20  ->nRow);.       
30fc0 20 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33   rCost = sqlite3
30fd0 4c 6f 67 45 73 74 41 64 64 28 72 43 6f 73 74 2c  LogEstAdd(rCost,
30fe0 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 29 3b 0a   pFrom->rCost);.
30ff0 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 70          nOut = p
31000 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c  From->nRow + pWL
31010 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20  oop->nOut;.     
31020 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72     maskNew = pFr
31030 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70  om->maskLoop | p
31040 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  WLoop->maskSelf;
31050 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73  .        if( !is
31060 4f 72 64 65 72 65 64 56 61 6c 69 64 20 29 7b 0a  OrderedValid ){.
31070 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68            switch
31080 28 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  ( wherePathSatis
31090 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e  fiesOrderBy(pWIn
310a0 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo,.            
310b0 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
310c0 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72  o->pOrderBy, pFr
310d0 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  om, pWInfo->wctr
310e0 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20  lFlags,.        
310f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
31100 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72  Loop, pWLoop, &r
31110 65 76 4d 61 73 6b 29 20 29 7b 0a 20 20 20 20 20  evMask) ){.     
31120 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 20         case 1:  
31130 2f 2a 20 59 65 73 2e 20 20 70 46 72 6f 6d 2b 70  /* Yes.  pFrom+p
31140 57 4c 6f 6f 70 20 64 6f 65 73 20 73 61 74 69 73  WLoop does satis
31150 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  fy the ORDER BY 
31160 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
31170 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
31180 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  d = 1;.         
31190 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61       isOrderedVa
311a0 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  lid = 1;.       
311b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
311c0 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 30            case 0
311d0 3a 20 20 2f 2a 20 4e 6f 2e 20 20 70 46 72 6f 6d  :  /* No.  pFrom
311e0 2b 70 57 4c 6f 6f 70 20 77 69 6c 6c 20 72 65 71  +pWLoop will req
311f0 75 69 72 65 20 61 20 73 65 70 61 72 61 74 65 20  uire a separate 
31200 73 6f 72 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  sort */.        
31210 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 20        isOrdered 
31220 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
31230 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69     isOrderedVali
31240 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  d = 1;.         
31250 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c       rCost = sql
31260 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 43  ite3LogEstAdd(rC
31270 6f 73 74 2c 20 72 53 6f 72 74 43 6f 73 74 29 3b  ost, rSortCost);
31280 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
31290 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
312a0 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20 43 61    default: /* Ca
312b0 6e 6e 6f 74 20 74 65 6c 6c 20 79 65 74 2e 20 20  nnot tell yet.  
312c0 54 72 79 20 61 67 61 69 6e 20 6f 6e 20 74 68 65  Try again on the
312d0 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
312e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
312f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
31300 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
31310 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76  e{.          rev
31320 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65  Mask = pFrom->re
31330 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d  vLoop;.        }
31340 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
31350 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f  k to see if pWLo
31360 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64  op should be add
31370 65 64 20 74 6f 20 74 68 65 20 6d 78 43 68 6f 69  ed to the mxChoi
31380 63 65 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a  ce best so far *
31390 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a  /.        for(jj
313a0 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c  =0, pTo=aTo; jj<
313b0 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b  nTo; jj++, pTo++
313c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
313d0 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d   pTo->maskLoop==
313e0 6d 61 73 6b 4e 65 77 0a 20 20 20 20 20 20 20 20  maskNew.        
313f0 20 20 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64     && pTo->isOrd
31400 65 72 65 64 56 61 6c 69 64 3d 3d 69 73 4f 72 64  eredValid==isOrd
31410 65 72 65 64 56 61 6c 69 64 0a 20 20 20 20 20 20  eredValid.      
31420 20 20 20 20 20 26 26 20 28 28 70 54 6f 2d 3e 72       && ((pTo->r
31430 43 6f 73 74 3c 3d 72 43 6f 73 74 20 26 26 20 70  Cost<=rCost && p
31440 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20  To->nRow<=nOut) 
31450 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
31460 20 20 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3e 3d     (pTo->rCost>=
31470 72 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52  rCost && pTo->nR
31480 6f 77 3e 3d 6e 4f 75 74 29 29 0a 20 20 20 20 20  ow>=nOut)).     
31490 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
314a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 6a      testcase( jj
314b0 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20  ==nTo-1 );.     
314c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
314d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
314e0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
314f0 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20  jj>=nTo ){.     
31500 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78       if( nTo>=mx
31510 43 68 6f 69 63 65 20 26 26 20 72 43 6f 73 74 3e  Choice && rCost>
31520 3d 6d 78 43 6f 73 74 20 29 7b 0a 23 69 66 64 65  =mxCost ){.#ifde
31530 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
31540 42 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20 20  BLED.           
31550 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
31560 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
31570 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
31580 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
31590 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25  Skip   %s cost=%
315a0 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  -3d,%3d order=%c
315b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
315c0 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
315d0 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
315e0 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
315f0 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20  t, nOut,.       
31600 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
31610 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f  eredValid ? (isO
31620 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27  rdered ? 'Y' : '
31630 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  N') : '?');.    
31640 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
31650 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
31660 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
31670 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   }.          /* 
31680 41 64 64 20 61 20 6e 65 77 20 50 61 74 68 20 74  Add a new Path t
31690 6f 20 74 68 65 20 61 54 6f 5b 5d 20 73 65 74 20  o the aTo[] set 
316a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
316b0 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b   nTo<mxChoice ){
316c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
316d0 49 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a  Increase the siz
316e0 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74  e of the aTo set
316f0 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20   by one */.     
31700 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b         jj = nTo+
31710 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  +;.          }el
31720 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
31730 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c  /* New path repl
31740 61 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77  aces the prior w
31750 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75  orst to keep cou
31760 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63  nt below mxChoic
31770 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
31780 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20   jj = mxI;.     
31790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
317a0 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b   pTo = &aTo[jj];
317b0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
317c0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
317d0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
317e0 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29  WhereTrace&0x4 )
317f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
31800 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
31810 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74  ("New    %s cost
31820 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
31830 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
31840 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
31850 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
31860 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
31870 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20  t, nOut,.       
31880 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
31890 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64  edValid ? (isOrd
318a0 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
318b0 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
318c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
318d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
318e0 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72        if( pTo->r
318f0 43 6f 73 74 3c 3d 72 43 6f 73 74 20 26 26 20 70  Cost<=rCost && p
31900 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 20 29  To->nRow<=nOut )
31910 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  {.#ifdef WHERETR
31920 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
31930 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
31940 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
31950 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
31960 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
31970 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
31980 20 20 20 20 20 20 20 20 20 22 53 6b 69 70 20 20           "Skip  
31990 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
319a0 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
319b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
319c0 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
319d0 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
319e0 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
319f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31a00 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69     isOrderedVali
31a10 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f  d ? (isOrdered ?
31a20 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f   'Y' : 'N') : '?
31a30 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
31a40 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
31a50 69 6e 74 66 28 22 20 20 20 76 73 20 25 73 20 63  intf("   vs %s c
31a60 6f 73 74 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65  ost=%-3d,%d orde
31a70 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20  r=%c\n",.       
31a80 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
31a90 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
31aa0 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
31ab0 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
31ac0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31ad0 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
31ae0 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e  edValid ? (pTo->
31af0 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20  isOrdered ? 'Y' 
31b00 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20  : 'N') : '?');. 
31b10 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e             }.#en
31b20 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
31b30 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72  testcase( pTo->r
31b40 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20  Cost==rCost );. 
31b50 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
31b60 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
31b70 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
31b80 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d  ase( pTo->rCost=
31b90 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20  =rCost+1 );.    
31ba0 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 61        /* A new a
31bb0 6e 64 20 62 65 74 74 65 72 20 73 63 6f 72 65 20  nd better score 
31bc0 66 6f 72 20 61 20 70 72 65 76 69 6f 75 73 6c 79  for a previously
31bd0 20 63 72 65 61 74 65 64 20 65 71 75 69 76 61 6c   created equival
31be0 65 6e 74 20 70 61 74 68 20 2a 2f 0a 23 69 66 64  ent path */.#ifd
31bf0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
31c00 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20  ABLED.          
31c10 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
31c20 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
31c30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31c40 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
31c50 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55 70               "Up
31c60 64 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33  date %s cost=%-3
31c70 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c  d,%3d order=%c",
31c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31c90 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
31ca0 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
31cb0 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
31cc0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
31cd0 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69     isOrderedVali
31ce0 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f  d ? (isOrdered ?
31cf0 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f   'Y' : 'N') : '?
31d00 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
31d10 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
31d20 74 66 28 22 20 20 77 61 73 20 25 73 20 63 6f 73  tf("  was %s cos
31d30 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72  t=%-3d,%3d order
31d40 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
31d50 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
31d60 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
31d70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
31d80 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20  st, pTo->nRow,. 
31d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
31da0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c  To->isOrderedVal
31db0 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  id ? (pTo->isOrd
31dc0 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
31dd0 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
31de0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
31df0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
31e00 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69  * pWLoop is a wi
31e10 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f  nner.  Add it to
31e20 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74   the set of best
31e30 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20   so far */.     
31e40 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70     pTo->maskLoop
31e50 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   = pFrom->maskLo
31e60 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73  op | pWLoop->mas
31e70 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70  kSelf;.        p
31e80 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65  To->revLoop = re
31e90 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70  vMask;.        p
31ea0 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b  To->nRow = nOut;
31eb0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 43  .        pTo->rC
31ec0 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20  ost = rCost;.   
31ed0 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
31ee0 72 65 64 56 61 6c 69 64 20 3d 20 69 73 4f 72 64  redValid = isOrd
31ef0 65 72 65 64 56 61 6c 69 64 3b 0a 20 20 20 20 20  eredValid;.     
31f00 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
31f10 64 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a 20  d = isOrdered;. 
31f20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54         memcpy(pT
31f30 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d  o->aLoop, pFrom-
31f40 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57  >aLoop, sizeof(W
31f50 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70  hereLoop*)*iLoop
31f60 29 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  );.        pTo->
31f70 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70  aLoop[iLoop] = p
31f80 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69  WLoop;.        i
31f90 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65  f( nTo>=mxChoice
31fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 78   ){.          mx
31fb0 49 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  I = 0;.         
31fc0 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d   mxCost = aTo[0]
31fd0 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  .rCost;.        
31fe0 20 20 6d 78 4f 75 74 20 3d 20 61 54 6f 5b 30 5d    mxOut = aTo[0]
31ff0 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 20  .nRow;.         
32000 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26   for(jj=1, pTo=&
32010 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f  aTo[1]; jj<mxCho
32020 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b  ice; jj++, pTo++
32030 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
32040 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78  f( pTo->rCost>mx
32050 43 6f 73 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43  Cost || (pTo->rC
32060 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70  ost==mxCost && p
32070 54 6f 2d 3e 6e 52 6f 77 3e 6d 78 4f 75 74 29 20  To->nRow>mxOut) 
32080 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
32090 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72   mxCost = pTo->r
320a0 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
320b0 20 20 20 20 6d 78 4f 75 74 20 3d 20 70 54 6f 2d      mxOut = pTo-
320c0 3e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 20  >nRow;.         
320d0 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20       mxI = jj;. 
320e0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
320f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32100 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
32110 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
32120 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
32130 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
32140 54 72 61 63 65 3e 3d 32 20 29 7b 0a 20 20 20 20  Trace>=2 ){.    
32150 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
32160 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72  intf("---- after
32170 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e   round %d ----\n
32180 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  ", iLoop);.     
32190 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61   for(ii=0, pTo=a
321a0 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b  To; ii<nTo; ii++
321b0 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20  , pTo++){.      
321c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
321d0 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25  intf(" %s cost=%
321e0 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72  -3d nrow=%-3d or
321f0 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
32200 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
32210 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
32220 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
32230 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
32240 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
32250 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f  eredValid ? (pTo
32260 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59  ->isOrdered ? 'Y
32270 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b  ' : 'N') : '?');
32280 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f  .        if( pTo
32290 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
322a0 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72   && pTo->isOrder
322b0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
322c0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
322d0 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c  tf(" rev=0x%llx\
322e0 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70  n", pTo->revLoop
322f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
32300 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
32310 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
32320 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  \n");.        }.
32330 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
32340 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61  ndif..    /* Swa
32350 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61  p the roles of a
32360 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72  From and aTo for
32370 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61   the next genera
32380 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f  tion */.    pFro
32390 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f  m = aTo;.    aTo
323a0 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46   = aFrom;.    aF
323b0 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20  rom = pFrom;.   
323c0 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20   nFrom = nTo;.  
323d0 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d  }..  if( nFrom==
323e0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
323f0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
32400 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74   "no query solut
32410 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ion");.    sqlit
32420 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 70  e3DbFree(db, pSp
32430 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ace);.    return
32440 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
32450 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20   }.  .  /* Find 
32460 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
32470 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c  path.  pFrom wil
32480 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69  l be left pointi
32490 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74 68 20  ng to that path 
324a0 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72  */.  pFrom = aFr
324b0 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20  om;.  for(ii=1; 
324c0 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b  ii<nFrom; ii++){
324d0 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
324e0 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e  rCost>aFrom[ii].
324f0 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20  rCost ) pFrom = 
32500 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a  &aFrom[ii];.  }.
32510 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
32520 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20  ->nLevel==nLoop 
32530 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  );.  /* Load the
32540 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74   lowest cost pat
32550 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f  h into pWInfo */
32560 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
32570 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f  iLoop<nLoop; iLo
32580 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65  op++){.    Where
32590 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20  Level *pLevel = 
325a0 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f  pWInfo->a + iLoo
325b0 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  p;.    pLevel->p
325c0 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d  WLoop = pWLoop =
325d0 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c   pFrom->aLoop[iL
325e0 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c  oop];.    pLevel
325f0 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70  ->iFrom = pWLoop
32600 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76  ->iTab;.    pLev
32610 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57  el->iTabCur = pW
32620 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
32630 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
32640 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20  .iCursor;.  }.  
32650 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
32660 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
32670 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d  WANT_DISTINCT)!=
32680 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d  0.   && (pWInfo-
32690 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
326a0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d  ERE_DISTINCTBY)=
326b0 3d 30 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d  =0.   && pWInfo-
326c0 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52  >eDistinct==WHER
326d0 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a  E_DISTINCT_NOOP.
326e0 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a 20 20     && nRowEst.  
326f0 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e  ){.    Bitmask n
32700 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e 74 20  otUsed;.    int 
32710 72 63 20 3d 20 77 68 65 72 65 50 61 74 68 53 61  rc = wherePathSa
32720 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70  tisfiesOrderBy(p
32730 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70  WInfo, pWInfo->p
32740 52 65 73 75 6c 74 53 65 74 2c 20 70 46 72 6f 6d  ResultSet, pFrom
32750 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
32760 20 20 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43     WHERE_DISTINC
32770 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46  TBY, nLoop-1, pF
32780 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70  rom->aLoop[nLoop
32790 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a  -1], &notUsed);.
327a0 20 20 20 20 69 66 28 20 72 63 3d 3d 31 20 29 20      if( rc==1 ) 
327b0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
327c0 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
327d0 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 7d 0a  CT_ORDERED;.  }.
327e0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f    if( pFrom->isO
327f0 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20 69 66  rdered ){.    if
32800 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
32810 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
32820 54 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20  TINCTBY ){.     
32830 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
32840 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
32850 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20  NCT_ORDERED;.   
32860 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57   }else{.      pW
32870 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 31  Info->bOBSat = 1
32880 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ;.      pWInfo->
32890 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d  revMask = pFrom-
328a0 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a  >revLoop;.    }.
328b0 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52    }.  pWInfo->nR
328c0 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e  owOut = pFrom->n
328d0 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  Row;..  /* Free 
328e0 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  temporary memory
328f0 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63   and return succ
32900 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ess */.  sqlite3
32910 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63  DbFree(db, pSpac
32920 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
32930 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
32940 20 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75 73   Most queries us
32950 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  e only a single 
32960 74 61 62 6c 65 20 28 74 68 65 79 20 61 72 65 20  table (they are 
32970 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68  not joins) and h
32980 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d  ave.** simple ==
32990 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61   constraints aga
329a0 69 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69 65  inst indexed fie
329b0 6c 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lds.  This routi
329c0 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  ne attempts.** t
329d0 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d  o plan those sim
329e0 70 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67 20  ple cases using 
329f0 6d 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f  much less ceremo
32a00 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67  ny than the.** g
32a10 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71  eneral-purpose q
32a20 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e  uery planner, an
32a30 64 20 74 68 65 72 65 62 79 20 79 69 65 6c 64 20  d thereby yield 
32a40 66 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70  faster sqlite3_p
32a50 72 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65  repare().** time
32a60 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  s for the common
32a70 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   case..**.** Ret
32a80 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20  urn non-zero on 
32a90 73 75 63 63 65 73 73 2c 20 69 66 20 74 68 69 73  success, if this
32aa0 20 71 75 65 72 79 20 63 61 6e 20 62 65 20 68 61   query can be ha
32ab0 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a  ndled by this.**
32ac0 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79   no-frills query
32ad0 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72   planner.  Retur
32ae0 6e 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71  n zero if this q
32af0 75 65 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a  uery needs the .
32b00 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f  ** general-purpo
32b10 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  se query planner
32b20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
32b30 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 57 68  whereShortCut(Wh
32b40 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
32b50 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65  pBuilder){.  Whe
32b60 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a  reInfo *pWInfo;.
32b70 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
32b80 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
32b90 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
32ba0 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
32bb0 54 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  Term;.  WhereLoo
32bc0 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20  p *pLoop;.  int 
32bd0 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  iCur;.  int j;. 
32be0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
32bf0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a  Index *pIdx;.  .
32c00 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
32c10 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69  der->pWInfo;.  i
32c20 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
32c30 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f  Flags & WHERE_FO
32c40 52 43 45 5f 54 41 42 4c 45 20 29 20 72 65 74 75  RCE_TABLE ) retu
32c50 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
32c60 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
32c70 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70  ->nSrc>=1 );.  p
32c80 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
32c90 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54  TabList->a;.  pT
32ca0 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
32cb0 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ;.  if( IsVirtua
32cc0 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
32cd0 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d   0;.  if( pItem-
32ce0 3e 7a 49 6e 64 65 78 20 29 20 72 65 74 75 72 6e  >zIndex ) return
32cf0 20 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74   0;.  iCur = pIt
32d00 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70  em->iCursor;.  p
32d10 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57  WC = &pWInfo->sW
32d20 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75  C;.  pLoop = pBu
32d30 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
32d40 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
32d50 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e  0;.  pTerm = fin
32d60 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
32d70 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 30   -1, 0, WO_EQ, 0
32d80 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  );.  if( pTerm )
32d90 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  {.    pLoop->wsF
32da0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
32db0 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b  UMN_EQ|WHERE_IPK
32dc0 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20  |WHERE_ONEROW;. 
32dd0 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
32de0 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
32df0 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d   pLoop->nLTerm =
32e00 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75   1;.    pLoop->u
32e10 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a  .btree.nEq = 1;.
32e20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
32e30 6f 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c  ost of a rowid l
32e40 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20  ookup is 10 */. 
32e50 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d     pLoop->rRun =
32e60 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c   33;  /* 33==sql
32e70 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20 2a  ite3LogEst(10) *
32e80 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  /.  }else{.    f
32e90 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
32ea0 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
32eb0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
32ec0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
32ed0 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d  op->aLTermSpace=
32ee0 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29  =pLoop->aLTerm )
32ef0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
32f00 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d  ArraySize(pLoop-
32f10 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3d 3d 34  >aLTermSpace)==4
32f20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
32f30 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
32f40 4e 6f 6e 65 20 0a 20 20 20 20 20 20 20 7c 7c 20  None .       || 
32f50 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
32f60 65 72 65 21 3d 30 20 0a 20 20 20 20 20 20 20 7c  ere!=0 .       |
32f70 7c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  | pIdx->nColumn>
32f80 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d  ArraySize(pLoop-
32f90 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 20 0a 20  >aLTermSpace) . 
32fa0 20 20 20 20 20 29 20 63 6f 6e 74 69 6e 75 65 3b       ) continue;
32fb0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
32fc0 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  j<pIdx->nColumn;
32fd0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   j++){.        p
32fe0 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
32ff0 70 57 43 2c 20 69 43 75 72 2c 20 70 49 64 78 2d  pWC, iCur, pIdx-
33000 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c  >aiColumn[j], 0,
33010 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 3b 0a 20   WO_EQ, pIdx);. 
33020 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
33030 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
33040 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65       pLoop->aLTe
33050 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  rm[j] = pTerm;. 
33060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
33070 20 6a 21 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   j!=pIdx->nColum
33080 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
33090 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
330a0 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs = WHERE_COLUM
330b0 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f  N_EQ|WHERE_ONERO
330c0 57 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  W|WHERE_INDEXED;
330d0 0a 20 20 20 20 20 20 69 66 28 20 28 70 49 74 65  .      if( (pIte
330e0 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f  m->colUsed & ~co
330f0 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49 64  lumnsInIndex(pId
33100 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x))==0 ){.      
33110 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
33120 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e   |= WHERE_IDX_ON
33130 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LY;.      }.    
33140 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20    pLoop->nLTerm 
33150 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  = j;.      pLoop
33160 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
33170 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  j;.      pLoop->
33180 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
33190 20 70 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20   pIdx;.      /* 
331a0 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20  TUNING: Cost of 
331b0 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6c  a unique index l
331c0 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a 20  ookup is 15 */. 
331d0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e       pLoop->rRun
331e0 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73   = 39;  /* 39==s
331f0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 35 29  qlite3LogEst(15)
33200 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
33210 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
33220 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
33230 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  ){.    pLoop->nO
33240 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a  ut = (LogEst)1;.
33250 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
33260 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b  .pWLoop = pLoop;
33270 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  .    pLoop->mask
33280 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26  Self = getMask(&
33290 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
332a0 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 70 57 49  , iCur);.    pWI
332b0 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75  nfo->a[0].iTabCu
332c0 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57  r = iCur;.    pW
332d0 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20  Info->nRowOut = 
332e0 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  1;.    if( pWInf
332f0 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57  o->pOrderBy ) pW
33300 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 20  Info->bOBSat =  
33310 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  1;.    if( pWInf
33320 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
33330 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
33340 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49  NCT ){.      pWI
33350 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
33360 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
33370 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69  UNIQUE;.    }.#i
33380 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
33390 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64  G.    pLoop->cId
333a0 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20   = '0';.#endif. 
333b0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
333c0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
333d0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
333e0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
333f0 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f  the loop used fo
33400 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  r WHERE clause p
33410 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68  rocessing..** Th
33420 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
33430 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
33440 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75  n opaque structu
33450 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  re that contains
33460 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
33470 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e  needed to termin
33480 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c  ate the loop.  L
33490 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ater, the callin
334a0 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f  g routine.** sho
334b0 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  uld invoke sqlit
334c0 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74  e3WhereEnd() wit
334d0 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  h the return val
334e0 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
334f0 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ion.** in order 
33500 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
33510 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
33520 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  cessing..**.** I
33530 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
33540 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
33550 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a  returns NULL..**
33560 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64  .** The basic id
33570 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65  ea is to do a ne
33580 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c  sted loop, one l
33590 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62  oop for each tab
335a0 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f  le in.** the FRO
335b0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65  M clause of a se
335c0 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61  lect.  (INSERT a
335d0 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  nd UPDATE statem
335e0 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20  ents are the.** 
335f0 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54  same as a SELECT
33600 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e   with only a sin
33610 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
33620 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20   FROM clause.)  
33630 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
33640 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68  if the SQL is th
33650 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
33660 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
33670 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e  , t2, t3 WHERE .
33680 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74  ..;.**.** Then t
33690 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
336a0 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c  d is conceptuall
336b0 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f  y like the follo
336c0 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
336d0 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
336e0 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20   t1 do       \  
336f0 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
33700 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61  .**        forea
33710 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
33720 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
33730 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
33740 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72  .**          for
33750 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20  each row3 in t3 
33760 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20  do   /.**       
33770 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
33780 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
33790 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20               \  
337a0 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
337b0 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20  .**        end  
337c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
337d0 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
337e0 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a  ite3WhereEnd().*
337f0 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20  *      end      
33800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33810 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20     /.**.** Note 
33820 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d  that the loops m
33830 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74  ight not be nest
33840 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
33850 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  in which they.**
33860 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
33870 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20  ROM clause if a 
33880 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20  different order 
33890 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74  is better able t
338a0 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66  o make.** use of
338b0 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20   indices.  Note 
338c0 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  also that when t
338d0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61  he IN operator a
338e0 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65  ppears in.** the
338f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
33900 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
33910 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73  n additional nes
33920 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a  ted loops for.**
33930 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
33940 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20  h all values on 
33950 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
33960 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a  ide of the IN..*
33970 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42  *.** There are B
33980 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73  tree cursors ass
33990 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
339a0 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65  h table.  t1 use
339b0 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  s cursor.** numb
339c0 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  er pTabList->a[0
339d0 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75  ].iCursor.  t2 u
339e0 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70  ses the cursor p
339f0 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43  TabList->a[1].iC
33a00 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f  ursor..** And so
33a10 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f   forth.  This ro
33a20 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
33a30 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f  code to open tho
33a40 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a  se VDBE cursors.
33a50 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68  ** and sqlite3Wh
33a60 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74  ereEnd() generat
33a70 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63  es the code to c
33a80 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  lose them..**.**
33a90 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   The code that s
33aa0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
33ab0 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61  () generates lea
33ac0 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20  ves the cursors 
33ad0 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62  named.** in pTab
33ae0 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  List pointing at
33af0 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61   their appropria
33b00 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65  te entries.  The
33b10 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63   [...] code.** c
33b20 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e  an use OP_Column
33b30 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70   and OP_Rowid op
33b40 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63  codes on these c
33b50 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63  ursors to extrac
33b60 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74  t.** data from t
33b70 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65  he various table
33b80 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  s of the loop..*
33b90 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
33ba0 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74  E clause is empt
33bb0 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c  y, the foreach l
33bc0 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73  oops must each s
33bd0 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74  can their.** ent
33be0 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75  ire tables.  Thu
33bf0 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f  s a three-way jo
33c00 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20  in is an O(N^3) 
33c10 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20  operation.  But 
33c20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73  if.** the tables
33c30 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e   have indices an
33c40 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d  d there are term
33c50 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
33c60 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65  lause that.** re
33c70 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64  fer to those ind
33c80 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65  ices, a complete
33c90 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20   table scan can 
33ca0 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74  be avoided and t
33cb0 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20  he.** code will 
33cc0 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e  run much faster.
33cd0 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f    Most of the wo
33ce0 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  rk of this routi
33cf0 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a  ne is checking.*
33d00 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  * to see if ther
33d10 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68  e are indices th
33d20 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
33d30 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c  o speed up the l
33d40 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  oop..**.** Terms
33d50 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
33d60 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73  ause are also us
33d70 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63  ed to limit whic
33d80 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a  h rows actually.
33d90 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68  ** make it to th
33da0 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d  e "..." in the m
33db0 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f  iddle of the loo
33dc0 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22  p.  After each "
33dd0 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72  foreach",.** ter
33de0 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
33df0 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20  clause that use 
33e00 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68  only terms in th
33e10 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65  at loop and oute
33e20 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65  r.** loops are e
33e30 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20  valuated and if 
33e40 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20  false a jump is 
33e50 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20  made around all 
33e60 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e  subsequent.** in
33e70 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72  ner loops (or ar
33e80 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69  ound the "..." i
33e90 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72  f the test occur
33ea0 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e  s within the inn
33eb0 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70  er-.** most loop
33ec0 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f  ).**.** OUTER JO
33ed0 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74  INS.**.** An out
33ee0 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65  er join of table
33ef0 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63  s t1 and t2 is c
33f00 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64  onceptally coded
33f10 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
33f20 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f  **    foreach ro
33f30 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20  w1 in t1 do.**  
33f40 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20      flag = 0.** 
33f50 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
33f60 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20  2 in t2 do.**   
33f70 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20       start:.**  
33f80 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
33f90 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31          flag = 1
33fa0 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20  .**      end.** 
33fb0 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20       if flag==0 
33fc0 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d  then.**        m
33fd0 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72  ove the row2 cur
33fe0 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f  sor to a null ro
33ff0 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f  w.**        goto
34000 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66   start.**      f
34010 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a  i.**    end.**.*
34020 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53  * ORDER BY CLAUS
34030 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a  E PROCESSING.**.
34040 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61  ** pOrderBy is a
34050 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
34060 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
34070 28 6f 72 20 74 68 65 20 47 52 4f 55 50 20 42 59  (or the GROUP BY
34080 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68   clause.** if th
34090 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  e WHERE_GROUPBY 
340a0 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 77  flag is set in w
340b0 63 74 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20  ctrlFlags) of a 
340c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
340d0 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
340e0 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  one.  If there i
340f0 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
34100 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20  ause or if this 
34110 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
34120 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44  lled from an UPD
34130 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
34140 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f  atement, then pO
34150 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a  rderBy is NULL..
34160 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71  */.WhereInfo *sq
34170 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
34180 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
34190 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
341a0 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
341b0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
341c0 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 46 52 4f  bList,    /* FRO
341d0 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74  M clause: A list
341e0 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74   of all tables t
341f0 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
34200 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
34210 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
34220 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
34230 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
34240 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44  rBy,   /* An ORD
34250 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72  ER BY clause, or
34260 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
34270 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74 2c  ist *pResultSet,
34280 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 20 6f   /* Result set o
34290 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  f the query */. 
342a0 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c   u16 wctrlFlags,
342b0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
342c0 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61   the WHERE_* fla
342d0 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71  gs defined in sq
342e0 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69  liteInt.h */.  i
342f0 6e 74 20 69 49 64 78 43 75 72 20 20 20 20 20 20  nt iIdxCur      
34300 20 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45       /* If WHERE
34310 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69  _ONETABLE_ONLY i
34320 73 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72  s set, index cur
34330 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  sor number */.){
34340 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66  .  int nByteWInf
34350 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
34360 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f   Num. bytes allo
34370 63 61 74 65 64 20 66 6f 72 20 57 68 65 72 65 49  cated for WhereI
34380 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20  nfo struct */.  
34390 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20  int nTabList;   
343a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
343b0 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
343c0 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a   in pTabList */.
343d0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
343e0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nfo;         /* 
343f0 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  Will become the 
34400 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
34410 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
34420 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
34430 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a  rse->pVdbe;   /*
34440 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74   The virtual dat
34450 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  abase engine */.
34460 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
34470 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dy;          /* 
34480 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  Cursors that are
34490 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f   not yet positio
344a0 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ned */.  WhereLo
344b0 6f 70 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20  opBuilder sWLB; 
344c0 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
344d0 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a  Loop builder */.
344e0 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a    WhereMaskSet *
344f0 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20  pMaskSet;    /* 
34500 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  The expression m
34510 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65  ask set */.  Whe
34520 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
34530 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
34540 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49  gle level in pWI
34550 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68  nfo->a[] */.  Wh
34560 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20  ereLoop *pLoop; 
34570 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
34580 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ter to a single 
34590 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
345a0 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20   */.  int ii;   
345b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345c0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
345d0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
345e0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
345f0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
34600 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
34610 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
34620 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
34630 6e 20 63 6f 64 65 20 2a 2f 0a 0a 0a 20 20 2f 2a  n code */...  /*
34640 20 56 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61   Variable initia
34650 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62  lization */.  db
34660 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
34670 20 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c 20 30   memset(&sWLB, 0
34680 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b  , sizeof(sWLB));
34690 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  .  sWLB.pOrderBy
346a0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20   = pOrderBy;..  
346b0 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44  /* Disable the D
346c0 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61  ISTINCT optimiza
346d0 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44  tion if SQLITE_D
346e0 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65  istinctOpt is se
346f0 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74  t via.  ** sqlit
34700 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c  e3_test_ctrl(SQL
34710 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
34720 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20  IMIZATIONS,...) 
34730 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
34740 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
34750 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63  , SQLITE_Distinc
34760 74 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74  tOpt) ){.    wct
34770 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52  rlFlags &= ~WHER
34780 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b  E_WANT_DISTINCT;
34790 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  .  }..  /* The n
347a0 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20  umber of tables 
347b0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
347c0 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
347d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
347e0 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69   ** bits in a Bi
347f0 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65  tmask .  */.  te
34800 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74  stcase( pTabList
34810 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20  ->nSrc==BMS );. 
34820 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
34830 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73  Src>BMS ){.    s
34840 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
34850 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20  Parse, "at most 
34860 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a  %d tables in a j
34870 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20  oin", BMS);.    
34880 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
34890 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
348a0 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72  n normally gener
348b0 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f  ates a nested lo
348c0 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  op for all table
348d0 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c  s in .  ** pTabL
348e0 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65  ist.  But if the
348f0 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
34900 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74  ONLY flag is set
34910 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64  , then we should
34920 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72  .  ** only gener
34930 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
34940 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20   first table in 
34950 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73  pTabList and ass
34960 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e  ume that.  ** an
34970 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  y cursors associ
34980 61 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71  ated with subseq
34990 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20  uent tables are 
349a0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
349b0 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d   */.  nTabList =
349c0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
349d0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
349e0 4c 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69  LY) ? 1 : pTabLi
349f0 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20  st->nSrc;..  /* 
34a00 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
34a10 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72  tialize the Wher
34a20 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
34a30 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
34a40 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e   the.  ** return
34a50 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65   value. A single
34a60 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75   allocation is u
34a70 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
34a80 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20   WhereInfo.  ** 
34a90 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74  struct, the cont
34aa0 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66  ents of WhereInf
34ab0 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65  o.a[], the Where
34ac0 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
34ad0 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68  .  ** and the Wh
34ae0 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63  ereMaskSet struc
34af0 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72  ture. Since Wher
34b00 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73  eClause contains
34b10 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20   an 8-byte.  ** 
34b20 66 69 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d  field (type Bitm
34b30 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20  ask) it must be 
34b40 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d  aligned on an 8-
34b50 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e  byte boundary on
34b60 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69  .  ** some archi
34b70 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20  tectures. Hence 
34b80 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c  the ROUND8() bel
34b90 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65  ow..  */.  nByte
34ba0 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73  WInfo = ROUND8(s
34bb0 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29  izeof(WhereInfo)
34bc0 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69  +(nTabList-1)*si
34bd0 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29  zeof(WhereLevel)
34be0 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  );.  pWInfo = sq
34bf0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
34c00 6f 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f  o(db, nByteWInfo
34c10 20 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c   + sizeof(WhereL
34c20 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d  oop));.  if( db-
34c30 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
34c40 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
34c50 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
34c60 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a      pWInfo = 0;.
34c70 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
34c80 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ginError;.  }.  
34c90 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d  pWInfo->nLevel =
34ca0 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49   nTabList;.  pWI
34cb0 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50  nfo->pParse = pP
34cc0 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  arse;.  pWInfo->
34cd0 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c  pTabList = pTabL
34ce0 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  ist;.  pWInfo->p
34cf0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
34d00 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52  By;.  pWInfo->pR
34d10 65 73 75 6c 74 53 65 74 20 3d 20 70 52 65 73 75  esultSet = pResu
34d20 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  ltSet;.  pWInfo-
34d30 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65  >iBreak = sqlite
34d40 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
34d50 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74  );.  pWInfo->wct
34d60 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46  rlFlags = wctrlF
34d70 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  lags;.  pWInfo->
34d80 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20  savedNQueryLoop 
34d90 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  = pParse->nQuery
34da0 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74  Loop;.  pMaskSet
34db0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73   = &pWInfo->sMas
34dc0 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49  kSet;.  sWLB.pWI
34dd0 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20  nfo = pWInfo;.  
34de0 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57 49 6e  sWLB.pWC = &pWIn
34df0 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e  fo->sWC;.  sWLB.
34e00 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f  pNew = (WhereLoo
34e10 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57 49 6e  p*)(((char*)pWIn
34e20 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b  fo)+nByteWInfo);
34e30 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
34e40 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
34e50 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20  sWLB.pNew) );.  
34e60 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57  whereLoopInit(sW
34e70 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65 66  LB.pNew);.#ifdef
34e80 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
34e90 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d  sWLB.pNew->cId =
34ea0 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   '*';.#endif..  
34eb0 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48 45  /* Split the WHE
34ec0 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73  RE clause into s
34ed0 65 70 61 72 61 74 65 20 73 75 62 65 78 70 72 65  eparate subexpre
34ee0 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63  ssions where eac
34ef0 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73  h.  ** subexpres
34f00 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65  sion is separate
34f10 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72  d by an AND oper
34f20 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69  ator..  */.  ini
34f30 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65  tMaskSet(pMaskSe
34f40 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  t);.  whereClaus
34f50 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73  eInit(&pWInfo->s
34f60 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73  WC, pWInfo);.  s
34f70 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
34f80 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20  nstants(pParse, 
34f90 70 57 68 65 72 65 29 3b 0a 20 20 77 68 65 72 65  pWhere);.  where
34fa0 53 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73  Split(&pWInfo->s
34fb0 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41  WC, pWhere, TK_A
34fc0 4e 44 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  ND);.  sqlite3Co
34fd0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
34fe0 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49  Parse, -1); /* I
34ff0 6e 73 65 72 74 20 74 68 65 20 63 6f 6f 6b 69 65  nsert the cookie
35000 20 76 65 72 69 66 69 65 72 20 47 6f 74 6f 20 2a   verifier Goto *
35010 2f 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63  /.    .  /* Spec
35020 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52  ial case: a WHER
35030 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73  E clause that is
35040 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c   constant.  Eval
35050 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78  uate the.  ** ex
35060 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74  pression and eit
35070 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c  her jump over al
35080 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72  l of the code or
35090 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f   fall thru..  */
350a0 0a 20 20 69 66 28 20 70 57 68 65 72 65 20 26 26  .  if( pWhere &&
350b0 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c   (nTabList==0 ||
350c0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
350d0 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57  nstantNotJoin(pW
350e0 68 65 72 65 29 29 20 29 7b 0a 20 20 20 20 73 71  here)) ){.    sq
350f0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
35100 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c  (pParse, pWhere,
35110 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c   pWInfo->iBreak,
35120 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
35130 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20  LL);.    pWhere 
35140 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  = 0;.  }..  /* S
35150 70 65 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20  pecial case: No 
35160 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
35170 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d  .  if( nTabList=
35180 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f  =0 ){.    if( pO
35190 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d  rderBy ) pWInfo-
351a0 3e 62 4f 42 53 61 74 20 3d 20 31 3b 0a 20 20 20  >bOBSat = 1;.   
351b0 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
351c0 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
351d0 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70  TINCT ){.      p
351e0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
351f0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
35200 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a  T_UNIQUE;.    }.
35210 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e    }..  /* Assign
35220 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20   a bit from the 
35230 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79  bitmask to every
35240 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f   term in the FRO
35250 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  M clause..  **. 
35260 20 2a 2a 20 57 68 65 6e 20 61 73 73 69 67 6e 69   ** When assigni
35270 6e 67 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65  ng bitmask value
35280 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65  s to FROM clause
35290 20 63 75 72 73 6f 72 73 2c 20 69 74 20 6d 75 73   cursors, it mus
352a0 74 20 62 65 0a 20 20 2a 2a 20 74 68 65 20 63 61  t be.  ** the ca
352b0 73 65 20 74 68 61 74 20 69 66 20 58 20 69 73 20  se that if X is 
352c0 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
352d0 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c  the N-th FROM cl
352e0 61 75 73 65 20 74 65 72 6d 20 74 68 65 6e 0a 20  ause term then. 
352f0 20 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 20   ** the bitmask 
35300 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61  for all FROM cla
35310 75 73 65 20 74 65 72 6d 73 20 74 6f 20 74 68 65  use terms to the
35320 20 6c 65 66 74 20 6f 66 20 74 68 65 20 4e 2d 74   left of the N-t
35330 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28  h term.  ** is (
35340 58 2d 31 29 2e 20 20 20 41 6e 20 65 78 70 72 65  X-1).   An expre
35350 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f  ssion from the O
35360 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45  N clause of a LE
35370 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a  FT JOIN can use.
35380 20 20 2a 2a 20 69 74 73 20 45 78 70 72 2e 69 52    ** its Expr.iR
35390 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61  ightJoinTable va
353a0 6c 75 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  lue to find the 
353b0 62 69 74 6d 61 73 6b 20 6f 66 20 74 68 65 20 72  bitmask of the r
353c0 69 67 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ight table.  ** 
353d0 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75  of the join.  Su
353e0 62 74 72 61 63 74 69 6e 67 20 6f 6e 65 20 66 72  btracting one fr
353f0 6f 6d 20 74 68 65 20 72 69 67 68 74 20 74 61 62  om the right tab
35400 6c 65 20 62 69 74 6d 61 73 6b 20 67 69 76 65 73  le bitmask gives
35410 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20   a.  ** bitmask 
35420 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74  for all tables t
35430 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68  o the left of th
35440 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67  e join.  Knowing
35450 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a   the bitmask.  *
35460 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  * for all tables
35470 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
35480 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20 69  a left join is i
35490 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65  mportant.  Ticke
354a0 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20  t #3015..  **.  
354b0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69 74  ** Note that bit
354c0 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61 74 65  masks are create
354d0 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69  d for all pTabLi
354e0 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73 20  st->nSrc tables 
354f0 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74  in.  ** pTabList
35500 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 66  , not just the f
35510 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74 61  irst nTabList ta
35520 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74 20  bles.  nTabList 
35530 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a  is normally.  **
35540 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69   equal to pTabLi
35550 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67  st->nSrc but mig
35560 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20  ht be shortened 
35570 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a 2a  to 1 if the.  **
35580 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
35590 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74  ONLY flag is set
355a0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
355b0 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e  0; ii<pTabList->
355c0 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nSrc; ii++){.   
355d0 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73   createMask(pMas
355e0 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
355f0 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  a[ii].iCursor);.
35600 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
35610 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d 61  UG.  {.    Bitma
35620 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d 20 30  sk toTheLeft = 0
35630 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
35640 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ii<pTabList->nSr
35650 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
35660 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d  Bitmask m = getM
35670 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
35680 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43  abList->a[ii].iC
35690 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73  ursor);.      as
356a0 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54  sert( (m-1)==toT
356b0 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  heLeft );.      
356c0 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a  toTheLeft |= m;.
356d0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
356e0 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61  ..  /* Analyze a
356f0 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78 70  ll of the subexp
35700 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20  ressions.  Note 
35710 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65  that exprAnalyze
35720 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64  () might.  ** ad
35730 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65  d new virtual te
35740 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  rms onto the end
35750 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
35760 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ause.  We do not
35770 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e  .  ** want to an
35780 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72 74  alyze these virt
35790 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74  ual terms, so st
357a0 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74  art analyzing at
357b0 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e   the end.  ** an
357c0 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73  d work forward s
357d0 6f 20 74 68 61 74 20 74 68 65 20 61 64 64 65 64  o that the added
357e0 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61   virtual terms a
357f0 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73  re never process
35800 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41  ed..  */.  exprA
35810 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69  nalyzeAll(pTabLi
35820 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  st, &pWInfo->sWC
35830 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
35840 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
35850 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
35860 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Error;.  }..  /*
35870 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
35880 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63   (or GROUP BY) c
35890 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 72  lause contains r
358a0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 67 65 6e  eferences to gen
358b0 65 72 61 6c 0a 20 20 2a 2a 20 65 78 70 72 65 73  eral.  ** expres
358c0 73 69 6f 6e 73 2c 20 74 68 65 6e 20 77 65 20 77  sions, then we w
358d0 6f 6e 27 74 20 62 65 20 61 62 6c 65 20 74 6f 20  on't be able to 
358e0 73 61 74 69 73 66 79 20 69 74 20 75 73 69 6e 67  satisfy it using
358f0 20 69 6e 64 69 63 65 73 2c 20 73 6f 0a 20 20 2a   indices, so.  *
35900 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64  * go ahead and d
35910 69 73 61 62 6c 65 20 69 74 20 6e 6f 77 2e 0a 20  isable it now.. 
35920 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
35930 42 79 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67  By && (wctrlFlag
35940 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
35950 49 53 54 49 4e 43 54 29 21 3d 30 20 29 7b 0a 20  ISTINCT)!=0 ){. 
35960 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
35970 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
35980 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78   ii++){.      Ex
35990 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69  pr *pExpr = sqli
359a0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
359b0 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  te(pOrderBy->a[i
359c0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
359d0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
359e0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
359f0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72       pWInfo->pOr
35a00 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
35a10 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72   = 0;.        br
35a20 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
35a30 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
35a40 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  umn<0 ){.       
35a50 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
35a60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
35a70 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
35a80 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
35a90 54 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 44  T ){.    if( isD
35aa0 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74  istinctRedundant
35ab0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
35ac0 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  t, &pWInfo->sWC,
35ad0 20 70 52 65 73 75 6c 74 53 65 74 29 20 29 7b 0a   pResultSet) ){.
35ae0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 44 49 53        /* The DIS
35af0 54 49 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69 73  TINCT marking is
35b00 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67 6e   pointless.  Ign
35b10 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20  ore it. */.     
35b20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
35b30 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
35b40 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  NCT_UNIQUE;.    
35b50 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 64 65 72  }else if( pOrder
35b60 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  By==0 ){.      /
35b70 2a 20 54 72 79 20 74 6f 20 4f 52 44 45 52 20 42  * Try to ORDER B
35b80 59 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  Y the result set
35b90 20 74 6f 20 6d 61 6b 65 20 64 69 73 74 69 6e 63   to make distinc
35ba0 74 20 70 72 6f 63 65 73 73 69 6e 67 20 65 61 73  t processing eas
35bb0 69 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 57 49  ier */.      pWI
35bc0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
35bd0 7c 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  |= WHERE_DISTINC
35be0 54 42 59 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  TBY;.      pWInf
35bf0 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 52  o->pOrderBy = pR
35c00 65 73 75 6c 74 53 65 74 3b 0a 20 20 20 20 7d 0a  esultSet;.    }.
35c10 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72    }..  /* Constr
35c20 75 63 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  uct the WhereLoo
35c30 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57  p objects */.  W
35c40 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66  HERETRACE(0xffff
35c50 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  ,("*** Optimizer
35c60 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b   Start ***\n"));
35c70 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21  .  if( nTabList!
35c80 3d 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74  =1 || whereShort
35c90 43 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b  Cut(&sWLB)==0 ){
35ca0 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
35cb0 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29  oopAddAll(&sWLB)
35cc0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
35cd0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
35ce0 72 6f 72 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 44  ror;.  .    /* D
35cf0 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68  isplay all of th
35d00 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
35d10 63 74 73 20 69 66 20 77 68 65 72 65 74 72 61 63  cts if wheretrac
35d20 65 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  e is enabled */.
35d30 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
35d40 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66  E_ENABLED.    if
35d50 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
35d60 61 63 65 20 29 7b 0a 20 20 20 20 20 20 57 68 65  ace ){.      Whe
35d70 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20  reLoop *p;.     
35d80 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 74   int i;.      st
35d90 61 74 69 63 20 63 68 61 72 20 7a 4c 61 62 65 6c  atic char zLabel
35da0 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38 39  [] = "0123456789
35db0 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
35dc0 71 72 73 74 75 76 77 79 78 7a 22 0a 20 20 20 20  qrstuvwyxz".    
35dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35df0 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
35e00 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a 22 3b  MNOPQRSTUVWYXZ";
35e10 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 57 49  .      for(p=pWI
35e20 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30  nfo->pLoops, i=0
35e30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c  ; p; p=p->pNextL
35e40 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20  oop, i++){.     
35e50 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62     p->cId = zLab
35e60 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a 4c 61 62  el[i%sizeof(zLab
35e70 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20 20 77 68  el)];.        wh
35e80 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20  ereLoopPrint(p, 
35e90 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 20  pTabList);.     
35ea0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
35eb0 20 20 0a 20 20 20 20 77 68 65 72 65 50 61 74 68    .    wherePath
35ec0 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 30  Solver(pWInfo, 0
35ed0 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
35ee0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
35ef0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
35f00 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  or;.    if( pWIn
35f10 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  fo->pOrderBy ){.
35f20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
35f30 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 70  Solver(pWInfo, p
35f40 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31  WInfo->nRowOut+1
35f50 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 64 62  );.       if( db
35f60 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
35f70 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
35f80 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Error;.    }.  }
35f90 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70  .  if( pWInfo->p
35fa0 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 28 64  OrderBy==0 && (d
35fb0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
35fc0 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 29 21  E_ReverseOrder)!
35fd0 3d 30 20 29 7b 0a 20 20 20 20 20 70 57 49 6e 66  =0 ){.     pWInf
35fe0 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 28 42 69  o->revMask = (Bi
35ff0 74 6d 61 73 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a  tmask)(-1);.  }.
36000 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
36010 72 72 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e  rr || NEVER(db->
36020 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b  mallocFailed) ){
36030 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
36040 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23  eginError;.  }.#
36050 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
36060 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
36070 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
36080 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   ){.    int ii;.
36090 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
360a0 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c  Printf("---- Sol
360b0 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20  ution nRow=%d", 
360c0 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29  pWInfo->nRowOut)
360d0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
360e0 2d 3e 62 4f 42 53 61 74 20 29 7b 0a 20 20 20 20  ->bOBSat ){.    
360f0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
36100 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59 3d 30  intf(" ORDERBY=0
36110 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e  x%llx", pWInfo->
36120 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a  revMask);.    }.
36130 20 20 20 20 73 77 69 74 63 68 28 20 70 57 49 6e      switch( pWIn
36140 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 29 7b  fo->eDistinct ){
36150 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
36160 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
36170 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E: {.        sql
36180 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
36190 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 69 71  "  DISTINCT=uniq
361a0 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ue");.        br
361b0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
361c0 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
361d0 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20  STINCT_ORDERED: 
361e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
361f0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
36200 44 49 53 54 49 4e 43 54 3d 6f 72 64 65 72 65 64  DISTINCT=ordered
36210 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ");.        brea
36220 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
36230 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
36240 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20  INCT_UNORDERED: 
36250 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
36260 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
36270 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72  DISTINCT=unorder
36280 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ed");.        br
36290 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
362a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
362b0 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
362c0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
362d0 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i<pWInfo->nLevel
362e0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77  ; ii++){.      w
362f0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57  hereLoopPrint(pW
36300 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f  Info->a[ii].pWLo
36310 6f 70 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20  op, pTabList);. 
36320 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
36330 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20    /* Attempt to 
36340 6f 6d 69 74 20 74 61 62 6c 65 73 20 66 72 6f 6d  omit tables from
36350 20 74 68 65 20 6a 6f 69 6e 20 74 68 61 74 20 64   the join that d
36360 6f 20 6e 6f 74 20 65 66 66 65 63 74 20 74 68 65  o not effect the
36370 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 66 28   result */.  if(
36380 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e   pWInfo->nLevel>
36390 3d 32 0a 20 20 20 26 26 20 70 52 65 73 75 6c 74  =2.   && pResult
363a0 53 65 74 21 3d 30 0a 20 20 20 26 26 20 4f 70 74  Set!=0.   && Opt
363b0 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
363c0 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74  (db, SQLITE_Omit
363d0 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20  NoopJoin).  ){. 
363e0 20 20 20 42 69 74 6d 61 73 6b 20 74 61 62 55 73     Bitmask tabUs
363f0 65 64 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62  ed = exprListTab
36400 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
36410 2c 20 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20  , pResultSet);. 
36420 20 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72 64     if( sWLB.pOrd
36430 65 72 42 79 20 29 20 74 61 62 55 73 65 64 20 7c  erBy ) tabUsed |
36440 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
36450 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 73  sage(pMaskSet, s
36460 57 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20  WLB.pOrderBy);. 
36470 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f     while( pWInfo
36480 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20  ->nLevel>=2 ){. 
36490 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
364a0 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20  pTerm, *pEnd;.  
364b0 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e      pLoop = pWIn
364c0 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c  fo->a[pWInfo->nL
364d0 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a  evel-1].pWLoop;.
364e0 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66        if( (pWInf
364f0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
36500 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 6a 6f 69 6e  Loop->iTab].join
36510 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d  type & JT_LEFT)=
36520 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
36530 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
36540 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
36550 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20 20 20  ISTINCT)==0.    
36560 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
36570 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
36580 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20 20 29  EROW)==0.      )
36590 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
365a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
365b0 66 28 20 28 74 61 62 55 73 65 64 20 26 20 70 4c  f( (tabUsed & pL
365c0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d  oop->maskSelf)!=
365d0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
365e0 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57 43   pEnd = sWLB.pWC
365f0 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d 3e  ->a + sWLB.pWC->
36600 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72  nTerm;.      for
36610 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d  (pTerm=sWLB.pWC-
36620 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20  >a; pTerm<pEnd; 
36630 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
36640 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
36650 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d  ereqAll & pLoop-
36660 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a 20 20  >maskSelf)!=0.  
36670 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72 48         && !ExprH
36680 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
36690 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
366a0 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 29 7b  Join).        ){
366b0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
366c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
366d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54    }.      if( pT
366e0 65 72 6d 3c 70 45 6e 64 20 29 20 62 72 65 61 6b  erm<pEnd ) break
366f0 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  ;.      WHERETRA
36700 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d 3e 20  CE(0xffff, ("-> 
36710 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f 74  drop loop %c not
36720 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d   used\n", pLoop-
36730 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20 70 57  >cId));.      pW
36740 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a  Info->nLevel--;.
36750 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74 2d 2d        nTabList--
36760 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48  ;.    }.  }.  WH
36770 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c  ERETRACE(0xffff,
36780 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
36790 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29  Finished ***\n")
367a0 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61  );.  pWInfo->pPa
367b0 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
367c0 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  += pWInfo->nRowO
367d0 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ut;..  /* If the
367e0 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50   caller is an UP
367f0 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
36800 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73  tatement that is
36810 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a   requesting.  **
36820 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61   to use a one-pa
36830 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65  ss algorithm, de
36840 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20  termine if this 
36850 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  is appropriate..
36860 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61 73    ** The one-pas
36870 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79  s algorithm only
36880 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57 48   works if the WH
36890 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
368a0 72 61 69 6e 73 0a 20 20 2a 2a 20 74 68 65 20 73  rains.  ** the s
368b0 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70 64 61  tatement to upda
368c0 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e  te a single row.
368d0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
368e0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
368f0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
36900 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66  RED)==0 || pWInf
36910 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a  o->nLevel==1 );.
36920 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
36930 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
36940 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 0a 20  S_DESIRED)!=0 . 
36950 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 61 5b    && (pWInfo->a[
36960 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  0].pWLoop->wsFla
36970 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
36980 57 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57 49  W)!=0 ){.    pWI
36990 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d  nfo->okOnePass =
369a0 20 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e   1;.    pWInfo->
369b0 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46  a[0].pWLoop->wsF
369c0 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49  lags &= ~WHERE_I
369d0 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20  DX_ONLY;.  }..  
369e0 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c  /* Open all tabl
369f0 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  es in the pTabLi
36a00 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63  st and any indic
36a10 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a  es selected for.
36a20 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74    ** searching t
36a30 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
36a40 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e  /.  notReady = ~
36a50 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f  (Bitmask)0;.  fo
36a60 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  r(ii=0, pLevel=p
36a70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61  WInfo->a; ii<nTa
36a80 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65  bList; ii++, pLe
36a90 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  vel++){.    Tabl
36aa0 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20  e *pTab;     /* 
36ab0 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  Table to open */
36ac0 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
36ad0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
36ae0 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  f database conta
36af0 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65  ining table/inde
36b00 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  x */.    struct 
36b10 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
36b20 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61  abItem;..    pTa
36b30 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
36b40 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
36b50 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  om];.    pTab = 
36b60 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
36b70 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
36b80 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
36b90 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
36ba0 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  );.    pLoop = p
36bb0 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
36bc0 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61     if( (pTab->ta
36bd0 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
36be0 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61  meral)!=0 || pTa
36bf0 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
36c00 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
36c10 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23  g */.    }else.#
36c20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
36c30 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
36c40 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
36c50 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
36c60 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
36c70 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
36c80 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63  char *pVTab = (c
36c90 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
36ca0 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
36cb0 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 69 6e   pTab);.      in
36cc0 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65  t iCur = pTabIte
36cd0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
36ce0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
36cf0 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c  Op4(v, OP_VOpen,
36d00 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70 56 54   iCur, 0, 0, pVT
36d10 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20  ab, P4_VTAB);.  
36d20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69    }else if( IsVi
36d30 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
36d40 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a       /* noop */.
36d50 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
36d60 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
36d70 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
36d80 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20  _IDX_ONLY)==0.  
36d90 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c         && (wctrl
36da0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d  Flags & WHERE_OM
36db0 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d  IT_OPEN_CLOSE)==
36dc0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
36dd0 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  p = pWInfo->okOn
36de0 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57  ePass ? OP_OpenW
36df0 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65  rite : OP_OpenRe
36e00 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ad;.      sqlite
36e10 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
36e20 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
36e30 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  rsor, iDb, pTab,
36e40 20 6f 70 29 3b 0a 20 20 20 20 20 20 74 65 73 74   op);.      test
36e50 63 61 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f  case( !pWInfo->o
36e60 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62  kOnePass && pTab
36e70 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ->nCol==BMS-1 );
36e80 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
36e90 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
36ea0 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  ass && pTab->nCo
36eb0 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
36ec0 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  if( !pWInfo->okO
36ed0 6e 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e  nePass && pTab->
36ee0 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20 20 20 20  nCol<BMS ){.    
36ef0 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20      Bitmask b = 
36f00 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pTabItem->colUse
36f10 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  d;.        int n
36f20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
36f30 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e  r(; b; b=b>>1, n
36f40 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71  ++){}.        sq
36f50 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
36f60 34 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65  4(v, sqlite3Vdbe
36f70 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31  CurrentAddr(v)-1
36f80 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
36f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
36fa0 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
36fb0 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a  (n), P4_INT32);.
36fc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
36fd0 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  n<=pTab->nCol );
36fe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
36ff0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
37000 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
37010 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
37020 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
37030 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  me);.    }.    i
37040 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
37050 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
37060 44 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  D ){.      Index
37070 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75   *pIx = pLoop->u
37080 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
37090 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
370a0 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ey = sqlite3Inde
370b0 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
370c0 20 70 49 78 29 3b 0a 20 20 20 20 20 20 2f 2a 20   pIx);.      /* 
370d0 46 49 58 4d 45 3a 20 20 41 73 20 61 6e 20 6f 70  FIXME:  As an op
370e0 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73 65 20 70  timization use p
370f0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
37100 20 69 66 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e   if WHERE_IDX_ON
37110 4c 59 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  LY */.      int 
37120 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76  iIndexCur = pLev
37130 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49  el->iIdxCur = iI
37140 64 78 43 75 72 20 3f 20 69 49 64 78 43 75 72 20  dxCur ? iIdxCur 
37150 3a 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  : pParse->nTab++
37160 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
37170 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  pIx->pSchema==pT
37180 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
37190 20 20 20 20 20 61 73 73 65 72 74 28 20 69 49 6e       assert( iIn
371a0 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20  dexCur>=0 );.   
371b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
371c0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp4(v, OP_OpenR
371d0 65 61 64 2c 20 69 49 6e 64 65 78 43 75 72 2c 20  ead, iIndexCur, 
371e0 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a  pIx->tnum, iDb,.
371f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37200 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
37210 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  Key, P4_KEYINFO_
37220 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
37230 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
37240 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65  "%s", pIx->zName
37250 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ));.    }.    sq
37260 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
37270 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
37280 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79  b);.    notReady
37290 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26 70 57   &= ~getMask(&pW
372a0 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
372b0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
372c0 72 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  r);.  }.  pWInfo
372d0 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ->iTop = sqlite3
372e0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
372f0 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  v);.  if( db->ma
37300 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
37310 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
37320 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  r;..  /* Generat
37330 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f  e the code to do
37340 20 74 68 65 20 73 65 61 72 63 68 2e 20 20 45 61   the search.  Ea
37350 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  ch iteration of 
37360 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f  the for.  ** loo
37370 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65  p below generate
37380 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e  s code for a sin
37390 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  gle nested loop 
373a0 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70  of the VM.  ** p
373b0 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e  rogram..  */.  n
373c0 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d  otReady = ~(Bitm
373d0 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d  ask)0;.  for(ii=
373e0 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20  0; ii<nTabList; 
373f0 69 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65 76 65  ii++){.    pLeve
37400 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
37410 69 5d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  i];.#ifndef SQLI
37420 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
37430 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20  C_INDEX.    if( 
37440 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d  (pLevel->pWLoop-
37450 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
37460 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20  _AUTO_INDEX)!=0 
37470 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75  ){.      constru
37480 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  ctAutomaticIndex
37490 28 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f  (pParse, &pWInfo
374a0 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20 20 20 20  ->sWC,.         
374b0 20 20 20 20 20 20 20 26 70 54 61 62 4c 69 73 74         &pTabList
374c0 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
374d0 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c  m], notReady, pL
374e0 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  evel);.      if(
374f0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
37500 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
37510 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ginError;.    }.
37520 23 65 6e 64 69 66 0a 20 20 20 20 65 78 70 6c 61  #endif.    expla
37530 69 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72 73 65  inOneScan(pParse
37540 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76  , pTabList, pLev
37550 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e  el, ii, pLevel->
37560 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67  iFrom, wctrlFlag
37570 73 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  s);.    pLevel->
37580 61 64 64 72 42 6f 64 79 20 3d 20 73 71 6c 69 74  addrBody = sqlit
37590 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
375a0 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61  r(v);.    notRea
375b0 64 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70  dy = codeOneLoop
375c0 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69  Start(pWInfo, ii
375d0 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20  , notReady);.   
375e0 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
375f0 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  ue = pLevel->add
37600 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rCont;.  }..  /*
37610 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 72 65 74 75   Done. */.  retu
37620 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a  rn pWInfo;..  /*
37630 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61   Jump here if ma
37640 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68  lloc fails */.wh
37650 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20  ereBeginError:. 
37660 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20   if( pWInfo ){. 
37670 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
37680 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  yLoop = pWInfo->
37690 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
376a0 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72  .    whereInfoFr
376b0 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
376c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
376d0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
376e0 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
376f0 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65   WHERE loop.  Se
37700 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a  e comments on .*
37710 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  * sqlite3WhereBe
37720 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69  gin() for additi
37730 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
37740 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
37750 33 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49  3WhereEnd(WhereI
37760 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
37770 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
37780 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
37790 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
377a0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
377b0 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   i;.  WhereLevel
377c0 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72   *pLevel;.  Wher
377d0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20  eLoop *pLoop;.  
377e0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
377f0 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
37800 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  List;.  sqlite3 
37810 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
37820 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
37830 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f   loop terminatio
37840 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73  n code..  */.  s
37850 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
37860 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
37870 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c  for(i=pWInfo->nL
37880 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  evel-1; i>=0; i-
37890 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d  -){.    pLevel =
378a0 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
378b0 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
378c0 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
378d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
378e0 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
378f0 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  l->addrCont);.  
37900 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70    if( pLevel->op
37910 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
37920 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37930 64 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  dOp2(v, pLevel->
37940 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20  op, pLevel->p1, 
37950 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20  pLevel->p2);.   
37960 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
37970 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c  angeP5(v, pLevel
37980 2d 3e 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ->p5);.    }.   
37990 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
379a0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41  ags & WHERE_IN_A
379b0 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75  BLE && pLevel->u
379c0 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20  .in.nIn>0 ){.   
379d0 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70     struct InLoop
379e0 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74   *pIn;.      int
379f0 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   j;.      sqlite
37a00 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
37a10 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
37a20 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72  rNxt);.      for
37a30 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  (j=pLevel->u.in.
37a40 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c  nIn, pIn=&pLevel
37a50 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a  ->u.in.aInLoop[j
37a60 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  -1]; j>0; j--, p
37a70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73  In--){.        s
37a80 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
37a90 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
37aa0 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20  nTop+1);.       
37ab0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
37ac0 70 32 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c  p2(v, pIn->eEndL
37ad0 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72  oopOp, pIn->iCur
37ae0 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
37af0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
37b00 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
37b10 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
37b20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
37b30 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
37b40 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  (db, pLevel->u.i
37b50 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20  n.aInLoop);.    
37b60 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
37b70 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
37b80 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
37b90 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
37ba0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  l->iLeftJoin ){.
37bb0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
37bc0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
37bd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
37be0 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76  , OP_IfPos, pLev
37bf0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
37c00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
37c10 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
37c20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
37c30 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
37c40 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
37c50 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
37c60 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )!=0 );.      if
37c70 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
37c80 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
37c90 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
37ca0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
37cb0 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
37cc0 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  w, pTabList->a[i
37cd0 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].iCursor);.    
37ce0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c    }.      if( pL
37cf0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
37d00 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a  HERE_INDEXED ){.
37d10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
37d20 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
37d30 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d  NullRow, pLevel-
37d40 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
37d50 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65   }.      if( pLe
37d60 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75  vel->op==OP_Retu
37d70 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rn ){.        sq
37d80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
37d90 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65  v, OP_Gosub, pLe
37da0 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d  vel->p1, pLevel-
37db0 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20  >addrFirst);.   
37dc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37dd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
37de0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
37df0 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46  0, pLevel->addrF
37e00 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  irst);.      }. 
37e10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37e20 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
37e30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
37e40 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70  /* The "break" p
37e50 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75  oint is here, ju
37e60 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  st past the end 
37e70 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
37e80 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a  p..  ** Set it..
37e90 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
37ea0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
37eb0 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
37ec0 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  );..  /* Close a
37ed0 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ll of the cursor
37ee0 73 20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e  s that were open
37ef0 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  ed by sqlite3Whe
37f00 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20  reBegin..  */.  
37f10 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
37f20 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74  nLevel<=pTabList
37f30 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28  ->nSrc );.  for(
37f40 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
37f50 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d  fo->a; i<pWInfo-
37f60 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c  >nLevel; i++, pL
37f70 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64  evel++){.    Ind
37f80 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20  ex *pIdx = 0;.  
37f90 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
37fa0 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20  _item *pTabItem 
37fb0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
37fc0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
37fd0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
37fe0 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
37ff0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
38000 62 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f  b!=0 );.    pLoo
38010 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
38020 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61  op;.    if( (pTa
38030 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
38040 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20  _Ephemeral)==0. 
38050 20 20 20 20 26 26 20 70 54 61 62 2d 3e 70 53 65      && pTab->pSe
38060 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20 26 26 20  lect==0.     && 
38070 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
38080 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54  ags & WHERE_OMIT
38090 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a  _OPEN_CLOSE)==0.
380a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74      ){.      int
380b0 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46   ws = pLoop->wsF
380c0 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20  lags;.      if( 
380d0 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
380e0 73 73 20 26 26 20 28 77 73 20 26 20 57 48 45 52  ss && (ws & WHER
380f0 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
38100 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
38110 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
38120 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65  P_Close, pTabIte
38130 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
38140 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
38150 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  ws & WHERE_INDEX
38160 45 44 29 21 3d 30 20 26 26 20 28 77 73 20 26 20  ED)!=0 && (ws & 
38170 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  (WHERE_IPK|WHERE
38180 5f 41 55 54 4f 5f 49 4e 44 45 58 29 29 3d 3d 30  _AUTO_INDEX))==0
38190 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
381a0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3Vd