/ Hex Artifact Content
Login

Artifact 04217a957c1423dd5f177b21b4ced319bf24b77c:


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 4b 65 79 43 6f 6c 29 20 29 20 72 65 74 75  >nKeyCol) ) 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 4b 65 79 43 6f 6c 3b  i<pIdx->nKeyCol;
11bd0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 31 36   i++){.      i16
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 69 43 6f 6c 5d  pTab->aCol[iCol]
11cb0 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  .notNull==0 ){. 
11cc0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
11cd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11ce0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
11cf0 69 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  i==pIdx->nKeyCol
11d00 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
11d10 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20  s index implies 
11d20 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43  that the DISTINC
11d30 54 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 72  T qualifier is r
11d40 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20  edundant. */.   
11d50 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
11d60 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
11d70 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73   0;.}.../*.** Es
11d80 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72  timate the logar
11d90 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75  ithm of the inpu
11da0 74 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20  t value to base 
11db0 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67  2..*/.static Log
11dc0 45 73 74 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73  Est estLog(LogEs
11dd0 74 20 4e 29 7b 0a 20 20 4c 6f 67 45 73 74 20 78  t N){.  LogEst x
11de0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
11df0 28 4e 29 3b 0a 20 20 72 65 74 75 72 6e 20 78 3e  (N);.  return x>
11e00 33 33 20 3f 20 78 20 2d 20 33 33 20 3a 20 30 3b  33 ? x - 33 : 0;
11e10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f  .}../*.** Two ro
11e20 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74  utines for print
11e30 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
11e40 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e  of an sqlite3_in
11e50 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75  dex_info.** stru
11e60 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72  cture.  Used for
11e70 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
11e80 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66  ugging only.  If
11e90 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49   neither.** SQLI
11ea0 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54  TE_TEST or SQLIT
11eb0 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69  E_DEBUG are defi
11ec0 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20  ned, then these 
11ed0 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20  routines.** are 
11ee0 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21  no-ops..*/.#if !
11ef0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
11f00 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
11f10 29 20 26 26 20 64 65 66 69 6e 65 64 28 57 48 45  ) && defined(WHE
11f20 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29  RETRACE_ENABLED)
11f30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41  .static void TRA
11f40 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71  CE_IDX_INPUTS(sq
11f50 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
11f60 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
11f70 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
11f80 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
11f90 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
11fa0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
11fb0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
11fc0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63  DebugPrintf("  c
11fd0 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63  onstraint[%d]: c
11fe0 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20  ol=%d termid=%d 
11ff0 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64  op=%d usabled=%d
12000 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
12010 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
12020 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  aint[i].iColumn,
12030 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
12040 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f  traint[i].iTermO
12050 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d  ffset,.       p-
12060 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
12070 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  op,.       p->aC
12080 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
12090 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ble);.  }.  for(
120a0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72  i=0; i<p->nOrder
120b0 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  By; i++){.    sq
120c0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
120d0 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a  ("  orderby[%d]:
120e0 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c   col=%d desc=%d\
120f0 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
12100 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79       p->aOrderBy
12110 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  [i].iColumn,.   
12120 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
12130 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a  i].desc);.  }.}.
12140 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
12150 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71  E_IDX_OUTPUTS(sq
12160 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
12170 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
12180 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
12190 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
121a0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
121b0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
121c0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
121d0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75  DebugPrintf("  u
121e0 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64  sage[%d]: argvId
121f0 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c  x=%d omit=%d\n",
12200 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
12210 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
12220 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
12230 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  ex,.       p->aC
12240 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
12250 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73  ].omit);.  }.  s
12260 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
12270 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e  f("  idxNum=%d\n
12280 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20  ", p->idxNum);. 
12290 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
122a0 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73  ntf("  idxStr=%s
122b0 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b  \n", p->idxStr);
122c0 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
122d0 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79  rintf("  orderBy
122e0 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20  Consumed=%d\n", 
122f0 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  p->orderByConsum
12300 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  ed);.  sqlite3De
12310 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74  bugPrintf("  est
12320 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22  imatedCost=%g\n"
12330 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  , p->estimatedCo
12340 73 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  st);.}.#else.#de
12350 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49  fine TRACE_IDX_I
12360 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65  NPUTS(A).#define
12370 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
12380 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69  TS(A).#endif..#i
12390 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
123a0 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
123b0 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  X./*.** Return T
123c0 52 55 45 20 69 66 20 74 68 65 20 57 48 45 52 45  RUE if the WHERE
123d0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65   clause term pTe
123e0 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20  rm is of a form 
123f0 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c  where it.** coul
12400 64 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  d be used with a
12410 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73  n index to acces
12420 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67  s pSrc, assuming
12430 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a   an appropriate.
12440 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74 65 64  ** index existed
12450 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12460 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
12470 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  x(.  WhereTerm *
12480 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  pTerm,          
12490 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61      /* WHERE cla
124a0 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63  use term to chec
124b0 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  k */.  struct Sr
124c0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
124d0 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77  ,     /* Table w
124e0 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
124f0 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d  access */.  Bitm
12500 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20  ask notReady    
12510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
12520 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f  bles in outer lo
12530 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ops of the join 
12540 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66  */.){.  char aff
12550 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c  ;.  if( pTerm->l
12560 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d  eftCursor!=pSrc-
12570 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74 75 72  >iCursor ) retur
12580 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72  n 0;.  if( (pTer
12590 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
125a0 4f 5f 45 51 29 3d 3d 30 20 29 20 72 65 74 75 72  O_EQ)==0 ) retur
125b0 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72  n 0;.  if( (pTer
125c0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
125d0 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20   notReady)!=0 ) 
125e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
125f0 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
12600 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30  umn<0 ) return 0
12610 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e  ;.  aff = pSrc->
12620 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d  pTab->aCol[pTerm
12630 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e  ->u.leftColumn].
12640 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20  affinity;.  if( 
12650 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66  !sqlite3IndexAff
12660 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70  inityOk(pTerm->p
12670 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65 74  Expr, aff) ) ret
12680 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
12690 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  1;.}.#endif...#i
126a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
126b0 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
126c0 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  X./*.** Generate
126d0 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72 75   code to constru
126e0 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
126f0 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d  ect for an autom
12700 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e  atic index.** an
12710 64 20 74 6f 20 73 65 74 20 75 70 20 74 68 65 20  d to set up the 
12720 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63  WhereLevel objec
12730 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61 74  t pLevel so that
12740 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
12750 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65  tor.** makes use
12760 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74 69   of the automati
12770 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  c index..*/.stat
12780 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75 63  ic void construc
12790 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
127a0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
127b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
127c0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
127d0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
127e0 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
127f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
12800 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
12810 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
12820 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
12830 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
12840 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20 6e  erm to get the n
12850 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42  ext index */.  B
12860 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
12870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
12880 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
12890 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
128a0 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c  able */.  WhereL
128b0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20  evel *pLevel    
128c0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
128d0 65 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a 2f  ew index here */
128e0 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f  .){.  int nKeyCo
128f0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
12900 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
12910 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f  olumns in the co
12920 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65 78 20  nstructed index 
12930 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
12940 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
12950 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
12960 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
12970 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
12980 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20  Term *pWCEnd;   
12990 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
129a0 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49   pWC->a[] */.  I
129b0 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
129c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
129d0 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67 20  ject describing 
129e0 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e  the transient in
129f0 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  dex */.  Vdbe *v
12a00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12a10 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64       /* Prepared
12a20 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
12a30 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
12a40 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74 3b  .  int addrInit;
12a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12a60 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
12a70 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
12a80 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20  bypass jump */. 
12a90 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20   Table *pTable; 
12aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12ab0 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
12ac0 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 4b 65 79  indexed */.  Key
12ad0 49 6e 66 6f 20 2a 70 4b 65 79 69 6e 66 6f 3b 20  Info *pKeyinfo; 
12ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20           /* Key 
12af0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
12b00 74 68 65 20 69 6e 64 65 78 20 2a 2f 20 20 20 0a  the index */   .
12b10 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
12b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12b30 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65   Top of the inde
12b40 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20  x fill loop */. 
12b50 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20   int regRecord; 
12b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12b70 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
12b80 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64   an index record
12b90 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
12ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bb0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e    /* Column coun
12bc0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ter */.  int i; 
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12be0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
12bf0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  nter */.  int mx
12c00 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  BitCol;         
12c10 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
12c20 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d   column in pSrc-
12c30 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f  >colUsed */.  Co
12c40 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
12c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
12c60 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
12c70 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a  to on a column *
12c80 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
12c90 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
12ca0 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65  /* The Loop obje
12cb0 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ct */.  char *zN
12cc0 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20 20 20  otUsed;         
12cd0 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61      /* Extra spa
12ce0 63 65 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66  ce on the end of
12cf0 20 70 49 64 78 20 2a 2f 0a 20 20 42 69 74 6d 61   pIdx */.  Bitma
12d00 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20  sk idxCols;     
12d10 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
12d20 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64   of columns used
12d30 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f   for indexing */
12d40 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61  .  Bitmask extra
12d50 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f  Cols;          /
12d60 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69  * Bitmap of addi
12d70 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a  tional columns *
12d80 2f 0a 20 20 75 38 20 73 65 6e 74 57 61 72 6e 69  /.  u8 sentWarni
12d90 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ng = 0;         
12da0 2f 2a 20 54 72 75 65 20 69 66 20 61 20 77 61 72  /* True if a war
12db0 6e 6e 69 6e 67 20 68 61 73 20 62 65 65 6e 20 69  nning has been i
12dc0 73 73 75 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47  ssued */..  /* G
12dd0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
12de0 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63 72  skip over the cr
12df0 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69  eation and initi
12e00 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65  alization of the
12e10 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20  .  ** transient 
12e20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64  index on 2nd and
12e30 20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72   subsequent iter
12e40 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f  ations of the lo
12e50 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61  op. */.  v = pPa
12e60 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
12e70 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
12e80 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74  addrInit = sqlit
12e90 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
12ea0 65 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  e);..  /* Count 
12eb0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
12ec0 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
12ed0 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
12ee0 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75  index.  ** and u
12ef0 73 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45  sed to match WHE
12f00 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
12f10 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43  aints */.  nKeyC
12f20 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
12f30 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
12f40 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e   pWCEnd = &pWC->
12f50 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  a[pWC->nTerm];. 
12f60 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
12f70 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f  >pWLoop;.  idxCo
12f80 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54  ls = 0;.  for(pT
12f90 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
12fa0 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
12fb0 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d  +){.    if( term
12fc0 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54  CanDriveIndex(pT
12fd0 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  erm, pSrc, notRe
12fe0 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  ady) ){.      in
12ff0 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e  t iCol = pTerm->
13000 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
13010 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73      Bitmask cMas
13020 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20  k = iCol>=BMS ? 
13030 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a  MASKBIT(BMS-1) :
13040 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a   MASKBIT(iCol);.
13050 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13060 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  iCol==BMS );.   
13070 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
13080 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  l==BMS-1 );.    
13090 20 20 69 66 28 20 21 73 65 6e 74 57 61 72 6e 69    if( !sentWarni
130a0 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ng ){.        sq
130b0 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
130c0 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44  _WARNING_AUTOIND
130d0 45 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  EX,.            
130e0 22 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78  "automatic index
130f0 20 6f 6e 20 25 73 28 25 73 29 22 2c 20 70 54 61   on %s(%s)", pTa
13100 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  ble->zName,.    
13110 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e          pTable->
13120 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
13130 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 74 57  );.        sentW
13140 61 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20  arning = 1;.    
13150 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69    }.      if( (i
13160 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d  dxCols & cMask)=
13170 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
13180 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
13190 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
131a0 6f 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 20  oop, nKeyCol+1) 
131b0 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
131c0 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b    pLoop->aLTerm[
131d0 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65  nKeyCol++] = pTe
131e0 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43  rm;.        idxC
131f0 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20  ols |= cMask;.  
13200 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13210 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f    assert( nKeyCo
13220 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  l>0 );.  pLoop->
13230 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c  u.btree.nEq = pL
13240 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b  oop->nLTerm = nK
13250 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  eyCol;.  pLoop->
13260 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
13270 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52  COLUMN_EQ | WHER
13280 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45  E_IDX_ONLY | WHE
13290 52 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20  RE_INDEXED.     
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132b0 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  | WHERE_AUTO_IND
132c0 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  EX;..  /* Count 
132d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64  the number of ad
132e0 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73  ditional columns
132f0 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74   needed to creat
13300 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e  e a.  ** coverin
13310 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76  g index.  A "cov
13320 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20  ering index" is 
13330 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  an index that co
13340 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20  ntains all.  ** 
13350 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65  columns that are
13360 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71   needed by the q
13370 75 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f  uery.  With a co
13380 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68  vering index, th
13390 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  e.  ** original 
133a0 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64  table never need
133b0 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64  s to be accessed
133c0 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64  .  Automatic ind
133d0 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62  ices must.  ** b
133e0 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  e a covering ind
133f0 65 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69  ex because the i
13400 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ndex will not be
13410 20 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a   updated if the.
13420 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61    ** original ta
13430 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20  ble changes and 
13440 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61  the index and ta
13450 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20  ble cannot both 
13460 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20  be used.  ** if 
13470 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73  they go out of s
13480 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72  ync..  */.  extr
13490 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f  aCols = pSrc->co
134a0 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c  lUsed & (~idxCol
134b0 73 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d  s | MASKBIT(BMS-
134c0 31 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20  1));.  mxBitCol 
134d0 3d 20 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  = (pTable->nCol 
134e0 3e 3d 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d  >= BMS-1) ? BMS-
134f0 31 20 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  1 : pTable->nCol
13500 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  ;.  testcase( pT
13510 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d  able->nCol==BMS-
13520 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  1 );.  testcase(
13530 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42   pTable->nCol==B
13540 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d  MS-2 );.  for(i=
13550 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69  0; i<mxBitCol; i
13560 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74  ++){.    if( ext
13570 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54  raCols & MASKBIT
13580 28 69 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b  (i) ) nKeyCol++;
13590 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d  .  }.  if( pSrc-
135a0 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42  >colUsed & MASKB
135b0 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20  IT(BMS-1) ){.   
135c0 20 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62   nKeyCol += pTab
135d0 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b  le->nCol - BMS +
135e0 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d   1;.  }.  pLoop-
135f0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
13600 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48  E_COLUMN_EQ | WH
13610 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20  ERE_IDX_ONLY;.. 
13620 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68   /* Construct th
13630 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74  e Index object t
13640 6f 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20  o describe this 
13650 69 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64 78 20  index */.  pIdx 
13660 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74  = sqlite3Allocat
13670 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 70 50 61  eIndexObject(pPa
13680 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c  rse->db, nKeyCol
13690 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64  +1, 0, &zNotUsed
136a0 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30  );.  if( pIdx==0
136b0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f   ) return;.  pLo
136c0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
136d0 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64  ex = pIdx;.  pId
136e0 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f  x->zName = "auto
136f0 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d  -index";.  pIdx-
13700 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65  >pTable = pTable
13710 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78  ;.  n = 0;.  idx
13720 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Cols = 0;.  for(
13730 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
13740 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72  erm<pWCEnd; pTer
13750 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65  m++){.    if( te
13760 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
13770 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74  pTerm, pSrc, not
13780 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20  Ready) ){.      
13790 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d  int iCol = pTerm
137a0 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
137b0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d        Bitmask cM
137c0 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20  ask = iCol>=BMS 
137d0 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  ? MASKBIT(BMS-1)
137e0 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29   : MASKBIT(iCol)
137f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13800 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ( iCol==BMS-1 );
13810 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13820 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20   iCol==BMS );.  
13830 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73      if( (idxCols
13840 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   & cMask)==0 ){.
13850 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58          Expr *pX
13860 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
13870 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73  .        idxCols
13880 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20   |= cMask;.     
13890 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
138a0 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  n[n] = pTerm->u.
138b0 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
138c0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
138d0 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
138e0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
138f0 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70  pX->pLeft, pX->p
13900 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
13910 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
13920 3d 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20  = ALWAYS(pColl) 
13930 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a  ? pColl->zName :
13940 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20   "BINARY";.     
13950 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     n++;.      }.
13960 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
13970 72 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f  rt( (u32)n==pLoo
13980 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29  p->u.btree.nEq )
13990 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69  ;..  /* Add addi
139a0 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e  tional columns n
139b0 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68  eeded to make th
139c0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
139d0 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f  x into.  ** a co
139e0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  vering index */.
139f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42    for(i=0; i<mxB
13a00 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  itCol; i++){.   
13a10 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26   if( extraCols &
13a20 20 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20   MASKBIT(i) ){. 
13a30 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
13a40 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[n] = i;.    
13a50 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
13a60 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  ] = "BINARY";.  
13a70 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
13a80 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
13a90 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
13aa0 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66  (BMS-1) ){.    f
13ab0 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54  or(i=BMS-1; i<pT
13ac0 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  able->nCol; i++)
13ad0 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69  {.      pIdx->ai
13ae0 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20  Column[n] = i;. 
13af0 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
13b00 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b  l[n] = "BINARY";
13b10 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
13b20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
13b30 6e 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20  n==nKeyCol );.  
13b40 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
13b50 5d 20 3d 20 2d 31 3b 0a 20 20 70 49 64 78 2d 3e  ] = -1;.  pIdx->
13b60 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e  azColl[n] = "BIN
13b70 41 52 59 22 3b 0a 0a 20 20 2f 2a 20 43 72 65 61  ARY";..  /* Crea
13b80 74 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  te the automatic
13b90 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 4b 65 79   index */.  pKey
13ba0 69 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e  info = sqlite3In
13bb0 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
13bc0 65 2c 20 70 49 64 78 29 3b 0a 20 20 61 73 73 65  e, pIdx);.  asse
13bd0 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  rt( pLevel->iIdx
13be0 43 75 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76  Cur>=0 );.  pLev
13bf0 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50  el->iIdxCur = pP
13c00 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
13c10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13c20 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f  4(v, OP_OpenAuto
13c30 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69  index, pLevel->i
13c40 49 64 78 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b  IdxCur, nKeyCol+
13c50 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  1, 0,.          
13c60 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
13c70 29 70 4b 65 79 69 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyinfo, P4_KE
13c80 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
13c90 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
13ca0 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61 62  , "for %s", pTab
13cb0 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20  le->zName));..  
13cc0 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74 6f  /* Fill the auto
13cd0 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69 74 68  matic index with
13ce0 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 61 64   content */.  ad
13cf0 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
13d00 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
13d10 52 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e  Rewind, pLevel->
13d20 69 54 61 62 43 75 72 29 3b 0a 20 20 72 65 67 52  iTabCur);.  regR
13d30 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
13d40 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
13d50 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65  );.  sqlite3Gene
13d60 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61  rateIndexKey(pPa
13d70 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65  rse, pIdx, pLeve
13d80 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52  l->iTabCur, regR
13d90 65 63 6f 72 64 2c 20 30 2c 20 30 29 3b 0a 20 20  ecord, 0, 0);.  
13da0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13db0 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
13dc0 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  t, pLevel->iIdxC
13dd0 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ur, regRecord);.
13de0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
13df0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
13e00 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
13e10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13e20 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
13e30 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
13e40 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 73   addrTop+1);.  s
13e50 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
13e60 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53 54 4d  P5(v, SQLITE_STM
13e70 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45  TSTATUS_AUTOINDE
13e80 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  X);.  sqlite3Vdb
13e90 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
13ea0 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  rTop);.  sqlite3
13eb0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
13ec0 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
13ed0 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70 20  );.  .  /* Jump 
13ee0 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70 70 69  here when skippi
13ef0 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ng the initializ
13f00 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ation */.  sqlit
13f10 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
13f20 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 7d 0a 23  , addrInit);.}.#
13f30 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13f40 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
13f50 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  NDEX */..#ifndef
13f60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
13f70 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
13f80 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70  Allocate and pop
13f90 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33  ulate an sqlite3
13fa0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
13fb0 63 74 75 72 65 2e 20 49 74 20 69 73 20 74 68 65  cture. It is the
13fc0 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c   .** responsibil
13fd0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
13fe0 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
13ff0 72 65 6c 65 61 73 65 20 74 68 65 20 73 74 72 75  release the stru
14000 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61 73 73  cture.** by pass
14010 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ing the pointer 
14020 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
14030 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71 6c   function to sql
14040 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
14050 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69  static sqlite3_i
14060 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63  ndex_info *alloc
14070 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a 20 20  ateIndexInfo(.  
14080 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
14090 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
140a0 43 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  C,.  struct SrcL
140b0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a  ist_item *pSrc,.
140c0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
140d0 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  erBy.){.  int i,
140e0 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   j;.  int nTerm;
140f0 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
14100 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
14110 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
14120 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
14130 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49  ndex_orderby *pI
14140 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72  dxOrderBy;.  str
14150 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
14160 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
14170 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68  ge *pUsage;.  Wh
14180 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
14190 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a    int nOrderBy;.
141a0 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
141b0 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a  info *pIdxInfo;.
141c0 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
141d0 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62  number of possib
141e0 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  le WHERE clause 
141f0 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65  constraints refe
14200 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68  rring.  ** to th
14210 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  is virtual table
14220 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72   */.  for(i=nTer
14230 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  m=0, pTerm=pWC->
14240 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
14250 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
14260 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
14270 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72  eftCursor != pSr
14280 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e  c->iCursor ) con
14290 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
142a0 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28  t( IsPowerOfTwo(
142b0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
142c0 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b   & ~WO_EQUIV) );
142d0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
142e0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
142f0 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74  & WO_IN );.    t
14300 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
14310 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
14320 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28  SNULL );.    if(
14330 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
14340 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20  r & (WO_ISNULL) 
14350 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
14360 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
14370 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20  gs & TERM_VNULL 
14380 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
14390 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  nTerm++;.  }..  
143a0 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52 20  /* If the ORDER 
143b0 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  BY clause contai
143c0 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20  ns only columns 
143d0 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a  in the current .
143e0 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62    ** virtual tab
143f0 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  le then allocate
14400 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 61   space for the a
14410 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a  OrderBy part of.
14420 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33    ** the sqlite3
14430 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
14440 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f  cture..  */.  nO
14450 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66  rderBy = 0;.  if
14460 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
14470 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72    int n = pOrder
14480 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66  By->nExpr;.    f
14490 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
144a0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
144b0 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  Expr = pOrderBy-
144c0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
144d0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
144e0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  !=TK_COLUMN || p
144f0 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53  Expr->iTable!=pS
14500 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72  rc->iCursor ) br
14510 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
14520 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20  f( i==n){.      
14530 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20  nOrderBy = n;.  
14540 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
14550 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74  locate the sqlit
14560 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
14570 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70  ructure.  */.  p
14580 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  IdxInfo = sqlite
14590 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
145a0 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  arse->db, sizeof
145b0 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20  (*pIdxInfo).    
145c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145d0 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66         + (sizeof
145e0 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69  (*pIdxCons) + si
145f0 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e  zeof(*pUsage))*n
14600 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20  Term.           
14610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14620 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72  + sizeof(*pIdxOr
14630 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20  derBy)*nOrderBy 
14640 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66  );.  if( pIdxInf
14650 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  o==0 ){.    sqli
14660 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14670 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  se, "out of memo
14680 72 79 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ry");.    return
14690 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e   0;.  }..  /* In
146a0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72  itialize the str
146b0 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c  ucture.  The sql
146c0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
146d0 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
146e0 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65  ns.  ** many fie
146f0 6c 64 73 20 74 68 61 74 20 61 72 65 20 64 65 63  lds that are dec
14700 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f  lared "const" to
14710 20 70 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e   prevent xBestIn
14720 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68  dex from.  ** ch
14730 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65  anging them.  We
14740 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65   have to do some
14750 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69   funky casting i
14760 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20  n order to.  ** 
14770 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65  initialize those
14780 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20   fields..  */.  
14790 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75  pIdxCons = (stru
147a0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
147b0 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49  _constraint*)&pI
147c0 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64  dxInfo[1];.  pId
147d0 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72 75  xOrderBy = (stru
147e0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
147f0 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78 43  _orderby*)&pIdxC
14800 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55  ons[nTerm];.  pU
14810 73 61 67 65 20 3d 20 28 73 74 72 75 63 74 20 73  sage = (struct s
14820 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
14830 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26  straint_usage*)&
14840 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64  pIdxOrderBy[nOrd
14850 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29  erBy];.  *(int*)
14860 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  &pIdxInfo->nCons
14870 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a  traint = nTerm;.
14880 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
14890 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e  fo->nOrderBy = n
148a0 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72  OrderBy;.  *(str
148b0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
148c0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
148d0 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
148e0 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73  raint = pIdxCons
148f0 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
14900 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
14910 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  by**)&pIdxInfo->
14920 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f  aOrderBy = pIdxO
14930 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75  rderBy;.  *(stru
14940 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
14950 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
14960 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  e**)&pIdxInfo->a
14970 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20  ConstraintUsage 
14980 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
14990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149c0 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20       pUsage;..  
149d0 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d  for(i=j=0, pTerm
149e0 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
149f0 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
14a00 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b  m++){.    u8 op;
14a10 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
14a20 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53  leftCursor != pS
14a30 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f  rc->iCursor ) co
14a40 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
14a50 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f  rt( IsPowerOfTwo
14a60 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
14a70 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29  r & ~WO_EQUIV) )
14a80 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
14a90 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
14aa0 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
14ab0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
14ac0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
14ad0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66  ISNULL );.    if
14ae0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
14af0 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29  or & (WO_ISNULL)
14b00 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14b10 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
14b20 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
14b30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14b40 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f   pIdxCons[j].iCo
14b50 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  lumn = pTerm->u.
14b60 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
14b70 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72  pIdxCons[j].iTer
14b80 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20  mOffset = i;.   
14b90 20 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d   op = (u8)pTerm-
14ba0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
14bb0 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  ALL;.    if( op=
14bc0 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f  =WO_IN ) op = WO
14bd0 5f 45 51 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  _EQ;.    pIdxCon
14be0 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20  s[j].op = op;.  
14bf0 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20    /* The direct 
14c00 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68  assignment in th
14c10 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20  e previous line 
14c20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79  is possible only
14c30 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   because.    ** 
14c40 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49  the WO_ and SQLI
14c50 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
14c60 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69  INT_ codes are i
14c70 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20  dentical.  The. 
14c80 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
14c90 61 73 73 65 72 74 73 20 76 65 72 69 66 79 20 74  asserts verify t
14ca0 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20  his fact. */.   
14cb0 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d   assert( WO_EQ==
14cc0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
14cd0 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20  STRAINT_EQ );.  
14ce0 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d    assert( WO_LT=
14cf0 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
14d00 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20  NSTRAINT_LT );. 
14d10 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45     assert( WO_LE
14d20 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
14d30 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a  ONSTRAINT_LE );.
14d40 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47      assert( WO_G
14d50 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  T==SQLITE_INDEX_
14d60 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b  CONSTRAINT_GT );
14d70 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
14d80 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GE==SQLITE_INDEX
14d90 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29  _CONSTRAINT_GE )
14da0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
14db0 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49  _MATCH==SQLITE_I
14dc0 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
14dd0 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 61 73 73  MATCH );.    ass
14de0 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
14df0 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57  rator & (WO_IN|W
14e00 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_EQ|WO_LT|WO_LE
14e10 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
14e20 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b  MATCH) );.    j+
14e30 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  +;.  }.  for(i=0
14e40 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
14e50 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
14e60 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
14e70 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
14e80 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69  pIdxOrderBy[i].i
14e90 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
14ea0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64  iColumn;.    pId
14eb0 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  xOrderBy[i].desc
14ec0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
14ed0 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  ].sortOrder;.  }
14ee0 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49  ..  return pIdxI
14ef0 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nfo;.}../*.** Th
14f00 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72  e table object r
14f10 65 66 65 72 65 6e 63 65 20 70 61 73 73 65 64 20  eference passed 
14f20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
14f30 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
14f40 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
14f50 72 65 70 72 65 73 65 6e 74 20 61 20 76 69 72 74  represent a virt
14f60 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ual table. This 
14f70 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73  function invokes
14f80 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28   the xBestIndex(
14f90 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74  ).** method of t
14fa0 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
14fb0 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 74 65   with the sqlite
14fc0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a  3_index_info obj
14fd0 65 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65  ect that.** come
14fe0 73 20 69 6e 20 61 73 20 74 68 65 20 33 72 64 20  s in as the 3rd 
14ff0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
15000 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
15010 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
15020 75 72 73 2c 20 70 50 61 72 73 65 20 69 73 20 70  urs, pParse is p
15030 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e  opulated with an
15040 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
15050 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  nd a.** non-zero
15060 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
15070 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
15080 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
15090 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70   the output.** p
150a0 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74  art of the sqlit
150b0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
150c0 72 75 63 74 75 72 65 20 69 73 20 6c 65 66 74 20  ructure is left 
150d0 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  populated..**.**
150e0 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
150f0 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
15100 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68 65 20  rned, it is the 
15110 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
15120 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  f the.** caller 
15130 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
15140 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20  ee p->idxStr if 
15150 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  p->needToFreeIdx
15160 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  Str indicates.**
15170 20 74 68 61 74 20 74 68 69 73 20 69 73 20 72 65   that this is re
15180 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  quired..*/.stati
15190 63 20 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e  c int vtabBestIn
151a0 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
151b0 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
151c0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
151d0 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  fo *p){.  sqlite
151e0 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
151f0 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
15200 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
15210 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74  b)->pVtab;.  int
15220 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   i;.  int rc;.. 
15230 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
15240 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70 56 74  S(p);.  rc = pVt
15250 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65  ab->pModule->xBe
15260 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70  stIndex(pVtab, p
15270 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f  );.  TRACE_IDX_O
15280 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20 69 66  UTPUTS(p);..  if
15290 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
152a0 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
152b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
152c0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d       pParse->db-
152d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
152e0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
152f0 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67   !pVtab->zErrMsg
15300 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15310 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15320 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45  , "%s", sqlite3E
15330 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20  rrStr(rc));.    
15340 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
15350 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15360 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74 61 62  rse, "%s", pVtab
15370 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
15380 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
15390 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72  free(pVtab->zErr
153a0 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a  Msg);.  pVtab->z
153b0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66  ErrMsg = 0;..  f
153c0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
153d0 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
153e0 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e      if( !p->aCon
153f0 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c  straint[i].usabl
15400 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61  e && p->aConstra
15410 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  intUsage[i].argv
15420 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20  Index>0 ){.     
15430 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15440 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
15450 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78      "table %s: x
15460 42 65 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e  BestIndex return
15470 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c  ed an invalid pl
15480 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  an", pTab->zName
15490 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
154a0 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e  return pParse->n
154b0 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Err;.}.#endif /*
154c0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
154d0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
154e0 4c 45 29 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20  LE) */...#ifdef 
154f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
15500 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a  AT3_OR_STAT4./*.
15510 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
15520 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61  location of a pa
15530 72 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f  rticular key amo
15540 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61  ng all keys in a
15550 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f  n.** index.  Sto
15560 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
15570 6e 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f  n aStat as follo
15580 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74  ws:.**.**    aSt
15590 61 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20  at[0]      Est. 
155a0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c  number of rows l
155b0 65 73 73 20 74 68 61 6e 20 70 56 61 6c 0a 2a 2a  ess than pVal.**
155c0 20 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20      aStat[1]    
155d0 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66    Est. number of
155e0 20 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70   rows equal to p
155f0 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  Val.**.** Return
15600 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
15610 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccess..*/.static
15620 20 76 6f 69 64 20 77 68 65 72 65 4b 65 79 53 74   void whereKeySt
15630 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ats(.  Parse *pP
15640 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
15650 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
15660 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49  onnection */.  I
15670 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
15680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
15690 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  dex to consider 
156a0 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55  domain of */.  U
156b0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
156c0 52 65 63 2c 20 20 20 20 20 20 20 2f 2a 20 56 65  Rec,       /* Ve
156d0 63 74 6f 72 20 6f 66 20 76 61 6c 75 65 73 20 74  ctor of values t
156e0 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20  o consider */.  
156f0 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20  int roundUp,    
15700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
15710 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75 65 2e  ound up if true.
15720 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20    Round down if 
15730 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63  false */.  tRowc
15740 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20 20 20  nt *aStat       
15750 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73         /* OUT: s
15760 74 61 74 73 20 77 72 69 74 74 65 6e 20 68 65 72  tats written her
15770 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53  e */.){.  IndexS
15780 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d  ample *aSample =
15790 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a   pIdx->aSample;.
157a0 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
157b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
157c0 20 49 6e 64 65 78 20 6f 66 20 72 65 71 75 69 72   Index of requir
157d0 65 64 20 73 74 61 74 73 20 69 6e 20 61 6e 45 71  ed stats in anEq
157e0 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74  [] etc. */.  int
157f0 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20 20 20 20   iMin = 0;      
15800 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c           /* Smal
15810 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20  lest sample not 
15820 79 65 74 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  yet tested */.  
15830 69 6e 74 20 69 20 3d 20 70 49 64 78 2d 3e 6e 53  int i = pIdx->nS
15840 61 6d 70 6c 65 3b 20 20 20 20 20 20 2f 2a 20 53  ample;      /* S
15850 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c  mallest sample l
15860 61 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71  arger than or eq
15870 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20  ual to pRec */. 
15880 20 69 6e 74 20 69 54 65 73 74 3b 20 20 20 20 20   int iTest;     
15890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
158a0 4e 65 78 74 20 73 61 6d 70 6c 65 20 74 6f 20 74  Next sample to t
158b0 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  est */.  int res
158c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
158d0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
158e0 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  f comparison ope
158f0 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64  ration */..#ifnd
15900 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
15910 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
15920 45 52 28 20 70 50 61 72 73 65 20 29 3b 0a 23 65  ER( pParse );.#e
15930 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
15940 52 65 63 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  Rec!=0 || pParse
15950 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
15960 65 64 20 29 3b 0a 20 20 69 66 28 20 70 52 65 63  ed );.  if( pRec
15970 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
15980 69 43 6f 6c 20 3d 20 70 52 65 63 2d 3e 6e 46 69  iCol = pRec->nFi
15990 65 6c 64 20 2d 20 31 3b 0a 20 20 61 73 73 65 72  eld - 1;.  asser
159a0 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  t( pIdx->nSample
159b0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
159c0 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20 26  pRec->nField>0 &
159d0 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 53 61  & iCol<pIdx->nSa
159e0 6d 70 6c 65 43 6f 6c 20 29 3b 0a 20 20 64 6f 7b  mpleCol );.  do{
159f0 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28 69 4d  .    iTest = (iM
15a00 69 6e 2b 69 29 2f 32 3b 0a 20 20 20 20 72 65 73  in+i)/2;.    res
15a10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
15a20 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
15a30 70 6c 65 5b 69 54 65 73 74 5d 2e 6e 2c 20 61 53  ple[iTest].n, aS
15a40 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 70 2c 20  ample[iTest].p, 
15a50 70 52 65 63 29 3b 0a 20 20 20 20 69 66 28 20 72  pRec);.    if( r
15a60 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 4d  es<0 ){.      iM
15a70 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20  in = iTest+1;.  
15a80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
15a90 20 3d 20 69 54 65 73 74 3b 0a 20 20 20 20 7d 0a   = iTest;.    }.
15aa0 20 20 7d 77 68 69 6c 65 28 20 72 65 73 20 26 26    }while( res &&
15ab0 20 69 4d 69 6e 3c 69 20 29 3b 0a 0a 23 69 66 64   iMin<i );..#ifd
15ac0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
15ad0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
15ae0 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  ng assert statem
15af0 65 6e 74 73 20 63 68 65 63 6b 20 74 68 61 74 20  ents check that 
15b00 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63  the binary searc
15b10 68 20 63 6f 64 65 0a 20 20 2a 2a 20 61 62 6f 76  h code.  ** abov
15b20 65 20 66 6f 75 6e 64 20 74 68 65 20 72 69 67 68  e found the righ
15b30 74 20 61 6e 73 77 65 72 2e 20 54 68 69 73 20 62  t answer. This b
15b40 6c 6f 63 6b 20 73 65 72 76 65 73 20 6e 6f 20 70  lock serves no p
15b50 75 72 70 6f 73 65 20 6f 74 68 65 72 0a 20 20 2a  urpose other.  *
15b60 2a 20 74 68 61 6e 20 74 6f 20 69 6e 76 6f 6b 65  * than to invoke
15b70 20 74 68 65 20 61 73 73 65 72 74 73 2e 20 20 2a   the asserts.  *
15b80 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29  /.  if( res==0 )
15b90 7b 0a 20 20 20 20 2f 2a 20 49 66 20 28 72 65 73  {.    /* If (res
15ba0 3d 3d 30 29 20 69 73 20 74 72 75 65 2c 20 74 68  ==0) is true, th
15bb0 65 6e 20 73 61 6d 70 6c 65 20 24 69 20 6d 75 73  en sample $i mus
15bc0 74 20 62 65 20 65 71 75 61 6c 20 74 6f 20 70 52  t be equal to pR
15bd0 65 63 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ec */.    assert
15be0 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ( i<pIdx->nSampl
15bf0 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
15c00 20 30 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 52   0==sqlite3VdbeR
15c10 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
15c20 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
15c30 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 0a 20  le[i].p, pRec). 
15c40 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
15c50 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
15c60 6c 65 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  led );.  }else{.
15c70 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
15c80 2c 20 70 52 65 63 20 6d 75 73 74 20 62 65 20 73  , pRec must be s
15c90 6d 61 6c 6c 65 72 20 74 68 61 6e 20 73 61 6d 70  maller than samp
15ca0 6c 65 20 24 69 20 61 6e 64 20 6c 61 72 67 65 72  le $i and larger
15cb0 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 73 61 6d   than.    ** sam
15cc0 70 6c 65 20 28 24 69 2d 31 29 2e 20 20 2a 2f 0a  ple ($i-1).  */.
15cd0 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70      assert( i==p
15ce0 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20  Idx->nSample .  
15cf0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
15d00 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
15d10 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c  re(aSample[i].n,
15d20 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70   aSample[i].p, p
15d30 52 65 63 29 3e 30 0a 20 20 20 20 20 20 20 20 20  Rec)>0.         
15d40 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
15d50 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
15d60 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30 0a     assert( i==0.
15d70 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
15d80 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
15d90 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31  pare(aSample[i-1
15da0 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31  ].n, aSample[i-1
15db0 5d 2e 70 2c 20 70 52 65 63 29 3c 30 0a 20 20 20  ].p, pRec)<0.   
15dc0 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
15dd0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
15de0 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  d );.  }.#endif 
15df0 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
15e00 44 45 42 55 47 20 2a 2f 0a 0a 20 20 2f 2a 20 41  DEBUG */..  /* A
15e10 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 53  t this point, aS
15e20 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20  ample[i] is the 
15e30 66 69 72 73 74 20 73 61 6d 70 6c 65 20 74 68 61  first sample tha
15e40 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
15e50 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20  n.  ** or equal 
15e60 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69 66 20  to pVal.  Or if 
15e70 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
15e80 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c  , then all sampl
15e90 65 73 20 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a  es are less.  **
15ea0 20 74 68 61 6e 20 70 56 61 6c 2e 20 20 49 66 20   than pVal.  If 
15eb0 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c  aSample[i]==pVal
15ec0 2c 20 74 68 65 6e 20 72 65 73 3d 3d 30 2e 0a 20  , then res==0.. 
15ed0 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d 30   */.  if( res==0
15ee0 20 29 7b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d   ){.    aStat[0]
15ef0 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   = aSample[i].an
15f00 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53  Lt[iCol];.    aS
15f10 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65  tat[1] = aSample
15f20 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a  [i].anEq[iCol];.
15f30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f    }else{.    tRo
15f40 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70  wcnt iLower, iUp
15f50 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69  per, iGap;.    i
15f60 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( i==0 ){.     
15f70 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20   iLower = 0;.   
15f80 20 20 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d     iUpper = aSam
15f90 70 6c 65 5b 30 5d 2e 61 6e 4c 74 5b 69 43 6f 6c  ple[0].anLt[iCol
15fa0 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
15fb0 20 20 20 20 69 55 70 70 65 72 20 3d 20 69 3e 3d      iUpper = i>=
15fc0 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20  pIdx->nSample ? 
15fd0 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 5b 30  pIdx->aiRowEst[0
15fe0 5d 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  ] : aSample[i].a
15ff0 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  nLt[iCol];.     
16000 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c   iLower = aSampl
16010 65 5b 69 2d 31 5d 2e 61 6e 45 71 5b 69 43 6f 6c  e[i-1].anEq[iCol
16020 5d 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d  ] + aSample[i-1]
16030 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20  .anLt[iCol];.   
16040 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20   }.    aStat[1] 
16050 3d 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  = (pIdx->nKeyCol
16060 3e 69 43 6f 6c 20 3f 20 70 49 64 78 2d 3e 61 41  >iCol ? pIdx->aA
16070 76 67 45 71 5b 69 43 6f 6c 5d 20 3a 20 31 29 3b  vgEq[iCol] : 1);
16080 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e  .    if( iLower>
16090 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20  =iUpper ){.     
160a0 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d   iGap = 0;.    }
160b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70  else{.      iGap
160c0 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77   = iUpper - iLow
160d0 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  er;.    }.    if
160e0 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20  ( roundUp ){.   
160f0 20 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a     iGap = (iGap*
16100 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  2)/3;.    }else{
16110 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47  .      iGap = iG
16120 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ap/3;.    }.    
16130 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65  aStat[0] = iLowe
16140 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 7d 0a  r + iGap;.  }.}.
16150 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
16160 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
16170 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT4 */../*.**
16180 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
16190 73 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61  s used to estima
161a0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
161b0 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
161c0 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79  be visited.** by
161d0 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64   scanning an ind
161e0 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f  ex for a range o
161f0 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61  f values. The ra
16200 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20  nge may have an 
16210 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20  upper.** bound, 
16220 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f  a lower bound, o
16230 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52  r both. The WHER
16240 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  E clause terms t
16250 68 61 74 20 73 65 74 20 74 68 65 20 75 70 70 65  hat set the uppe
16260 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62  r.** and lower b
16270 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72 65 73  ounds are repres
16280 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20  ented by pLower 
16290 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65  and pUpper respe
162a0 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20  ctively. For.** 
162b0 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
162c0 67 20 74 68 61 74 20 69 6e 64 65 78 20 70 20 69  g that index p i
162d0 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a  s on t1(a):.**.*
162e0 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
162f0 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20  WHERE a > ? AND 
16300 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20  a < ? ....**    
16310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16320 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f  |_____|   |_____
16330 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
16340 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
16350 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
16360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
16370 6f 77 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a  ower    pUpper.*
16380 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f  *.** If either o
16390 66 20 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c  f the upper or l
163a0 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f  ower bound is no
163b0 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  t present, then 
163c0 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69  NULL is passed i
163d0 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68  n.** place of th
163e0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
163f0 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a  WhereTerm..**.**
16400 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 28 70   The value in (p
16410 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
16420 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73 20 74  .btree.nEq) is t
16430 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
16440 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  index.** column 
16450 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72  subject to the r
16460 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e  ange constraint.
16470 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c   Or, equivalentl
16480 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
16490 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  .** equality con
164a0 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a  straints optimiz
164b0 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73  ed by the propos
164c0 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46  ed index scan. F
164d0 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61  or example,.** a
164e0 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20  ssuming index p 
164f0 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20  is on t1(a, b), 
16500 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72  and the SQL quer
16510 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
16520 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
16530 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20  a = ? AND b > ? 
16540 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND b < ? ....**
16550 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20  .** then nEq is 
16560 73 65 74 20 74 6f 20 31 20 28 61 73 20 74 68 65  set to 1 (as the
16570 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74 65   range restricte
16580 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20  d column, b, is 
16590 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c  the second .** l
165a0 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
165b0 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f  of the index). O
165c0 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20  r, if the query 
165d0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
165e0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
165f0 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e  > ? AND a < ? ..
16600 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
16610 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a   is set to 0..**
16620 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
16630 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
16640 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20  , *pnOut is set 
16650 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4c 6f  to the sqlite3Lo
16660 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a  gEst() of the.**
16670 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
16680 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 73  that the index s
16690 63 61 6e 20 69 73 20 65 78 70 65 63 74 65 64 20  can is expected 
166a0 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f 75 74  to visit without
166b0 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67   .** considering
166c0 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74   the range const
166d0 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71 20 69  raints. If nEq i
166e0 73 20 30 2c 20 74 68 69 73 20 69 73 20 74 68 65  s 0, this is the
166f0 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 72   number of .** r
16700 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  ows in the index
16710 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  . Assuming no er
16720 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 6e 4f  ror occurs, *pnO
16730 75 74 20 69 73 20 61 64 6a 75 73 74 65 64 20 28  ut is adjusted (
16740 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f 20 61  reduced).** to a
16750 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 72  ccount for the r
16760 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74 73 20  ange contraints 
16770 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
16780 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65  r..** .** In the
16790 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69   absence of sqli
167a0 74 65 5f 73 74 61 74 34 20 41 4e 41 4c 59 5a 45  te_stat4 ANALYZE
167b0 20 64 61 74 61 2c 20 6f 72 20 69 66 20 73 75 63   data, or if suc
167c0 68 20 64 61 74 61 20 63 61 6e 6e 6f 74 20 62 65  h data cannot be
167d0 0a 2a 2a 20 75 73 65 64 2c 20 65 61 63 68 20 72  .** used, each r
167e0 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79 20  ange inequality 
167f0 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72  reduces the sear
16800 63 68 20 73 70 61 63 65 20 62 79 20 61 20 66 61  ch space by a fa
16810 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 48  ctor of 4. .** H
16820 65 6e 63 65 20 61 20 70 61 69 72 20 6f 66 20 63  ence a pair of c
16830 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20  onstraints (x>? 
16840 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65 73  AND x<?) reduces
16850 20 74 68 65 20 65 78 70 65 63 74 65 64 20 6e 75   the expected nu
16860 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20  mber of.** rows 
16870 76 69 73 69 74 65 64 20 62 79 20 61 20 66 61 63  visited by a fac
16880 74 6f 72 20 6f 66 20 31 36 2e 0a 2a 2f 0a 73 74  tor of 16..*/.st
16890 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61  atic int whereRa
168a0 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61  ngeScanEst(.  Pa
168b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
168c0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
168d0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
168e0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
168f0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
16900 42 75 69 6c 64 65 72 2c 0a 20 20 57 68 65 72 65  Builder,.  Where
16910 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20  Term *pLower,   
16920 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  /* Lower bound o
16930 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
16940 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62   "x>123" Might b
16950 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
16960 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20  eTerm *pUpper,  
16970 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20   /* Upper bound 
16980 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
16990 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20  : "x<455" Might 
169a0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
169b0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20  reLoop *pLoop   
169c0 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65 20    /* Modify the 
169d0 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62 65 20  .nOut and maybe 
169e0 2e 72 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a  .rRun fields */.
169f0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
16a00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
16a10 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  Out = pLoop->nOu
16a20 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77  t;.  LogEst nNew
16a30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
16a40 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
16a50 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20 2a  _STAT4.  Index *
16a60 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  p = pLoop->u.btr
16a70 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  ee.pIndex;.  int
16a80 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e   nEq = pLoop->u.
16a90 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66  btree.nEq;..  if
16aa0 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 0a 20  ( p->nSample>0. 
16ab0 20 20 26 26 20 6e 45 71 3d 3d 70 42 75 69 6c 64    && nEq==pBuild
16ac0 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 0a 20 20  er->nRecValid.  
16ad0 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70   && nEq<p->nSamp
16ae0 6c 65 43 6f 6c 0a 20 20 20 26 26 20 4f 70 74 69  leCol.   && Opti
16af0 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
16b00 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49  pParse->db, SQLI
16b10 54 45 5f 53 74 61 74 33 29 20 0a 20 20 29 7b 0a  TE_Stat3) .  ){.
16b20 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f      UnpackedReco
16b30 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c  rd *pRec = pBuil
16b40 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20 74  der->pRec;.    t
16b50 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20  Rowcnt a[2];.   
16b60 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20 2f 2a   u8 aff;..    /*
16b70 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77 65 72   Variable iLower
16b80 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
16b90 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20  the estimate of 
16ba0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
16bb0 77 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68  ws in .    ** th
16bc0 65 20 69 6e 64 65 78 20 74 68 61 74 20 61 72 65  e index that are
16bd0 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c   less than the l
16be0 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  ower bound of th
16bf0 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 54  e range query. T
16c00 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20  he.    ** lower 
16c10 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68 65 20  bound being the 
16c20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66  concatenation of
16c30 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68 65 72   $P and $L, wher
16c40 65 20 24 50 20 69 73 20 74 68 65 0a 20 20 20 20  e $P is the.    
16c50 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f  ** key-prefix fo
16c60 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71 20  rmed by the nEq 
16c70 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61  values matched a
16c80 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c  gainst the nEq l
16c90 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 2a 2a 20  eft-most.    ** 
16ca0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
16cb0 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73 20  ndex, and $L is 
16cc0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f  the value in pLo
16cd0 77 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  wer..    **.    
16ce0 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72  ** Or, if pLower
16cf0 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63   is NULL or $L c
16d00 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74  annot be extract
16d10 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65 63 61  ed from it (beca
16d20 75 73 65 20 69 74 0a 20 20 20 20 2a 2a 20 69 73  use it.    ** is
16d30 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76 61   not a simple va
16d40 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72 61  riable or litera
16d50 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c 6f  l value), the lo
16d60 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  wer bound of the
16d70 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 69 73  .    ** range is
16d80 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20 71 75   $P. Due to a qu
16d90 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79 20 77  irk in the way w
16da0 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 77  hereKeyStats() w
16db0 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20 20 2a  orks, even.    *
16dc0 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61 69 6c  * if $L is avail
16dd0 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79 53 74  able, whereKeySt
16de0 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ats() is called 
16df0 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20 61 6e  for both ($P) an
16e00 64 20 0a 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c  d .    ** ($P:$L
16e10 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67 65 72  ) and the larger
16e20 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65 74 75   of the two retu
16e30 72 6e 65 64 20 76 61 6c 75 65 73 20 75 73 65 64  rned values used
16e40 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
16e50 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70 65  Similarly, iUppe
16e60 72 20 69 73 20 74 6f 20 62 65 20 73 65 74 20 74  r is to be set t
16e70 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f  o the estimate o
16e80 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
16e90 72 6f 77 73 0a 20 20 20 20 2a 2a 20 6c 65 73 73  rows.    ** less
16ea0 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20   than the upper 
16eb0 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  bound of the ran
16ec0 67 65 20 71 75 65 72 79 2e 20 57 68 65 72 65 20  ge query. Where 
16ed0 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 0a  the upper bound.
16ee0 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72      ** is either
16ef0 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24 55 29   ($P) or ($P:$U)
16f00 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20 69 66  . Again, even if
16f10 20 24 55 20 69 73 20 61 76 61 69 6c 61 62 6c 65   $U is available
16f20 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20  , both values.  
16f30 20 20 2a 2a 20 6f 66 20 69 55 70 70 65 72 20 61    ** of iUpper a
16f40 72 65 20 72 65 71 75 65 73 74 65 64 20 6f 66 20  re requested of 
16f50 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20  whereKeyStats() 
16f60 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65 72 20  and the smaller 
16f70 75 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  used..    */.   
16f80 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b   tRowcnt iLower;
16f90 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70  .    tRowcnt iUp
16fa0 70 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 6e 45  per;..    if( nE
16fb0 71 3d 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b  q==p->nKeyCol ){
16fc0 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
16fd0 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
16fe0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16ff0 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c    aff = p->pTabl
17000 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c  e->aCol[p->aiCol
17010 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69 6e 69  umn[nEq]].affini
17020 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ty;.    }.    /*
17030 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65   Determine iLowe
17040 72 20 61 6e 64 20 69 55 70 70 65 72 20 75 73 69  r and iUpper usi
17050 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f  ng ($P) only. */
17060 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20  .    if( nEq==0 
17070 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20  ){.      iLower 
17080 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70 70 65  = 0;.      iUppe
17090 72 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b  r = p->aiRowEst[
170a0 30 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0];.    }else{. 
170b0 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68       /* Note: th
170c0 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65  is call could be
170d0 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79 20   optimized away 
170e0 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d 65  - since the same
170f0 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20 20   values must .  
17100 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e      ** have been
17110 20 72 65 71 75 65 73 74 65 64 20 77 68 65 6e 20   requested when 
17120 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50 20 69  testing key $P i
17130 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  n whereEqualScan
17140 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20 20  Est().  */.     
17150 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
17160 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20  Parse, p, pRec, 
17170 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 69 4c 6f  0, a);.      iLo
17180 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20  wer = a[0];.    
17190 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 20    iUpper = a[0] 
171a0 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20  + a[1];.    }.. 
171b0 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c     /* If possibl
171c0 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68  e, improve on th
171d0 65 20 69 4c 6f 77 65 72 20 65 73 74 69 6d 61 74  e iLower estimat
171e0 65 20 75 73 69 6e 67 20 28 24 50 3a 24 4c 29 2e  e using ($P:$L).
171f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 77   */.    if( pLow
17200 65 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  er ){.      int 
17210 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  bOk;            
17220 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
17230 69 66 20 76 61 6c 75 65 20 69 73 20 65 78 74 72  if value is extr
17240 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72  acted from pExpr
17250 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
17260 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e  pExpr = pLower->
17270 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
17280 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
17290 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  ower->eOperator 
172a0 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29  & (WO_GT|WO_GE))
172b0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  !=0 );.      rc 
172c0 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72  = sqlite3Stat4Pr
172d0 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72  obeSetValue(pPar
172e0 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45  se, p, &pRec, pE
172f0 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26  xpr, aff, nEq, &
17300 62 4f 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  bOk);.      if( 
17310 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17320 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20   bOk ){.        
17330 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20  tRowcnt iNew;.  
17340 20 20 20 20 20 20 77 68 65 72 65 4b 65 79 53 74        whereKeySt
17350 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
17360 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20  Rec, 0, a);.    
17370 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20      iNew = a[0] 
17380 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65  + ((pLower->eOpe
17390 72 61 74 6f 72 20 26 20 57 4f 5f 47 54 29 20 3f  rator & WO_GT) ?
173a0 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20   a[1] : 0);.    
173b0 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c 6f      if( iNew>iLo
173c0 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20 69  wer ) iLower = i
173d0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75  New;.        nOu
173e0 74 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t--;.      }.   
173f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 6f   }..    /* If po
17400 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20  ssible, improve 
17410 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20 65 73  on the iUpper es
17420 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50  timate using ($P
17430 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 69 66 28  :$U). */.    if(
17440 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20   pUpper ){.     
17450 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20   int bOk;       
17460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17470 54 72 75 65 20 69 66 20 76 61 6c 75 65 20 69 73  True if value is
17480 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
17490 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 45  pExpr */.      E
174a0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70  xpr *pExpr = pUp
174b0 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  per->pExpr->pRig
174c0 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ht;.      assert
174d0 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72  ( (pUpper->eOper
174e0 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f  ator & (WO_LT|WO
174f0 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  _LE))!=0 );.    
17500 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
17510 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
17520 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
17530 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e  c, pExpr, aff, n
17540 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20  Eq, &bOk);.     
17550 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17560 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20  OK && bOk ){.   
17570 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65       tRowcnt iNe
17580 77 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  w;.        where
17590 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
175a0 20 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b   p, pRec, 1, a);
175b0 0a 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20  .        iNew = 
175c0 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72 2d  a[0] + ((pUpper-
175d0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
175e0 4c 45 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b  LE) ? a[1] : 0);
175f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65  .        if( iNe
17600 77 3c 69 55 70 70 65 72 20 29 20 69 55 70 70 65  w<iUpper ) iUppe
17610 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  r = iNew;.      
17620 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20    nOut--;.      
17630 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 42 75  }.    }..    pBu
17640 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52  ilder->pRec = pR
17650 65 63 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ec;.    if( rc==
17660 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17670 20 20 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c     if( iUpper>iL
17680 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ower ){.        
17690 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nNew = sqlite3Lo
176a0 67 45 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c  gEst(iUpper - iL
176b0 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ower);.      }el
176c0 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 4e 65 77  se{.        nNew
176d0 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61 73   = 10;        as
176e0 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65  sert( 10==sqlite
176f0 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20  3LogEst(2) );.  
17700 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
17710 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20 20 20  nNew<nOut ){.   
17720 20 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4e 65 77       nOut = nNew
17730 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17740 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c  pLoop->nOut = (L
17750 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 20 20  ogEst)nOut;.    
17760 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
17770 30 30 2c 20 28 22 72 61 6e 67 65 20 73 63 61 6e  00, ("range scan
17780 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75   regions: %u..%u
17790 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20    est=%d\n",.   
177a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177b0 20 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65        (u32)iLowe
177c0 72 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c 20  r, (u32)iUpper, 
177d0 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 72 65  nOut));.      re
177e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
177f0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
17800 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
17810 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e  ER(pParse);.  UN
17820 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
17830 42 75 69 6c 64 65 72 29 3b 0a 23 65 6e 64 69 66  Builder);.#endif
17840 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65  .  assert( pLowe
17850 72 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 20  r || pUpper );. 
17860 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 45 61 63   /* TUNING:  Eac
17870 68 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  h inequality con
17880 73 74 72 61 69 6e 74 20 72 65 64 75 63 65 73 20  straint reduces 
17890 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
178a0 20 34 2d 66 6f 6c 64 2e 0a 20 20 2a 2a 20 41 20   4-fold..  ** A 
178b0 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
178c0 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 72 65 64  , therefore, red
178d0 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20  uces the search 
178e0 73 70 61 63 65 20 31 36 2d 66 6f 6c 64 20 2a 2f  space 16-fold */
178f0 0a 20 20 6e 4e 65 77 20 3d 20 6e 4f 75 74 3b 0a  .  nNew = nOut;.
17900 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20    if( pLower && 
17910 28 70 4c 6f 77 65 72 2d 3e 77 74 46 6c 61 67 73  (pLower->wtFlags
17920 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
17930 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d  0 ){.    nNew -=
17940 20 32 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   20;        asse
17950 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 20==sqlite3L
17960 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20  ogEst(4) );.    
17970 6e 4f 75 74 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66  nOut--;.  }.  if
17980 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  ( pUpper ){.    
17990 6e 4e 65 77 20 2d 3d 20 32 30 3b 20 20 20 20 20  nNew -= 20;     
179a0 20 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73     assert( 20==s
179b0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20  qlite3LogEst(4) 
179c0 29 3b 0a 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20  );.    nOut--;. 
179d0 20 7d 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30   }.  if( nNew<10
179e0 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20   ) nNew = 10;.  
179f0 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20  if( nNew<nOut ) 
17a00 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 70  nOut = nNew;.  p
17a10 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f  Loop->nOut = (Lo
17a20 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65 74  gEst)nOut;.  ret
17a30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
17a40 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
17a50 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
17a60 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
17a70 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
17a80 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
17a90 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a  turned based on.
17aa0 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63  ** an equality c
17ab0 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c 55  onstraint x=VALU
17ac0 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61 74  E and where that
17ad0 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69 6e   VALUE occurs in
17ae0 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72 61  .** the histogra
17af0 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f 6e  m data.  This on
17b00 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20  ly works when x 
17b10 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  is the left-most
17b20 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  .** column of an
17b30 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69 74   index and sqlit
17b40 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72 61  e_stat3 histogra
17b50 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61  m data is availa
17b60 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20  ble.** for that 
17b70 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45 78  index.  When pEx
17b80 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  pr==NULL that me
17b90 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69  ans the constrai
17ba0 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e  nt is.** "x IS N
17bb0 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20  ULL" instead of 
17bc0 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a  "x=VALUE"..**.**
17bd0 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d   Write the estim
17be0 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69  ated row count i
17bf0 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72  nto *pnRow and r
17c00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
17c10 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74   .** If unable t
17c20 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61  o make an estima
17c30 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77  te, leave *pnRow
17c40 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72   unchanged and r
17c50 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
17c60 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  o..**.** This ro
17c70 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69  utine can fail i
17c80 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74  f it is unable t
17c90 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69  o load a collati
17ca0 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72  ng sequence.** r
17cb0 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69  equired for stri
17cc0 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f  ng comparison, o
17cd0 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61  r if unable to a
17ce0 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a  llocate memory.*
17cf0 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76  * for a UTF conv
17d00 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ersion required 
17d10 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  for comparison. 
17d20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74   The error is st
17d30 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ored.** in the p
17d40 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
17d50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
17d60 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
17d70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
17d80 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
17d90 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
17da0 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
17db0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
17dc0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
17dd0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
17de0 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
17df0 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e  ion for VALUE in
17e00 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e   the x=VALUE con
17e10 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f  straint */.  tRo
17e20 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20  wcnt *pnRow     
17e30 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
17e40 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d  evised row estim
17e50 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ate here */.){. 
17e60 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69   Index *p = pBui
17e70 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
17e80 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ree.pIndex;.  in
17e90 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64 65 72  t nEq = pBuilder
17ea0 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
17eb0 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52  nEq;.  UnpackedR
17ec0 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42  ecord *pRec = pB
17ed0 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20  uilder->pRec;.  
17ee0 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20 20  u8 aff;         
17ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
17f00 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a  umn affinity */.
17f10 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
17f20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
17f30 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
17f40 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
17f50 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20  cnt a[2];       
17f60 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74        /* Statist
17f70 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b  ics */.  int bOk
17f80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71  ;..  assert( nEq
17f90 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
17fa0 20 6e 45 71 3c 3d 28 70 2d 3e 6e 4b 65 79 43 6f   nEq<=(p->nKeyCo
17fb0 6c 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  l+1) );.  assert
17fc0 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20  ( p->aSample!=0 
17fd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
17fe0 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61  nSample>0 );.  a
17ff0 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d  ssert( pBuilder-
18000 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71 20 29  >nRecValid<nEq )
18010 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75 65  ;..  /* If value
18020 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61  s are not availa
18030 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69 65 6c  ble for all fiel
18040 64 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ds of the index 
18050 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a  to the left.  **
18060 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e 6f   of this one, no
18070 20 65 73 74 69 6d 61 74 65 20 63 61 6e 20 62 65   estimate can be
18080 20 6d 61 64 65 2e 20 52 65 74 75 72 6e 20 53 51   made. Return SQ
18090 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a  LITE_NOTFOUND. *
180a0 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72  /.  if( pBuilder
180b0 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45 71  ->nRecValid<(nEq
180c0 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  -1) ){.    retur
180d0 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
180e0 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  D;.  }..  /* Thi
180f0 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
18100 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20 63  tion only. The c
18110 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53 74  all to sqlite3St
18120 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
18130 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77 6f  ().  ** below wo
18140 75 6c 64 20 72 65 74 75 72 6e 20 74 68 65 20 73  uld return the s
18150 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20  ame value.  */. 
18160 20 69 66 28 20 6e 45 71 3e 70 2d 3e 6e 4b 65 79   if( nEq>p->nKey
18170 43 6f 6c 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f  Col ){.    *pnRo
18180 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  w = 1;.    retur
18190 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
181a0 0a 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61  ..  aff = p->pTa
181b0 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43  ble->aCol[p->aiC
181c0 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61 66  olumn[nEq-1]].af
181d0 66 69 6e 69 74 79 3b 0a 20 20 72 63 20 3d 20 73  finity;.  rc = s
181e0 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
181f0 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  SetValue(pParse,
18200 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72   p, &pRec, pExpr
18210 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20 26 62  , aff, nEq-1, &b
18220 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d  Ok);.  pBuilder-
18230 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20  >pRec = pRec;.  
18240 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18250 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
18260 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65   if( bOk==0 ) re
18270 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
18280 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65 72  OUND;.  pBuilder
18290 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 45  ->nRecValid = nE
182a0 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53 74  q;..  whereKeySt
182b0 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
182c0 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48  Rec, 0, a);.  WH
182d0 45 52 45 54 52 41 43 45 28 30 78 31 30 30 2c 28  ERETRACE(0x100,(
182e0 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72  "equality scan r
182f0 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28  egions: %d\n", (
18300 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70  int)a[1]));.  *p
18310 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a  nRow = a[1];.  .
18320 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
18330 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
18340 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
18350 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66  STAT4 */..#ifdef
18360 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
18370 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a  TAT3_OR_STAT4./*
18380 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
18390 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
183a0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
183b0 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a  urned based on.*
183c0 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  * an IN constrai
183d0 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67  nt where the rig
183e0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
183f0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
18400 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ** is a list of 
18410 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65  values.  Example
18420 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57  :.**.**        W
18430 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33  HERE x IN (1,2,3
18440 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  ,4).**.** Write 
18450 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
18460 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
18470 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
18480 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
18490 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
184a0 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
184b0 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
184c0 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
184d0 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
184e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
184f0 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
18500 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
18510 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
18520 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
18530 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
18540 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
18550 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
18560 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
18570 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
18580 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
18590 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
185a0 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
185b0 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
185c0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
185d0 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53  tic int whereInS
185e0 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
185f0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
18600 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
18610 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
18620 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
18630 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
18640 64 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  der,.  ExprList 
18650 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54  *pList,     /* T
18660 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e  he value list on
18670 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20 49   the RHS of "x I
18680 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29  N (v1,v2,v3,...)
18690 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a  " */.  tRowcnt *
186a0 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57  pnRow       /* W
186b0 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
186c0 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
186d0 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
186e0 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e   *p = pBuilder->
186f0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
18700 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 52 65 63  ndex;.  int nRec
18710 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72  Valid = pBuilder
18720 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69  ->nRecValid;.  i
18730 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
18740 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e  K;     /* Subfun
18750 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
18760 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  e */.  tRowcnt n
18770 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Est;           /
18780 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
18790 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65   for a single te
187a0 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  rm */.  tRowcnt 
187b0 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20  nRowEst = 0;    
187c0 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20  /* New estimate 
187d0 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
187e0 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69   rows */.  int i
187f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18800 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
18810 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
18820 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29   p->aSample!=0 )
18830 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
18840 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
18850 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
18860 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 70  +){.    nEst = p
18870 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20  ->aiRowEst[0];. 
18880 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
18890 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
188a0 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73  , pBuilder, pLis
188b0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26  t->a[i].pExpr, &
188c0 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45  nEst);.    nRowE
188d0 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20  st += nEst;.    
188e0 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
188f0 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
18900 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
18910 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18920 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 70   if( nRowEst > p
18930 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 20  ->aiRowEst[0] ) 
18940 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52  nRowEst = p->aiR
18950 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70  owEst[0];.    *p
18960 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a  nRow = nRowEst;.
18970 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
18980 78 31 30 30 2c 28 22 49 4e 20 72 6f 77 20 65 73  x100,("IN row es
18990 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e  timate: est=%g\n
189a0 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20  ", nRowEst));.  
189b0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69  }.  assert( pBui
189c0 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d  lder->nRecValid=
189d0 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20  =nRecValid );.  
189e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
189f0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
18a00 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
18a10 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69  AT4 */../*.** Di
18a20 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20  sable a term in 
18a30 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
18a40 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f  .  Except, do no
18a50 74 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  t disable the te
18a60 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74  rm.** if it cont
18a70 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45  rols a LEFT OUTE
18a80 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69  R JOIN and it di
18a90 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20  d not originate 
18aa0 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20  in the ON.** or 
18ab0 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
18ac0 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  that join..**.**
18ad0 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65   Consider the te
18ae0 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20  rm t2.z='ok' in 
18af0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75  the following qu
18b00 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  eries:.**.**   (
18b10 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  1)  SELECT * FRO
18b20 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
18b30 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57  2 ON t1.a=t2.x W
18b40 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a  HERE t2.z='ok'.*
18b50 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43 54 20  *   (2)  SELECT 
18b60 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
18b70 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
18b80 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b  2.x AND t2.z='ok
18b90 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45  '.**   (3)  SELE
18ba0 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
18bb0 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78   WHERE t1.a=t2.x
18bc0 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a   AND t2.z='ok'.*
18bd0 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f  *.** The t2.z='o
18be0 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  k' is disabled i
18bf0 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62 65 63  n the in (2) bec
18c00 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74  ause it originat
18c10 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20  es.** in the ON 
18c20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65 72  clause.  The ter
18c30 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e  m is disabled in
18c40 20 28 33 29 20 62 65 63 61 75 73 65 20 69 74 20   (3) because it 
18c50 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f  is not part.** o
18c60 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
18c70 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68  OIN.  In (1), th
18c80 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69  e term is not di
18c90 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69  sabled..**.** Di
18ca0 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63  sabling a term c
18cb0 61 75 73 65 73 20 74 68 61 74 20 74 65 72 6d 20  auses that term 
18cc0 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64  to not be tested
18cd0 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   in the inner lo
18ce0 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69  op.** of the joi
18cf0 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73  n.  Disabling is
18d00 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
18d10 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72  .  When terms ar
18d20 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62  e satisfied.** b
18d30 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69  y indices, we di
18d40 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72  sable them to pr
18d50 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20  event redundant 
18d60 74 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e  tests in the inn
18d70 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20  er.** loop.  We 
18d80 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f  would get the co
18d90 72 72 65 63 74 20 72 65 73 75 6c 74 73 20 69 66  rrect results if
18da0 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76   nothing were ev
18db0 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20  er disabled,.** 
18dc0 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20  but joins might 
18dd0 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f  run a little slo
18de0 77 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20  wer.  The trick 
18df0 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73  is to disable as
18e00 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63   much.** as we c
18e10 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61 62  an without disab
18e20 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20  ling too much.  
18e30 49 66 20 77 65 20 64 69 73 61 62 6c 65 64 20 69  If we disabled i
18e40 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a  n (1), we'd get.
18e50 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73  ** the wrong ans
18e60 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74  wer.  See ticket
18e70 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63   #813..*/.static
18e80 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72   void disableTer
18e90 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c  m(WhereLevel *pL
18ea0 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20  evel, WhereTerm 
18eb0 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70  *pTerm){.  if( p
18ec0 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70  Term.      && (p
18ed0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
18ee0 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20  TERM_CODED)==0. 
18ef0 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d       && (pLevel-
18f00 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c  >iLeftJoin==0 ||
18f10 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
18f20 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
18f30 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20  P_FromJoin)).   
18f40 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 6e     && (pLevel->n
18f50 6f 74 52 65 61 64 79 20 26 20 70 54 65 72 6d 2d  otReady & pTerm-
18f60 3e 70 72 65 72 65 71 41 6c 6c 29 3d 3d 30 0a 20  >prereqAll)==0. 
18f70 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77   ){.    pTerm->w
18f80 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
18f90 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54  ODED;.    if( pT
18fa0 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20  erm->iParent>=0 
18fb0 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
18fc0 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54  rm *pOther = &pT
18fd0 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72  erm->pWC->a[pTer
18fe0 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
18ff0 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72     if( (--pOther
19000 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a  ->nChild)==0 ){.
19010 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
19020 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68  erm(pLevel, pOth
19030 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
19040 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
19050 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e  Code an OP_Affin
19060 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70  ity opcode to ap
19070 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  ply the column a
19080 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a  ffinity string z
19090 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20  Aff.** to the n 
190a0 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
190b0 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a  ng at base. .**.
190c0 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ** As an optimiz
190d0 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46  ation, SQLITE_AF
190e0 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28  F_NONE entries (
190f0 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73  which are no-ops
19100 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69  ) at the.** begi
19110 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66  nning and end of
19120 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65   zAff are ignore
19130 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69  d.  If all entri
19140 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a  es in zAff are.*
19150 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
19160 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20  E, then no code 
19170 67 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a  gets generated..
19180 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
19190 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e  ne makes its own
191a0 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f   copy of zAff so
191b0 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
191c0 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d   is free.** to m
191d0 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74 65 72  odify zAff after
191e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
191f0 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  turns..*/.static
19200 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41   void codeApplyA
19210 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70  ffinity(Parse *p
19220 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c  Parse, int base,
19230 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41   int n, char *zA
19240 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ff){.  Vdbe *v =
19250 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
19260 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b    if( zAff==0 ){
19270 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
19280 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
19290 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74  ailed );.    ret
192a0 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
192b0 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  t( v!=0 );..  /*
192c0 20 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64   Adjust base and
192d0 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20   n to skip over 
192e0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
192f0 65 6e 74 72 69 65 73 20 61 74 20 74 68 65 20 62  entries at the b
19300 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e  eginning.  ** an
19310 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66  d end of the aff
19320 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20  inity string..  
19330 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  */.  while( n>0 
19340 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49  && zAff[0]==SQLI
19350 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
19360 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65     n--;.    base
19370 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a  ++;.    zAff++;.
19380 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31    }.  while( n>1
19390 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53   && zAff[n-1]==S
193a0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
193b0 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a  {.    n--;.  }..
193c0 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50    /* Code the OP
193d0 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65  _Affinity opcode
193e0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
193f0 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f  thing left to do
19400 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29  . */.  if( n>0 )
19410 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
19420 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66  eAddOp2(v, OP_Af
19430 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29  finity, base, n)
19440 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19450 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
19460 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73   zAff, n);.    s
19470 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
19480 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
19490 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a  arse, base, n);.
194a0 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65    }.}.../*.** Ge
194b0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
194c0 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74  a single equalit
194d0 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  y term of the WH
194e0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20  ERE clause.  An 
194f0 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d  equality.** term
19500 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58   can be either X
19510 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e  =expr or X IN (.
19520 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20  ..).   pTerm is 
19530 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a  the term to be .
19540 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  ** coded..**.** 
19550 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
19560 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72  e for the constr
19570 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20  aint is left in 
19580 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a  register iReg..*
19590 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74  *.** For a const
195a0 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72  raint of the for
195b0 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78  m X=expr, the ex
195c0 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c  pression is eval
195d0 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a  uated and its.**
195e0 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20   result is left 
195f0 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46  on the stack.  F
19600 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  or constraints o
19610 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20  f the form X IN 
19620 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f  (...).** this ro
19630 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
19640 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69  loop that will i
19650 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20  terate over all 
19660 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a  values of X..*/.
19670 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45  static int codeE
19680 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50  qualityTerm(.  P
19690 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
196a0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
196b0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
196c0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
196d0 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f     /* The term o
196e0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
196f0 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  se to be coded *
19700 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
19710 70 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c  pLevel, /* The l
19720 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d  evel of the FROM
19730 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77   clause we are w
19740 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69  orking on */.  i
19750 6e 74 20 69 45 71 2c 20 20 20 20 20 20 20 20 20  nt iEq,         
19760 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
19770 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  he equality term
19780 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76   within this lev
19790 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  el */.  int bRev
197a0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
197b0 72 75 65 20 66 6f 72 20 72 65 76 65 72 73 65 2d  rue for reverse-
197c0 6f 72 64 65 72 20 49 4e 20 6f 70 65 72 61 74 69  order IN operati
197d0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ons */.  int iTa
197e0 72 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20  rget         /* 
197f0 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65  Attempt to leave
19800 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73   results in this
19810 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
19820 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
19830 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62  rm->pExpr;.  Vdb
19840 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
19850 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67  Vdbe;.  int iReg
19860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19870 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
19880 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a  olding results *
19890 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54 61  /..  assert( iTa
198a0 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20  rget>0 );.  if( 
198b0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b  pX->op==TK_EQ ){
198c0 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69  .    iReg = sqli
198d0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
198e0 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  t(pParse, pX->pR
198f0 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a  ight, iTarget);.
19900 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e    }else if( pX->
19910 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
19920 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72  .    iReg = iTar
19930 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  get;.    sqlite3
19940 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19950 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b  _Null, 0, iReg);
19960 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19970 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
19980 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65  }else{.    int e
19990 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54  Type;.    int iT
199a0 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  ab;.    struct I
199b0 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20  nLoop *pIn;.    
199c0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
199d0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
199e0 70 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  p;..    if( (pLo
199f0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
19a00 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
19a10 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c  )==0.      && pL
19a20 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
19a30 64 65 78 21 3d 30 0a 20 20 20 20 20 20 26 26 20  dex!=0.      && 
19a40 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
19a50 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
19a60 72 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20  r[iEq].    ){.  
19a70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 45      testcase( iE
19a80 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  q==0 );.      te
19a90 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a  stcase( bRev );.
19aa0 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62 52        bRev = !bR
19ab0 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ev;.    }.    as
19ac0 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
19ad0 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20  _IN );.    iReg 
19ae0 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65  = iTarget;.    e
19af0 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
19b00 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
19b10 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 66  , pX, 0);.    if
19b20 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
19b30 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a  X_INDEX_DESC ){.
19b40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19b50 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52  bRev );.      bR
19b60 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20  ev = !bRev;.    
19b70 7d 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d  }.    iTab = pX-
19b80 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c  >iTable;.    sql
19b90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19ba0 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74  , bRev ? OP_Last
19bb0 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54   : OP_Rewind, iT
19bc0 61 62 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  ab, 0);.    asse
19bd0 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
19be0 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
19bf0 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a 20 20 20 20  I_OR)==0 );.    
19c00 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c  pLoop->wsFlags |
19c10 3d 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 3b  = WHERE_IN_ABLE;
19c20 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
19c30 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a  >u.in.nIn==0 ){.
19c40 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64        pLevel->ad
19c50 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56  drNxt = sqlite3V
19c60 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
19c70 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
19c80 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20  l->u.in.nIn++;. 
19c90 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
19ca0 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20  aInLoop =.      
19cb0 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
19cc0 63 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e  cOrFree(pParse->
19cd0 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  db, pLevel->u.in
19ce0 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20  .aInLoop,.      
19cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d00 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70          sizeof(p
19d10 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
19d20 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e  oop[0])*pLevel->
19d30 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70  u.in.nIn);.    p
19d40 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  In = pLevel->u.i
19d50 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69  n.aInLoop;.    i
19d60 66 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20  f( pIn ){.      
19d70 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75  pIn += pLevel->u
19d80 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20  .in.nIn - 1;.   
19d90 20 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69     pIn->iCur = i
19da0 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65  Tab;.      if( e
19db0 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
19dc0 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OWID ){.        
19dd0 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d  pIn->addrInTop =
19de0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19df0 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
19e00 69 54 61 62 2c 20 69 52 65 67 29 3b 0a 20 20 20  iTab, iReg);.   
19e10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19e20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70    pIn->addrInTop
19e30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
19e40 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
19e50 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67  n, iTab, 0, iReg
19e60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19e70 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
19e80 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65   = bRev ? OP_Pre
19e90 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  v : OP_Next;.   
19ea0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19eb0 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
19ec0 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65  l, iReg);.    }e
19ed0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
19ee0 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b  l->u.in.nIn = 0;
19ef0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
19f00 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28  }.  disableTerm(
19f10 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
19f20 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d    return iReg;.}
19f30 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
19f40 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
19f50 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20  evaluate all == 
19f60 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e  and IN constrain
19f70 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64  ts for an.** ind
19f80 65 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ex..**.** For ex
19f90 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20  ample, consider 
19fa0 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64  table t1(a,b,c,d
19fb0 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78  ,e,f) with index
19fc0 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53   i1(a,b,c)..** S
19fd0 75 70 70 6f 73 65 20 74 68 65 20 57 48 45 52 45  uppose the WHERE
19fe0 20 63 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a   clause is this:
19ff0 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20    a==5 AND b IN 
1a000 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20  (1,2,3) AND c>5 
1a010 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20  AND c<10.** The 
1a020 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e  index has as man
1a030 79 20 61 73 20 74 68 72 65 65 20 65 71 75 61 6c  y as three equal
1a040 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
1a050 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20   but in this.** 
1a060 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69  example, the thi
1a070 72 64 20 22 63 22 20 76 61 6c 75 65 20 69 73 20  rd "c" value is 
1a080 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  an inequality.  
1a090 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20  So only two .** 
1a0a0 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
1a0b0 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75  coded.  This rou
1a0c0 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  tine will genera
1a0d0 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
1a0e0 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20  ate.** a==5 and 
1a0f0 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54  b IN (1,2,3).  T
1a100 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
1a110 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69  s for a and b wi
1a120 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20  ll be stored.** 
1a130 69 6e 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  in consecutive r
1a140 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
1a150 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69   index of the fi
1a160 72 73 74 20 72 65 67 69 73 74 65 72 20 69 73 20  rst register is 
1a170 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1a180 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61  In the example a
1a190 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75  bove nEq==2.  Bu
1a1a0 74 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  t this subroutin
1a1b0 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  e works for any 
1a1c0 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20  value.** of nEq 
1a1d0 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66  including 0.  If
1a1e0 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f   nEq==0, this ro
1a1f0 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20  utine is nearly 
1a200 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20  a no-op..** The 
1a210 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f  only thing it do
1a220 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74  es is allocate t
1a230 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20  he pLevel->iMem 
1a240 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a  memory cell and.
1a250 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61  ** compute the a
1a260 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a  ffinity string..
1a270 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1a280 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61  ne always alloca
1a290 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  tes at least one
1a2a0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
1a2b0 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20   returns.** the 
1a2c0 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 6d 65  index of that me
1a2d0 6d 6f 72 79 20 63 65 6c 6c 2e 20 54 68 65 20 63  mory cell. The c
1a2e0 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c  ode that.** call
1a2f0 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
1a300 69 6c 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d  ill use that mem
1a310 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72  ory cell to stor
1a320 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f  e the terminatio
1a330 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f  n.** key value o
1a340 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20  f the loop.  If 
1a350 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f  one or more IN o
1a360 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c  perators appear,
1a370 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
1a380 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20  utine allocates 
1a390 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45  an additional nE
1a3a0 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66  q memory cells f
1a3b0 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75  or internal.** u
1a3c0 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  se..**.** Before
1a3d0 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41   returning, *pzA
1a3e0 66 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ff is set to poi
1a3f0 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  nt to a buffer c
1a400 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63  ontaining a.** c
1a410 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
1a420 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  n affinity strin
1a430 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  g of the index a
1a440 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a  llocated using.*
1a450 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  * sqlite3DbMallo
1a460 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74  c(). Except, ent
1a470 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79  ries in the copy
1a480 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 61   of the string a
1a490 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
1a4a0 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  h equality const
1a4b0 72 61 69 6e 74 73 20 74 68 61 74 20 75 73 65 20  raints that use 
1a4c0 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72  NONE affinity ar
1a4d0 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49  e set to.** SQLI
1a4e0 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69  TE_AFF_NONE. Thi
1a4f0 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74  s is to deal wit
1a500 68 20 53 51 4c 20 73 75 63 68 20 61 73 20 74 68  h SQL such as th
1a510 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
1a520 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
1a530 45 20 74 31 28 61 20 54 45 58 54 20 50 52 49 4d  E t1(a TEXT PRIM
1a540 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20  ARY KEY, b);.** 
1a550 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f    SELECT ... FRO
1a560 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31 20 57  M t1 AS t2, t1 W
1a570 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62  HERE t1.a = t2.b
1a580 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65  ;.**.** In the e
1a590 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68  xample above, th
1a5a0 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29  e index on t1(a)
1a5b0 20 68 61 73 20 54 45 58 54 20 61 66 66 69 6e 69   has TEXT affini
1a5c0 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a  ty. But since.**
1a5d0 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
1a5e0 73 69 64 65 20 6f 66 20 74 68 65 20 65 71 75 61  side of the equa
1a5f0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
1a600 28 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20  (t2.b) has NONE 
1a610 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20  affinity,.** no 
1a620 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c  conversion shoul
1a630 64 20 62 65 20 61 74 74 65 6d 70 74 65 64 20 62  d be attempted b
1a640 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32  efore using a t2
1a650 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61 72 74  .b value as part
1a660 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20   of.** a key to 
1a670 73 65 61 72 63 68 20 74 68 65 20 69 6e 64 65 78  search the index
1a680 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69 72 73  . Hence the firs
1a690 74 20 62 79 74 65 20 69 6e 20 74 68 65 20 72 65  t byte in the re
1a6a0 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a  turned affinity.
1a6b0 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69  ** string in thi
1a6c0 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20  s example would 
1a6d0 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
1a6e0 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74  _AFF_NONE..*/.st
1a6f0 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c  atic int codeAll
1a700 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20  EqualityTerms(. 
1a710 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1a720 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1a730 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
1a740 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
1a750 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65  l,   /* Which ne
1a760 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65  sted loop of the
1a770 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64   FROM we are cod
1a780 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ing */.  int bRe
1a790 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  v,             /
1a7a0 2a 20 52 65 76 65 72 73 65 20 74 68 65 20 6f 72  * Reverse the or
1a7b0 64 65 72 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  der of IN operat
1a7c0 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ors */.  int nEx
1a7d0 74 72 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f  traReg,        /
1a7e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
1a7f0 61 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61  a registers to a
1a800 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61  llocate */.  cha
1a810 72 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20  r **pzAff       
1a820 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74     /* OUT: Set t
1a830 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e  o point to affin
1a840 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  ity string */.){
1a850 0a 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20  .  int nEq;     
1a860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a870 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
1a880 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74  f == or IN const
1a890 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a  raints to code *
1a8a0 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
1a8b0 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
1a8c0 20 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65    /* The vm unde
1a8d0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
1a8e0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
1a8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a900 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62    /* The index b
1a910 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68  eing used for th
1a920 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65  is loop */.  Whe
1a930 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
1a940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
1a950 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e  single constrain
1a960 74 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72  t term */.  Wher
1a970 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
1a980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a990 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1a9a0 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  t */.  int j;   
1a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9c0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1a9d0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nter */.  int re
1a9e0 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  gBase;          
1a9f0 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20          /* Base 
1aa00 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
1aa10 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20  t nReg;         
1aa20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1aa30 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65  umber of registe
1aa40 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
1aa50 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20  /.  char *zAff; 
1aa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa70 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74    /* Affinity st
1aa80 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a  ring to return *
1aa90 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64  /..  /* This mod
1aaa0 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ule is only call
1aab0 65 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e  ed on query plan
1aac0 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e  s that use an in
1aad0 64 65 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20  dex. */.  pLoop 
1aae0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
1aaf0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f  ;.  assert( (pLo
1ab00 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1ab10 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
1ab20 29 3d 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20  )==0 );.  nEq = 
1ab30 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
1ab40 45 71 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 6f  Eq;.  pIdx = pLo
1ab50 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
1ab60 65 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  ex;.  assert( pI
1ab70 64 78 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 46  dx!=0 );..  /* F
1ab80 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
1ab90 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  ny memory cells 
1aba0 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65  we will need the
1abb0 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e  n allocate them.
1abc0 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20  .  */.  regBase 
1abd0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
1abe0 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 6f   1;.  nReg = pLo
1abf0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
1ac00 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70  + nExtraReg;.  p
1ac10 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
1ac20 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73  Reg;..  zAff = s
1ac30 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70  qlite3DbStrDup(p
1ac40 50 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74  Parse->db, sqlit
1ac50 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53  e3IndexAffinityS
1ac60 74 72 28 76 2c 20 70 49 64 78 29 29 3b 0a 20 20  tr(v, pIdx));.  
1ac70 69 66 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20  if( !zAff ){.   
1ac80 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1ac90 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
1aca0 20 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74   }..  /* Evaluat
1acb0 65 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63  e the equality c
1acc0 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a  onstraints.  */.
1acd0 20 20 61 73 73 65 72 74 28 20 7a 41 66 66 3d 3d    assert( zAff==
1ace0 30 20 7c 7c 20 28 69 6e 74 29 73 74 72 6c 65 6e  0 || (int)strlen
1acf0 28 7a 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20  (zAff)>=nEq );. 
1ad00 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b   for(j=0; j<nEq;
1ad10 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   j++){.    int r
1ad20 31 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70  1;.    pTerm = p
1ad30 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b  Loop->aLTerm[j];
1ad40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
1ad50 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20  rm!=0 );.    /* 
1ad60 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 72  The following tr
1ad70 75 65 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77  ue for indices w
1ad80 69 74 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f  ith redundant co
1ad90 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45  lumns. .    ** E
1ada0 78 3a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  x: CREATE INDEX 
1adb0 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b  i1 ON t1(a,b,a);
1adc0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1add0 31 20 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20  1 WHERE a=0 AND 
1ade0 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74  b=0; */.    test
1adf0 63 61 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74  case( (pTerm->wt
1ae00 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
1ae10 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  ED)!=0 );.    te
1ae20 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
1ae30 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
1ae40 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 72 31 20  RTUAL );.    r1 
1ae50 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65  = codeEqualityTe
1ae60 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
1ae70 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65  , pLevel, j, bRe
1ae80 76 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  v, regBase+j);. 
1ae90 20 20 20 69 66 28 20 72 31 21 3d 72 65 67 42 61     if( r1!=regBa
1aea0 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66  se+j ){.      if
1aeb0 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20  ( nReg==1 ){.   
1aec0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
1aed0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1aee0 65 2c 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20  e, regBase);.   
1aef0 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72       regBase = r
1af00 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1af10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1af20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1af30 53 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61  SCopy, r1, regBa
1af40 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20  se+j);.      }. 
1af50 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
1af60 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
1af70 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  tor & WO_ISNULL 
1af80 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1af90 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
1afa0 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
1afb0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
1afc0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e  erator & (WO_ISN
1afd0 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29  ULL|WO_IN))==0 )
1afe0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
1aff0 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45  ight = pTerm->pE
1b000 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
1b010 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1b020 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20  deIsNullJump(v, 
1b030 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
1b040 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  j, pLevel->addrB
1b050 72 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  rk);.      if( z
1b060 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
1b070 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
1b080 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
1b090 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49  , zAff[j])==SQLI
1b0a0 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
1b0b0 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d           zAff[j]
1b0c0 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
1b0d0 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
1b0e0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1b0f0 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
1b100 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68  nityChange(pRigh
1b110 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20  t, zAff[j]) ){. 
1b120 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d           zAff[j]
1b130 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
1b140 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
1b150 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1b160 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b    *pzAff = zAff;
1b170 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73  .  return regBas
1b180 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  e;.}..#ifndef SQ
1b190 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
1b1a0 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  N./*.** This rou
1b1b0 74 69 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72  tine is a helper
1b1c0 20 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65   for explainInde
1b1d0 78 52 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a  xRange() below.*
1b1e0 2a 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20  *.** pStr holds 
1b1f0 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65  the text of an e
1b200 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77  xpression that w
1b210 65 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75  e are building u
1b220 70 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74  p one term.** at
1b230 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72   a time.  This r
1b240 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65  outine adds a ne
1b250 77 20 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e  w term to the en
1b260 64 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  d of the express
1b270 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72  ion..** Terms ar
1b280 65 20 73 65 70 61 72 61 74 65 64 20 62 79 20 41  e separated by A
1b290 4e 44 20 73 6f 20 61 64 64 20 74 68 65 20 22 41  ND so add the "A
1b2a0 4e 44 22 20 74 65 78 74 20 66 6f 72 20 73 65 63  ND" text for sec
1b2b0 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  ond and subseque
1b2c0 6e 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79  nt.** terms only
1b2d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b2e0 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
1b2f0 72 6d 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a  rm(.  StrAccum *
1b300 70 53 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  pStr,           
1b310 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78    /* The text ex
1b320 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62  pression being b
1b330 75 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54  uilt */.  int iT
1b340 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
1b350 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1b360 66 20 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69  f this term.  Fi
1b370 72 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20  rst is zero */. 
1b380 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
1b390 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  lumn,        /* 
1b3a0 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
1b3b0 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  mn */.  const ch
1b3c0 61 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20  ar *zOp         
1b3d0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1b3e0 68 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29  he operator */.)
1b3f0 7b 0a 20 20 69 66 28 20 69 54 65 72 6d 20 29 20  {.  if( iTerm ) 
1b400 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
1b410 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e  ppend(pStr, " AN
1b420 44 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74  D ", 5);.  sqlit
1b430 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
1b440 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20  (pStr, zColumn, 
1b450 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74  -1);.  sqlite3St
1b460 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
1b470 72 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71  r, zOp, 1);.  sq
1b480 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
1b490 65 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c 20 31  end(pStr, "?", 1
1b4a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  );.}../*.** Argu
1b4b0 6d 65 6e 74 20 70 4c 65 76 65 6c 20 64 65 73 63  ment pLevel desc
1b4c0 72 69 62 65 73 20 61 20 73 74 72 61 74 65 67 79  ribes a strategy
1b4d0 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 61   for scanning ta
1b4e0 62 6c 65 20 70 54 61 62 2e 20 54 68 69 73 20 0a  ble pTab. This .
1b4f0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
1b500 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
1b510 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
1b520 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64 65   containing a de
1b530 73 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20  scription.** of 
1b540 74 68 65 20 73 75 62 73 65 74 20 6f 66 20 74 61  the subset of ta
1b550 62 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e 65 64  ble rows scanned
1b560 20 62 79 20 74 68 65 20 73 74 72 61 74 65 67 79   by the strategy
1b570 20 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20   in the form of 
1b580 61 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73  an.** SQL expres
1b590 73 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c  sion. Or, if all
1b5a0 20 72 6f 77 73 20 61 72 65 20 73 63 61 6e 6e 65   rows are scanne
1b5b0 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  d, NULL is retur
1b5c0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ned..**.** For e
1b5d0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71  xample, if the q
1b5e0 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  uery:.**.**   SE
1b5f0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1b600 48 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32  HERE a=1 AND b>2
1b610 3b 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61  ;.**.** is run a
1b620 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 69  nd there is an i
1b630 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20  ndex on (a, b), 
1b640 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
1b650 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20  on returns a.** 
1b660 73 74 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74  string similar t
1b670 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20  o:.**.**   "a=? 
1b680 41 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54  AND b>?".**.** T
1b690 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e  he returned poin
1b6a0 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65  ter points to me
1b6b0 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
1b6c0 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  om sqlite3DbMall
1b6d0 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74  oc()..** It is t
1b6e0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
1b6f0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
1b700 74 6f 20 66 72 65 65 20 74 68 65 20 62 75 66 66  to free the buff
1b710 65 72 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a  er when it is.**
1b720 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69   no longer requi
1b730 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  red..*/.static c
1b740 68 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65  har *explainInde
1b750 78 52 61 6e 67 65 28 73 71 6c 69 74 65 33 20 2a  xRange(sqlite3 *
1b760 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
1b770 4c 6f 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54 61  Loop, Table *pTa
1b780 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  b){.  Index *pIn
1b790 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  dex = pLoop->u.b
1b7a0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
1b7b0 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  nt nEq = pLoop->
1b7c0 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 69  u.btree.nEq;.  i
1b7d0 6e 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d  nt i, j;.  Colum
1b7e0 6e 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e  n *aCol = pTab->
1b7f0 61 43 6f 6c 3b 0a 20 20 69 31 36 20 2a 61 69 43  aCol;.  i16 *aiC
1b800 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e  olumn = pIndex->
1b810 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72 41  aiColumn;.  StrA
1b820 63 63 75 6d 20 74 78 74 3b 0a 0a 20 20 69 66 28  ccum txt;..  if(
1b830 20 6e 45 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f   nEq==0 && (pLoo
1b840 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
1b850 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48  ERE_BTM_LIMIT|WH
1b860 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d  ERE_TOP_LIMIT))=
1b870 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1b880 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
1b890 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 74  3StrAccumInit(&t
1b8a0 78 74 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45  xt, 0, 0, SQLITE
1b8b0 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20  _MAX_LENGTH);.  
1b8c0 74 78 74 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73  txt.db = db;.  s
1b8d0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
1b8e0 70 65 6e 64 28 26 74 78 74 2c 20 22 20 28 22 2c  pend(&txt, " (",
1b8f0 20 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   2);.  for(i=0; 
1b900 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nEq; i++){.   
1b910 20 63 68 61 72 20 2a 7a 20 3d 20 28 69 3d 3d 70   char *z = (i==p
1b920 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  Index->nKeyCol )
1b930 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f   ? "rowid" : aCo
1b940 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a  l[aiColumn[i]].z
1b950 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69  Name;.    explai
1b960 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
1b970 2c 20 69 2c 20 7a 2c 20 22 3d 22 29 3b 0a 20 20  , i, z, "=");.  
1b980 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66  }..  j = i;.  if
1b990 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1b9a0 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  &WHERE_BTM_LIMIT
1b9b0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20   ){.    char *z 
1b9c0 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 4b  = (j==pIndex->nK
1b9d0 65 79 43 6f 6c 20 29 20 3f 20 22 72 6f 77 69 64  eyCol ) ? "rowid
1b9e0 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d  " : aCol[aiColum
1b9f0 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  n[j]].zName;.   
1ba00 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
1ba10 72 6d 28 26 74 78 74 2c 20 69 2b 2b 2c 20 7a 2c  rm(&txt, i++, z,
1ba20 20 22 3e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28   ">");.  }.  if(
1ba30 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26   pLoop->wsFlags&
1ba40 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
1ba50 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
1ba60 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65   (j==pIndex->nKe
1ba70 79 43 6f 6c 20 29 20 3f 20 22 72 6f 77 69 64 22  yCol ) ? "rowid"
1ba80 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e   : aCol[aiColumn
1ba90 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  [j]].zName;.    
1baa0 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72  explainAppendTer
1bab0 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20 22 3c  m(&txt, i, z, "<
1bac0 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ");.  }.  sqlite
1bad0 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
1bae0 26 74 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20  &txt, ")", 1);. 
1baf0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
1bb00 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 74  trAccumFinish(&t
1bb10 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  xt);.}../*.** Th
1bb20 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1bb30 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75   no-op unless cu
1bb40 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69  rrently processi
1bb50 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55  ng an EXPLAIN QU
1bb60 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d  ERY PLAN.** comm
1bb70 61 6e 64 2e 20 49 66 20 74 68 65 20 71 75 65 72  and. If the quer
1bb80 79 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c 65 64  y being compiled
1bb90 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 51   is an EXPLAIN Q
1bba0 55 45 52 59 20 50 4c 41 4e 2c 20 61 20 73 69 6e  UERY PLAN, a sin
1bbb0 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 73  gle.** record is
1bbc0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6f 75   added to the ou
1bbd0 74 70 75 74 20 74 6f 20 64 65 73 63 72 69 62 65  tput to describe
1bbe0 20 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20   the table scan 
1bbf0 73 74 72 61 74 65 67 79 20 69 6e 20 0a 2a 2a 20  strategy in .** 
1bc00 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  pLevel..*/.stati
1bc10 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e  c void explainOn
1bc20 65 53 63 61 6e 28 0a 20 20 50 61 72 73 65 20 2a  eScan(.  Parse *
1bc30 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
1bc40 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1bc50 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  e context */.  S
1bc60 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
1bc70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1bc80 2a 20 54 61 62 6c 65 20 6c 69 73 74 20 74 68 69  * Table list thi
1bc90 73 20 6c 6f 6f 70 20 72 65 66 65 72 73 20 74 6f  s loop refers to
1bca0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
1bcb0 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20 20 20   *pLevel,       
1bcc0 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 74 6f        /* Scan to
1bcd0 20 77 72 69 74 65 20 4f 50 5f 45 78 70 6c 61 69   write OP_Explai
1bce0 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a 2f 0a  n opcode for */.
1bcf0 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20    int iLevel,   
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd10 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22    /* Value for "
1bd20 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66  level" column of
1bd30 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74   output */.  int
1bd40 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
1bd50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bd60 56 61 6c 75 65 20 66 6f 72 20 22 66 72 6f 6d 22  Value for "from"
1bd70 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75   column of outpu
1bd80 74 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  t */.  u16 wctrl
1bd90 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
1bda0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
1bdb0 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
1bdc0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
1bdd0 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  .){.  if( pParse
1bde0 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
1bdf0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
1be00 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
1be10 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
1be20 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
1be30 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1be40 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
1be50 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73  /* VM being cons
1be60 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20 20 73  tructed */.    s
1be70 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1be80 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20  rse->db;     /* 
1be90 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
1bea0 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  */.    char *zMs
1beb0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
1bec0 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20       /* Text to 
1bed0 61 64 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75  add to EQP outpu
1bee0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  t */.    int iId
1bef0 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65   = pParse->iSele
1bf00 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74  ctId;  /* Select
1bf10 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f   id (left-most o
1bf20 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f  utput column) */
1bf30 0a 20 20 20 20 69 6e 74 20 69 73 53 65 61 72 63  .    int isSearc
1bf40 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
1bf50 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
1bf60 20 53 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66   SEARCH. False f
1bf70 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 20 20 20 20  or SCAN. */.    
1bf80 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
1bf90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1bfa0 20 54 68 65 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67   The controlling
1bfb0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1bfc0 74 20 2a 2f 0a 20 20 20 20 75 33 32 20 66 6c 61  t */.    u32 fla
1bfd0 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1bfe0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
1bff0 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68  that describe th
1c000 69 73 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20  is loop */..    
1c010 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
1c020 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 66 6c 61 67  pWLoop;.    flag
1c030 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  s = pLoop->wsFla
1c040 67 73 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61  gs;.    if( (fla
1c050 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f  gs&WHERE_MULTI_O
1c060 52 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67  R) || (wctrlFlag
1c070 73 26 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  s&WHERE_ONETABLE
1c080 5f 4f 4e 4c 59 29 20 29 20 72 65 74 75 72 6e 3b  _ONLY) ) return;
1c090 0a 0a 20 20 20 20 69 73 53 65 61 72 63 68 20 3d  ..    isSearch =
1c0a0 20 28 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42   (flags&(WHERE_B
1c0b0 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54  TM_LIMIT|WHERE_T
1c0c0 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20  OP_LIMIT))!=0.  
1c0d0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66            || ((f
1c0e0 6c 61 67 73 26 57 48 45 52 45 5f 56 49 52 54 55  lags&WHERE_VIRTU
1c0f0 41 4c 54 41 42 4c 45 29 3d 3d 30 20 26 26 20 28  ALTABLE)==0 && (
1c100 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
1c110 45 71 3e 30 29 29 0a 20 20 20 20 20 20 20 20 20  Eq>0)).         
1c120 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67     || (wctrlFlag
1c130 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59  s&(WHERE_ORDERBY
1c140 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52  _MIN|WHERE_ORDER
1c150 42 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a  BY_MAX));..    z
1c160 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
1c170 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 69  intf(db, "%s", i
1c180 73 53 65 61 72 63 68 3f 22 53 45 41 52 43 48 22  sSearch?"SEARCH"
1c190 3a 22 53 43 41 4e 22 29 3b 0a 20 20 20 20 69 66  :"SCAN");.    if
1c1a0 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
1c1b0 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d   ){.      zMsg =
1c1c0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1c1d0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53  (db, zMsg, "%s S
1c1e0 55 42 51 55 45 52 59 20 25 64 22 2c 20 7a 4d 73  UBQUERY %d", zMs
1c1f0 67 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74  g,pItem->iSelect
1c200 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Id);.    }else{.
1c210 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1c220 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1c230 20 7a 4d 73 67 2c 20 22 25 73 20 54 41 42 4c 45   zMsg, "%s TABLE
1c240 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65   %s", zMsg, pIte
1c250 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  m->zName);.    }
1c260 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ..    if( pItem-
1c270 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
1c280 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1c290 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1c2a0 2c 20 22 25 73 20 41 53 20 25 73 22 2c 20 7a 4d  , "%s AS %s", zM
1c2b0 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  sg, pItem->zAlia
1c2c0 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  s);.    }.    if
1c2d0 28 20 28 66 6c 61 67 73 20 26 20 28 57 48 45 52  ( (flags & (WHER
1c2e0 45 5f 49 50 4b 7c 57 48 45 52 45 5f 56 49 52 54  E_IPK|WHERE_VIRT
1c2f0 55 41 4c 54 41 42 4c 45 29 29 3d 3d 30 0a 20 20  UALTABLE))==0.  
1c300 20 20 20 26 26 20 41 4c 57 41 59 53 28 70 4c 6f     && ALWAYS(pLo
1c310 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
1c320 65 78 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  ex!=0).    ){.  
1c330 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65      char *zWhere
1c340 20 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52   = explainIndexR
1c350 61 6e 67 65 28 64 62 2c 20 70 4c 6f 6f 70 2c 20  ange(db, pLoop, 
1c360 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  pItem->pTab);.  
1c370 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1c380 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1c390 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Msg,.           
1c3a0 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48      ((flags & WH
1c3b0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20  ERE_AUTO_INDEX) 
1c3c0 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ? .             
1c3d0 20 20 20 20 20 20 22 25 73 20 55 53 49 4e 47 20        "%s USING 
1c3e0 41 55 54 4f 4d 41 54 49 43 20 25 73 49 4e 44 45  AUTOMATIC %sINDE
1c3f0 58 25 2e 30 73 25 73 22 20 3a 0a 20 20 20 20 20  X%.0s%s" :.     
1c400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25                "%
1c410 73 20 55 53 49 4e 47 20 25 73 49 4e 44 45 58 20  s USING %sINDEX 
1c420 25 73 25 73 22 29 2c 20 0a 20 20 20 20 20 20 20  %s%s"), .       
1c430 20 20 20 20 20 20 20 20 7a 4d 73 67 2c 20 28 28          zMsg, ((
1c440 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  flags & WHERE_ID
1c450 58 5f 4f 4e 4c 59 29 20 3f 20 22 43 4f 56 45 52  X_ONLY) ? "COVER
1c460 49 4e 47 20 22 20 3a 20 22 22 29 2c 0a 20 20 20  ING " : ""),.   
1c470 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
1c480 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
1c490 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 57 68 65 72 65  x->zName, zWhere
1c4a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c4b0 44 62 46 72 65 65 28 64 62 2c 20 7a 57 68 65 72  DbFree(db, zWher
1c4c0 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  e);.    }else if
1c4d0 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45  ( (flags & WHERE
1c4e0 5f 49 50 4b 29 21 3d 30 20 26 26 20 28 66 6c 61  _IPK)!=0 && (fla
1c4f0 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54  gs & WHERE_CONST
1c500 52 41 49 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20  RAINT)!=0 ){.   
1c510 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1c520 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1c530 73 67 2c 20 22 25 73 20 55 53 49 4e 47 20 49 4e  sg, "%s USING IN
1c540 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
1c550 59 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20  Y", zMsg);..    
1c560 20 20 69 66 28 20 66 6c 61 67 73 26 28 57 48 45    if( flags&(WHE
1c570 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
1c580 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b  RE_COLUMN_IN) ){
1c590 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
1c5a0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1c5b0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72  db, zMsg, "%s (r
1c5c0 6f 77 69 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b  owid=?)", zMsg);
1c5d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1c5e0 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 42 4f   (flags&WHERE_BO
1c5f0 54 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45  TH_LIMIT)==WHERE
1c600 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20  _BOTH_LIMIT ){. 
1c610 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
1c620 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1c630 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77  , zMsg, "%s (row
1c640 69 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f  id>? AND rowid<?
1c650 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
1c660 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
1c670 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  &WHERE_BTM_LIMIT
1c680 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
1c690 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1c6a0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1c6b0 20 28 72 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73   (rowid>?)", zMs
1c6c0 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
1c6d0 69 66 28 20 41 4c 57 41 59 53 28 66 6c 61 67 73  if( ALWAYS(flags
1c6e0 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  &WHERE_TOP_LIMIT
1c6f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  ) ){.        zMs
1c700 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
1c710 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
1c720 73 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d  s (rowid<?)", zM
1c730 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sg);.      }.   
1c740 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1c750 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1c760 42 4c 45 0a 20 20 20 20 65 6c 73 65 20 69 66 28  BLE.    else if(
1c770 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f   (flags & WHERE_
1c780 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
1c790 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d   ){.      zMsg =
1c7a0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1c7b0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56  (db, zMsg, "%s V
1c7c0 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44  IRTUAL TABLE IND
1c7d0 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c  EX %d:%s", zMsg,
1c7e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c7f0 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62     pLoop->u.vtab
1c800 2e 69 64 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e  .idxNum, pLoop->
1c810 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
1c820 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1c830 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1c840 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1c850 2c 20 22 25 73 22 2c 20 7a 4d 73 67 29 3b 0a 20  , "%s", zMsg);. 
1c860 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c870 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
1c880 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c  in, iId, iLevel,
1c890 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34   iFrom, zMsg, P4
1c8a0 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
1c8b0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1c8c0 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75  explainOneScan(u
1c8d0 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64  ,v,w,x,y,z).#end
1c8e0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1c8f0 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f  T_EXPLAIN */.../
1c900 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1c910 64 65 20 66 6f 72 20 74 68 65 20 73 74 61 72 74  de for the start
1c920 20 6f 66 20 74 68 65 20 69 4c 65 76 65 6c 2d 74   of the iLevel-t
1c930 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57 48  h loop in the WH
1c940 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d  ERE clause.** im
1c950 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73  plementation des
1c960 63 72 69 62 65 64 20 62 79 20 70 57 49 6e 66 6f  cribed by pWInfo
1c970 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d  ..*/.static Bitm
1c980 61 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53  ask codeOneLoopS
1c990 74 61 72 74 28 0a 20 20 57 68 65 72 65 49 6e 66  tart(.  WhereInf
1c9a0 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20  o *pWInfo,   /* 
1c9b0 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61  Complete informa
1c9c0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57  tion about the W
1c9d0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
1c9e0 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20   int iLevel,    
1c9f0 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c        /* Which l
1ca00 65 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e  evel of pWInfo->
1ca10 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  a[] should be co
1ca20 64 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ded */.  Bitmask
1ca30 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a   notReady     /*
1ca40 20 57 68 69 63 68 20 74 61 62 6c 65 73 20 61 72   Which tables ar
1ca50 65 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  e currently avai
1ca60 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lable */.){.  in
1ca70 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20  t j, k;         
1ca80 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1ca90 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ers */.  int iCu
1caa0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
1cab0 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
1cac0 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a   for the table *
1cad0 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b  /.  int addrNxt;
1cae0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
1caf0 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e  e to jump to con
1cb00 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e  tinue with the n
1cb10 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20  ext IN case */. 
1cb20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20   int omitTable; 
1cb30 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1cb40 20 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65   we use the inde
1cb50 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  x only */.  int 
1cb60 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  bRev;           
1cb70 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e   /* True if we n
1cb80 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72  eed to scan in r
1cb90 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
1cba0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
1cbb0 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68  evel;  /* The wh
1cbc0 65 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20  ere level to be 
1cbd0 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  coded */.  Where
1cbe0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
1cbf0 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70  /* The WhereLoop
1cc00 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 63 6f   object being co
1cc10 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ded */.  WhereCl
1cc20 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a  ause *pWC;    /*
1cc30 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f   Decomposition o
1cc40 66 20 74 68 65 20 65 6e 74 69 72 65 20 57 48 45  f the entire WHE
1cc50 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
1cc60 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
1cc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cc80 2a 20 41 20 57 48 45 52 45 20 63 6c 61 75 73 65  * A WHERE clause
1cc90 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65   term */.  Parse
1cca0 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
1ccb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1ccc0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1ccd0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
1cce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccf0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
1cd00 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56  onnection */.  V
1cd10 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
1cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cd30 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
1cd40 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tmt under constr
1cd50 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72  uctions */.  str
1cd60 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1cd70 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20   *pTabItem;  /* 
1cd80 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
1cd90 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
1cda0 20 20 69 6e 74 20 61 64 64 72 42 72 6b 3b 20 20    int addrBrk;  
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdc0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
1cdd0 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
1cde0 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
1cdf0 20 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20 20   addrCont;      
1ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ce10 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
1ce20 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20  tinue with next 
1ce30 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  cycle */.  int i
1ce40 52 6f 77 69 64 52 65 67 20 3d 20 30 3b 20 20 20  RowidReg = 0;   
1ce50 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 73       /* Rowid is
1ce60 20 73 74 6f 72 65 64 20 69 6e 20 74 68 69 73 20   stored in this 
1ce70 72 65 67 69 73 74 65 72 2c 20 69 66 20 6e 6f 74  register, if not
1ce80 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69   zero */.  int i
1ce90 52 65 6c 65 61 73 65 52 65 67 20 3d 20 30 3b 20  ReleaseReg = 0; 
1cea0 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67       /* Temp reg
1ceb0 69 73 74 65 72 20 74 6f 20 66 72 65 65 20 62 65  ister to free be
1cec0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 2a  fore returning *
1ced0 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  /..  pParse = pW
1cee0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
1cef0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1cf00 65 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e  e;.  pWC = &pWIn
1cf10 66 6f 2d 3e 73 57 43 3b 0a 20 20 64 62 20 3d 20  fo->sWC;.  db = 
1cf20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4c  pParse->db;.  pL
1cf30 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
1cf40 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f  a[iLevel];.  pLo
1cf50 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
1cf60 6f 6f 70 3b 0a 20 20 70 54 61 62 49 74 65 6d 20  oop;.  pTabItem 
1cf70 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  = &pWInfo->pTabL
1cf80 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
1cf90 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20  From];.  iCur = 
1cfa0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
1cfb0 72 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  r;.  pLevel->not
1cfc0 52 65 61 64 79 20 3d 20 6e 6f 74 52 65 61 64 79  Ready = notReady
1cfd0 20 26 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49   & ~getMask(&pWI
1cfe0 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69  nfo->sMaskSet, i
1cff0 43 75 72 29 3b 0a 20 20 62 52 65 76 20 3d 20 28  Cur);.  bRev = (
1d000 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 3e  pWInfo->revMask>
1d010 3e 69 4c 65 76 65 6c 29 26 31 3b 0a 20 20 6f 6d  >iLevel)&1;.  om
1d020 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 6f 6f 70  itTable = (pLoop
1d030 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1d040 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a  E_IDX_ONLY)!=0 .
1d050 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
1d060 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
1d070 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f  s & WHERE_FORCE_
1d080 54 41 42 4c 45 29 3d 3d 30 3b 0a 20 20 56 64 62  TABLE)==0;.  Vdb
1d090 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1d0a0 20 22 42 65 67 69 6e 20 4a 6f 69 6e 20 4c 6f 6f   "Begin Join Loo
1d0b0 70 20 25 64 22 2c 20 69 4c 65 76 65 6c 29 29 3b  p %d", iLevel));
1d0c0 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61  ..  /* Create la
1d0d0 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72  bels for the "br
1d0e0 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e  eak" and "contin
1d0f0 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ue" instructions
1d100 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75  .  ** for the cu
1d110 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d  rrent loop.  Jum
1d120 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20  p to addrBrk to 
1d130 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c  break out of a l
1d140 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74  oop..  ** Jump t
1d150 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d  o cont to go imm
1d160 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20  ediately to the 
1d170 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
1d180 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e  f the.  ** loop.
1d190 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
1d1a0 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f  there is an IN o
1d1b0 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f  perator, we also
1d1c0 20 68 61 76 65 20 61 20 22 61 64 64 72 4e 78 74   have a "addrNxt
1d1d0 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a  " label that.  *
1d1e0 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69  * means to conti
1d1f0 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
1d200 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69  t IN value combi
1d210 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20  nation.  When.  
1d220 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  ** there are no 
1d230 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20  IN operators in 
1d240 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  the constraints,
1d250 20 74 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c   the "addrNxt" l
1d260 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65  abel.  ** is the
1d270 20 73 61 6d 65 20 61 73 20 22 61 64 64 72 42 72   same as "addrBr
1d280 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42  k"..  */.  addrB
1d290 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  rk = pLevel->add
1d2a0 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rBrk = pLevel->a
1d2b0 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33  ddrNxt = sqlite3
1d2c0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1d2d0 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70  ;.  addrCont = p
1d2e0 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20  Level->addrCont 
1d2f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1d300 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
1d310 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
1d320 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61  right table of a
1d330 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1d340 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20  , allocate and. 
1d350 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   ** initialize a
1d360 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
1d370 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68 69  t records if thi
1d380 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20  s table matches 
1d390 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  any.  ** row of 
1d3a0 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f  the left table o
1d3b0 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f  f the join..  */
1d3c0 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69  .  if( pLevel->i
1d3d0 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49  From>0 && (pTabI
1d3e0 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20  tem[0].jointype 
1d3f0 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b  & JT_LEFT)!=0 ){
1d400 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  .    pLevel->iLe
1d410 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73  ftJoin = ++pPars
1d420 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
1d430 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d440 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
1d450 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
1d460 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  in);.    VdbeCom
1d470 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c  ment((v, "init L
1d480 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63  EFT JOIN no-matc
1d490 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a  h flag"));.  }..
1d4a0 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
1d4b0 65 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75  e of a FROM clau
1d4c0 73 65 20 73 75 62 71 75 65 72 79 20 69 6d 70 6c  se subquery impl
1d4d0 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d  emented as a co-
1d4e0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28  routine */.  if(
1d4f0 20 70 54 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f   pTabItem->viaCo
1d500 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69  routine ){.    i
1d510 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54  nt regYield = pT
1d520 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72  abItem->regRetur
1d530 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  n;.    sqlite3Vd
1d540 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1d550 6e 74 65 67 65 72 2c 20 70 54 61 62 49 74 65 6d  nteger, pTabItem
1d560 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 2d 31 2c  ->addrFillSub-1,
1d570 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20   regYield);.    
1d580 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 20 73 71  pLevel->p2 =  sq
1d590 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1d5a0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1d5b0 59 69 65 6c 64 29 3b 0a 20 20 20 20 56 64 62 65  Yield);.    Vdbe
1d5c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78  Comment((v, "nex
1d5d0 74 20 72 6f 77 20 6f 66 20 63 6f 2d 72 6f 75 74  t row of co-rout
1d5e0 69 6e 65 20 25 73 22 2c 20 70 54 61 62 49 74 65  ine %s", pTabIte
1d5f0 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
1d600 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1d610 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
1d620 2c 20 72 65 67 59 69 65 6c 64 2b 31 2c 20 61 64  , regYield+1, ad
1d630 64 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76  drBrk);.    pLev
1d640 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f  el->op = OP_Goto
1d650 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64  ;.  }else..#ifnd
1d660 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1d670 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
1d680 28 20 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  (  (pLoop->wsFla
1d690 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
1d6a0 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
1d6b0 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 54     /* Case 1:  T
1d6c0 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 76 69  he table is a vi
1d6d0 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73  rtual-table.  Us
1d6e0 65 20 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e  e the VFilter an
1d6f0 64 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20  d VNext.    **  
1d700 20 20 20 20 20 20 20 20 74 6f 20 61 63 63 65 73          to acces
1d710 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20  s the data..    
1d720 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b  */.    int iReg;
1d730 20 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66     /* P3 Value f
1d740 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f  or OP_VFilter */
1d750 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 6f 74  .    int addrNot
1d760 46 6f 75 6e 64 3b 0a 20 20 20 20 69 6e 74 20 6e  Found;.    int n
1d770 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 4c 6f  Constraint = pLo
1d780 6f 70 2d 3e 6e 4c 54 65 72 6d 3b 0a 0a 20 20 20  op->nLTerm;..   
1d790 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1d7a0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
1d7b0 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65     iReg = sqlite
1d7c0 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
1d7d0 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  arse, nConstrain
1d7e0 74 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 4e 6f  t+2);.    addrNo
1d7f0 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d  tFound = pLevel-
1d800 3e 61 64 64 72 42 72 6b 3b 0a 20 20 20 20 66 6f  >addrBrk;.    fo
1d810 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72  r(j=0; j<nConstr
1d820 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  aint; j++){.    
1d830 20 20 69 6e 74 20 69 54 61 72 67 65 74 20 3d 20    int iTarget = 
1d840 69 52 65 67 2b 6a 2b 32 3b 0a 20 20 20 20 20 20  iReg+j+2;.      
1d850 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61  pTerm = pLoop->a
1d860 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20  LTerm[j];.      
1d870 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63  if( pTerm==0 ) c
1d880 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
1d890 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
1d8a0 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20  tor & WO_IN ){. 
1d8b0 20 20 20 20 20 20 20 63 6f 64 65 45 71 75 61 6c         codeEqual
1d8c0 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ityTerm(pParse, 
1d8d0 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a  pTerm, pLevel, j
1d8e0 2c 20 62 52 65 76 2c 20 69 54 61 72 67 65 74 29  , bRev, iTarget)
1d8f0 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 4e 6f  ;.        addrNo
1d900 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d  tFound = pLevel-
1d910 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 20 20  >addrNxt;.      
1d920 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1d930 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1d940 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45  Parse, pTerm->pE
1d950 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61  xpr->pRight, iTa
1d960 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rget);.      }. 
1d970 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1d980 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d990 5f 49 6e 74 65 67 65 72 2c 20 70 4c 6f 6f 70 2d  _Integer, pLoop-
1d9a0 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
1d9b0 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  iReg);.    sqlit
1d9c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d9d0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 43 6f 6e  OP_Integer, nCon
1d9e0 73 74 72 61 69 6e 74 2c 20 69 52 65 67 2b 31 29  straint, iReg+1)
1d9f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1da00 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46  eAddOp4(v, OP_VF
1da10 69 6c 74 65 72 2c 20 69 43 75 72 2c 20 61 64 64  ilter, iCur, add
1da20 72 4e 6f 74 46 6f 75 6e 64 2c 20 69 52 65 67 2c  rNotFound, iReg,
1da30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1da40 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e         pLoop->u.
1da50 76 74 61 62 2e 69 64 78 53 74 72 2c 0a 20 20 20  vtab.idxStr,.   
1da60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da70 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62     pLoop->u.vtab
1da80 2e 6e 65 65 64 46 72 65 65 20 3f 20 50 34 5f 4d  .needFree ? P4_M
1da90 50 52 49 4e 54 46 20 3a 20 50 34 5f 53 54 41 54  PRINTF : P4_STAT
1daa0 49 43 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  IC);.    pLoop->
1dab0 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
1dac0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  = 0;.    for(j=0
1dad0 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20  ; j<nConstraint 
1dae0 26 26 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20  && j<16; j++){. 
1daf0 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d       if( (pLoop-
1db00 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
1db10 3e 3e 6a 29 26 31 20 29 7b 0a 20 20 20 20 20 20  >>j)&1 ){.      
1db20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
1db30 65 76 65 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54  evel, pLoop->aLT
1db40 65 72 6d 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d  erm[j]);.      }
1db50 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
1db60 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74  l->op = OP_VNext
1db70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
1db80 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65   = iCur;.    pLe
1db90 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65  vel->p2 = sqlite
1dba0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1dbb0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1dbc0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
1dbd0 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e  (pParse, iReg, n
1dbe0 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20  Constraint+2);. 
1dbf0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1dc00 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
1dc10 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
1dc20 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1dc30 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
1dc40 0a 0a 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e  ..  if( (pLoop->
1dc50 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1dc60 49 50 4b 29 21 3d 30 0a 20 20 20 26 26 20 28 70  IPK)!=0.   && (p
1dc70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1dc80 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e  (WHERE_COLUMN_IN
1dc90 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51  |WHERE_COLUMN_EQ
1dca0 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f  ))!=0.  ){.    /
1dcb0 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20 63 61  * Case 2:  We ca
1dcc0 6e 20 64 69 72 65 63 74 6c 79 20 72 65 66 65 72  n directly refer
1dcd0 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f  ence a single ro
1dce0 77 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  w using an.    *
1dcf0 2a 20 20 20 20 20 20 20 20 20 20 65 71 75 61 6c  *          equal
1dd00 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
1dd10 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
1dd20 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20   field.  Or.    
1dd30 2a 2a 20 20 20 20 20 20 20 20 20 20 77 65 20 72  **          we r
1dd40 65 66 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c  eference multipl
1dd50 65 20 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22  e rows using a "
1dd60 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a  rowid IN (...)".
1dd70 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1dd80 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 2a  construct..    *
1dd90 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  /.    assert( pL
1dda0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1ddb0 3d 3d 31 20 29 3b 0a 20 20 20 20 69 52 65 6c 65  ==1 );.    iRele
1ddc0 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33  aseReg = sqlite3
1ddd0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
1dde0 65 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  e);.    pTerm = 
1ddf0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  pLoop->aLTerm[0]
1de00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
1de10 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  erm!=0 );.    as
1de20 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78  sert( pTerm->pEx
1de30 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  pr!=0 );.    ass
1de40 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
1de50 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
1de60 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
1de70 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
1de80 20 29 3b 0a 20 20 20 20 69 52 6f 77 69 64 52 65   );.    iRowidRe
1de90 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79  g = codeEquality
1dea0 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
1deb0 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62  rm, pLevel, 0, b
1dec0 52 65 76 2c 20 69 52 65 6c 65 61 73 65 52 65 67  Rev, iReleaseReg
1ded0 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d  );.    addrNxt =
1dee0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
1def0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1df00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
1df10 73 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52  stBeInt, iRowidR
1df20 65 67 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  eg, addrNxt);.  
1df30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1df40 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69  Op3(v, OP_NotExi
1df50 73 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e  sts, iCur, addrN
1df60 78 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  xt, iRowidReg);.
1df70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1df80 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
1df90 67 65 28 70 50 61 72 73 65 2c 20 69 52 6f 77 69  ge(pParse, iRowi
1dfa0 64 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 73 71  dReg, 1);.    sq
1dfb0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
1dfc0 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72  ore(pParse, iCur
1dfd0 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29  , -1, iRowidReg)
1dfe0 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
1dff0 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20  t((v, "pk"));.  
1e000 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
1e010 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20  P_Noop;.  }else 
1e020 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
1e030 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29  ags & WHERE_IPK)
1e040 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  !=0.         && 
1e050 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1e060 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  & WHERE_COLUMN_R
1e070 41 4e 47 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20  ANGE)!=0.  ){.  
1e080 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 57 65    /* Case 3:  We
1e090 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c   have an inequal
1e0a0 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
1e0b0 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
1e0c0 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20   field..    */. 
1e0d0 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20     int testOp = 
1e0e0 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74  OP_Noop;.    int
1e0f0 20 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20   start;.    int 
1e100 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b  memEndValue = 0;
1e110 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
1e120 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a  pStart, *pEnd;..
1e130 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
1e140 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
1e150 6a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72  j = 0;.    pStar
1e160 74 20 3d 20 70 45 6e 64 20 3d 20 30 3b 0a 20 20  t = pEnd = 0;.  
1e170 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
1e180 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
1e190 5f 4c 49 4d 49 54 20 29 20 70 53 74 61 72 74 20  _LIMIT ) pStart 
1e1a0 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
1e1b0 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c  j++];.    if( pL
1e1c0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1e1d0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29  HERE_TOP_LIMIT )
1e1e0 20 70 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61   pEnd = pLoop->a
1e1f0 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20  LTerm[j++];.    
1e200 61 73 73 65 72 74 28 20 70 53 74 61 72 74 21 3d  assert( pStart!=
1e210 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29 3b 0a  0 || pEnd!=0 );.
1e220 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a      if( bRev ){.
1e230 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53        pTerm = pS
1e240 74 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61  tart;.      pSta
1e250 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  rt = pEnd;.     
1e260 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20   pEnd = pTerm;. 
1e270 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74     }.    if( pSt
1e280 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70  art ){.      Exp
1e290 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
1e2a0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
1e2b0 73 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65  sion that define
1e2c0 73 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e  s the start boun
1e2d0 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  d */.      int r
1e2e0 31 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20  1, rTemp;       
1e2f0 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f   /* Registers fo
1e300 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74  r holding the st
1e310 61 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a  art boundary */.
1e320 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  .      /* The fo
1e330 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74  llowing constant
1e340 20 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65   maps TK_xx code
1e350 73 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e  s into correspon
1e360 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73  ding .      ** s
1e370 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74  eek opcodes.  It
1e380 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61   depends on a pa
1e390 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e  rticular orderin
1e3a0 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20  g of TK_xx.     
1e3b0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
1e3c0 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b  u8 aMoveOp[] = {
1e3d0 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
1e3e0 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_GT */  OP_Seek
1e3f0 47 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  Gt,.           /
1e400 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53  * TK_LE */  OP_S
1e410 65 65 6b 4c 65 2c 0a 20 20 20 20 20 20 20 20 20  eekLe,.         
1e420 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f    /* TK_LT */  O
1e430 50 5f 53 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20  P_SeekLt,.      
1e440 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f       /* TK_GE */
1e450 20 20 4f 50 5f 53 65 65 6b 47 65 0a 20 20 20 20    OP_SeekGe.    
1e460 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72    };.      asser
1e470 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b  t( TK_LE==TK_GT+
1e480 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b  1 );      /* Mak
1e490 65 20 73 75 72 65 20 74 68 65 20 6f 72 64 65 72  e sure the order
1e4a0 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ing.. */.      a
1e4b0 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b  ssert( TK_LT==TK
1e4c0 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+2 );      /*
1e4d0 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f    ... of the TK_
1e4e0 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a  xx values... */.
1e4f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1e500 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20  _GE==TK_GT+3 ); 
1e510 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20       /*  ... is 
1e520 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20  correcct. */..  
1e530 20 20 20 20 61 73 73 65 72 74 28 20 28 70 53 74      assert( (pSt
1e540 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  art->wtFlags & T
1e550 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b  ERM_VNULL)==0 );
1e560 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e570 20 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73   pStart->wtFlags
1e580 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1e590 29 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53  );.      pX = pS
1e5a0 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20  tart->pExpr;.   
1e5b0 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30     assert( pX!=0
1e5c0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1e5d0 73 65 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74  se( pStart->left
1e5e0 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20  Cursor!=iCur ); 
1e5f0 2f 2a 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f  /* transitive co
1e600 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20  nstraints */.   
1e610 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1e620 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1e630 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20  se, pX->pRight, 
1e640 26 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73  &rTemp);.      s
1e650 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1e660 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e  (v, aMoveOp[pX->
1e670 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c  op-TK_GT], iCur,
1e680 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20   addrBrk, r1);. 
1e690 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1e6a0 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
1e6b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1e6c0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1e6d0 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29  e(pParse, r1, 1)
1e6e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
1e6f0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1e700 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20  arse, rTemp);.  
1e710 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
1e720 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b  pLevel, pStart);
1e730 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e740 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e750 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50  Op2(v, bRev ? OP
1e760 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e  _Last : OP_Rewin
1e770 64 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  d, iCur, addrBrk
1e780 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1e790 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45   pEnd ){.      E
1e7a0 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70  xpr *pX;.      p
1e7b0 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b  X = pEnd->pExpr;
1e7c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e7d0 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  X!=0 );.      as
1e7e0 73 65 72 74 28 20 28 70 45 6e 64 2d 3e 77 74 46  sert( (pEnd->wtF
1e7f0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
1e800 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  L)==0 );.      t
1e810 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 6c  estcase( pEnd->l
1e820 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20  eftCursor!=iCur 
1e830 29 3b 20 2f 2a 20 54 72 61 6e 73 69 74 69 76 65  ); /* Transitive
1e840 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
1e850 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e860 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  pEnd->wtFlags & 
1e870 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
1e880 20 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75        memEndValu
1e890 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  e = ++pParse->nM
1e8a0 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
1e8b0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1e8c0 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65  , pX->pRight, me
1e8d0 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20  mEndValue);.    
1e8e0 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b    if( pX->op==TK
1e8f0 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  _LT || pX->op==T
1e900 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20  K_GT ){.        
1e910 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20  testOp = bRev ? 
1e920 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20  OP_Le : OP_Ge;. 
1e930 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e940 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65      testOp = bRe
1e950 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47  v ? OP_Lt : OP_G
1e960 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1e970 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
1e980 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20  vel, pEnd);.    
1e990 7d 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73 71  }.    start = sq
1e9a0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1e9b0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65  Addr(v);.    pLe
1e9c0 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f  vel->op = bRev ?
1e9d0 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65   OP_Prev : OP_Ne
1e9e0 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  xt;.    pLevel->
1e9f0 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  p1 = iCur;.    p
1ea00 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72  Level->p2 = star
1ea10 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
1ea20 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a  Level->p5==0 );.
1ea30 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d      if( testOp!=
1ea40 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
1ea50 20 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65   iRowidReg = iRe
1ea60 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74  leaseReg = sqlit
1ea70 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
1ea80 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1ea90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1eaa0 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c   OP_Rowid, iCur,
1eab0 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1eac0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1ead0 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
1eae0 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69   iCur, -1, iRowi
1eaf0 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
1eb00 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1eb10 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64  , testOp, memEnd
1eb20 56 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20  Value, addrBrk, 
1eb30 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1eb40 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1eb50 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
1eb60 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51  AFF_NUMERIC | SQ
1eb70 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1eb80 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
1eb90 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1eba0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
1ebb0 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  ED ){.    /* Cas
1ebc0 65 20 34 3a 20 41 20 73 63 61 6e 20 75 73 69 6e  e 4: A scan usin
1ebd0 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20  g an index..    
1ebe0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1ebf0 20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75    The WHERE clau
1ec00 73 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a  se may contain z
1ec10 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61  ero or more equa
1ec20 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20  lity .    **    
1ec30 20 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22       terms ("=="
1ec40 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f   or "IN" operato
1ec50 72 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74  rs) that refer t
1ec60 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20  o the N.    **  
1ec70 20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74         left-most
1ec80 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
1ec90 69 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c  index. It may al
1eca0 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a  so contain.    *
1ecb0 2a 20 20 20 20 20 20 20 20 20 69 6e 65 71 75 61  *         inequa
1ecc0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1ecd0 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d   (>, <, >= or <=
1ece0 29 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64  ) on the indexed
1ecf0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ed00 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65  column that imme
1ed10 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20  diately follows 
1ed20 74 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73  the N equalities
1ed30 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20  . Only .    **  
1ed40 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
1ed50 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e  -most column can
1ed60 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   be an inequalit
1ed70 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73  y - the rest mus
1ed80 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
1ed90 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e   use the "==" an
1eda0 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  d "IN" operators
1edb0 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
1edc0 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20  f the .    **   
1edd0 20 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f        index is o
1ede0 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20  n (x,y,z), then 
1edf0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c  the following cl
1ee00 61 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20  auses are all . 
1ee10 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70     **         op
1ee20 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a  timized:.    **.
1ee30 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1ee40 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20    x=5.    **    
1ee50 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
1ee60 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y=10.    **     
1ee70 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
1ee80 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  <10.    **      
1ee90 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e        x=5 AND y>
1eea0 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a  5 AND y<10.    *
1eeb0 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1eec0 20 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d   AND y=5 AND z<=
1eed0 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  10.    **.    **
1eee0 20 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31           The z<1
1eef0 30 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  0 term of the fo
1ef00 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62  llowing cannot b
1ef10 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20  e used, only.   
1ef20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20   **         the 
1ef30 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a  x=5 term:.    **
1ef40 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ef50 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a     x=5 AND z<10.
1ef60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1ef70 20 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a        N may be z
1ef80 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65  ero if there are
1ef90 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
1efa0 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20  traints..    ** 
1efb0 20 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65          If there
1efc0 20 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69   are no inequali
1efd0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
1efe0 74 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20  then N is at.   
1eff0 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73   **         leas
1f000 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  t one..    **.  
1f010 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69    **         Thi
1f020 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75  s case is also u
1f030 73 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61  sed when there a
1f040 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  re no WHERE clau
1f050 73 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  se.    **       
1f060 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75    constraints bu
1f070 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65  t an index is se
1f080 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69  lected anyway, i
1f090 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20  n order.    **  
1f0a0 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20         to force 
1f0b0 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72  the output order
1f0c0 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61   to conform to a
1f0d0 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20  n ORDER BY..    
1f0e0 2a 2f 20 20 0a 20 20 20 20 73 74 61 74 69 63 20  */  .    static 
1f0f0 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f  const u8 aStartO
1f100 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c  p[] = {.      0,
1f110 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20  .      0,.      
1f120 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20  OP_Rewind,      
1f130 20 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61       /* 2: (!sta
1f140 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  rt_constraints &
1f150 26 20 73 74 61 72 74 45 71 20 26 26 20 20 21 62  & startEq &&  !b
1f160 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
1f170 5f 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20  _Last,          
1f180 20 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74     /* 3: (!start
1f190 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1f1a0 73 74 61 72 74 45 71 20 26 26 20 20 20 62 52 65  startEq &&   bRe
1f1b0 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
1f1c0 65 65 6b 47 74 2c 20 20 20 20 20 20 20 20 20 20  eekGt,          
1f1d0 20 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f   /* 4: (start_co
1f1e0 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73  nstraints  && !s
1f1f0 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29  tartEq && !bRev)
1f200 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
1f210 6b 4c 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kLt,           /
1f220 2a 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 5: (start_cons
1f230 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61  traints  && !sta
1f240 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a  rtEq &&  bRev) *
1f250 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47  /.      OP_SeekG
1f260 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
1f270 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  6: (start_constr
1f280 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74  aints  &&  start
1f290 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a  Eq && !bRev) */.
1f2a0 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 65 20        OP_SeekLe 
1f2b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a             /* 7:
1f2c0 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
1f2d0 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71  nts  &&  startEq
1f2e0 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20   &&  bRev) */.  
1f2f0 20 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20    };.    static 
1f300 63 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b  const u8 aEndOp[
1f310 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e  ] = {.      OP_N
1f320 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  oop,            
1f330 20 2f 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e   /* 0: (!end_con
1f340 73 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20  straints) */.   
1f350 20 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20     OP_IdxGE,    
1f360 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65          /* 1: (e
1f370 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  nd_constraints &
1f380 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  & !bRev) */.    
1f390 20 20 4f 50 5f 49 64 78 4c 54 20 20 20 20 20 20    OP_IdxLT      
1f3a0 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e         /* 2: (en
1f3b0 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
1f3c0 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b   bRev) */.    };
1f3d0 0a 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  .    int nEq = p
1f3e0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
1f3f0 71 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  q;  /* Number of
1f400 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20   == or IN terms 
1f410 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4d 69 6e  */.    int isMin
1f420 51 75 65 72 79 20 3d 20 30 3b 20 20 20 20 20 20  Query = 0;      
1f430 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
1f440 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64   is an optimized
1f450 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e   SELECT min(x)..
1f460 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42   */.    int regB
1f470 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
1f480 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
1f490 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f  ister holding co
1f4a0 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20  nstraint values 
1f4b0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31 3b 20 20  */.    int r1;  
1f4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4d0 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69      /* Temp regi
1f4e0 73 74 65 72 20 2a 2f 0a 20 20 20 20 57 68 65 72  ster */.    Wher
1f4f0 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 53 74 61  eTerm *pRangeSta
1f500 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71  rt = 0;  /* Ineq
1f510 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1f520 74 20 61 74 20 72 61 6e 67 65 20 73 74 61 72 74  t at range start
1f530 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
1f540 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30  m *pRangeEnd = 0
1f550 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69  ;    /* Inequali
1f560 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74  ty constraint at
1f570 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20   range end */.  
1f580 20 20 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20    int startEq;  
1f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f5a0 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20  * True if range 
1f5b0 73 74 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e  start uses ==, >
1f5c0 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69  = or <= */.    i
1f5d0 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20  nt endEq;       
1f5e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f5f0 72 75 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64  rue if range end
1f600 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20   uses ==, >= or 
1f610 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74  <= */.    int st
1f620 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b  art_constraints;
1f630 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
1f640 6f 66 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73  of range is cons
1f650 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69  trained */.    i
1f660 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  nt nConstraint; 
1f670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1f680 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61  umber of constra
1f690 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  int terms */.   
1f6a0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
1f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f6c0 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69   The index we wi
1f6d0 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20  ll be using */. 
1f6e0 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20     int iIdxCur; 
1f6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f700 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
1f710 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
1f720 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78 74   */.    int nExt
1f730 72 61 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  raReg = 0;      
1f740 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f750 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
1f760 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20  s needed */.    
1f770 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
1f780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f790 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f  Instruction opco
1f7a0 64 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  de */.    char *
1f7b0 7a 53 74 61 72 74 41 66 66 3b 20 20 20 20 20 20  zStartAff;      
1f7c0 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
1f7d0 74 79 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20  ty for start of 
1f7e0 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
1f7f0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   */.    char *zE
1f800 6e 64 41 66 66 3b 20 20 20 20 20 20 20 20 20 20  ndAff;          
1f810 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
1f820 20 66 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e 67   for end of rang
1f830 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
1f840 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f  .    pIdx = pLoo
1f850 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
1f860 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d  x;.    iIdxCur =
1f870 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
1f880 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
1f890 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73  s loop satisfies
1f8a0 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70   a sort order (p
1f8b0 4f 72 64 65 72 42 79 29 20 72 65 71 75 65 73 74  OrderBy) request
1f8c0 20 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61   that .    ** wa
1f8d0 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
1f8e0 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70   function to imp
1f8f0 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54  lement a "SELECT
1f900 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20   min(x) ..." .  
1f910 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e    ** query, then
1f920 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
1f930 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20   only allow the 
1f940 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a  loop to run for.
1f950 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20      ** a single 
1f960 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  iteration. This 
1f970 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66  means that the f
1f980 69 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65  irst row returne
1f990 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20  d.    ** should 
1f9a0 6e 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20  not have a NULL 
1f9b0 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
1f9c0 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27  'x'. If column '
1f9d0 78 27 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65  x' is.    ** the
1f9e0 20 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72   first one after
1f9f0 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74   the nEq equalit
1fa00 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e  y constraints in
1fa10 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20   the index,.    
1fa20 2a 2a 20 74 68 69 73 20 72 65 71 75 69 72 65 73  ** this requires
1fa30 20 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61   some special ha
1fa40 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20  ndling..    */. 
1fa50 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
1fa60 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45  wctrlFlags&WHERE
1fa70 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30  _ORDERBY_MIN)!=0
1fa80 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f  .     && (pWInfo
1fa90 2d 3e 62 4f 42 53 61 74 21 3d 30 29 0a 20 20 20  ->bOBSat!=0).   
1faa0 20 20 26 26 20 28 70 49 64 78 2d 3e 6e 4b 65 79    && (pIdx->nKey
1fab0 43 6f 6c 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a  Col>nEq).    ){.
1fac0 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
1fad0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
1fae0 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20  ==1 ); */.      
1faf0 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  /* assert( pOrde
1fb00 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  rBy->a[0].pExpr-
1fb10 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e  >iColumn==pIdx->
1fb20 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b  aiColumn[nEq] );
1fb30 20 2a 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e 51   */.      isMinQ
1fb40 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  uery = 1;.      
1fb50 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
1fb60 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e     }..    /* Fin
1fb70 64 20 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79  d any inequality
1fb80 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
1fb90 73 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  s for the start 
1fba0 61 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20  and end .    ** 
1fbb0 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20  of the range. . 
1fbc0 20 20 20 2a 2f 0a 20 20 20 20 6a 20 3d 20 6e 45     */.    j = nE
1fbd0 71 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  q;.    if( pLoop
1fbe0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1fbf0 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
1fc00 20 20 20 20 20 70 52 61 6e 67 65 53 74 61 72 74       pRangeStart
1fc10 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
1fc20 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78  [j++];.      nEx
1fc30 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
1fc40 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  }.    if( pLoop-
1fc50 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1fc60 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _TOP_LIMIT ){.  
1fc70 20 20 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20      pRangeEnd = 
1fc80 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b  pLoop->aLTerm[j+
1fc90 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  +];.      nExtra
1fca0 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Reg = 1;.    }..
1fcb0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
1fcc0 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
1fcd0 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20   all constraint 
1fce0 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f  terms using == o
1fcf0 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20  r IN.    ** and 
1fd00 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73  store the values
1fd10 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20   of those terms 
1fd20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
1fd30 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
1fd40 73 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 42  starting at regB
1fd50 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1fd60 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c  regBase = codeAl
1fd70 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70  lEqualityTerms(p
1fd80 50 61 72 73 65 2c 70 4c 65 76 65 6c 2c 62 52 65  Parse,pLevel,bRe
1fd90 76 2c 6e 45 78 74 72 61 52 65 67 2c 26 7a 53 74  v,nExtraReg,&zSt
1fda0 61 72 74 41 66 66 29 3b 0a 20 20 20 20 7a 45 6e  artAff);.    zEn
1fdb0 64 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62  dAff = sqlite3Db
1fdc0 53 74 72 44 75 70 28 64 62 2c 20 7a 53 74 61 72  StrDup(db, zStar
1fdd0 74 41 66 66 29 3b 0a 20 20 20 20 61 64 64 72 4e  tAff);.    addrN
1fde0 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  xt = pLevel->add
1fdf0 72 4e 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  rNxt;..    /* If
1fe00 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
1fe10 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 73 63  reverse order sc
1fe20 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69  an on an ascendi
1fe30 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20  ng index, or.   
1fe40 20 2a 2a 20 61 20 66 6f 72 77 61 72 64 20 6f 72   ** a forward or
1fe50 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 20 64 65  der scan on a de
1fe60 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20  scending index, 
1fe70 69 6e 74 65 72 63 68 61 6e 67 65 20 74 68 65 20  interchange the 
1fe80 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 61 6e  .    ** start an
1fe90 64 20 65 6e 64 20 74 65 72 6d 73 20 28 70 52 61  d end terms (pRa
1fea0 6e 67 65 53 74 61 72 74 20 61 6e 64 20 70 52 61  ngeStart and pRa
1feb0 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a  ngeEnd)..    */.
1fec0 20 20 20 20 69 66 28 20 28 6e 45 71 3c 70 49 64      if( (nEq<pId
1fed0 78 2d 3e 6e 4b 65 79 43 6f 6c 20 26 26 20 62 52  x->nKeyCol && bR
1fee0 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74  ev==(pIdx->aSort
1fef0 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49  Order[nEq]==SQLI
1ff00 54 45 5f 53 4f 5f 41 53 43 29 29 0a 20 20 20 20  TE_SO_ASC)).    
1ff10 20 7c 7c 20 28 62 52 65 76 20 26 26 20 70 49 64   || (bRev && pId
1ff20 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 45 71 29  x->nKeyCol==nEq)
1ff30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 53 57  .    ){.      SW
1ff40 41 50 28 57 68 65 72 65 54 65 72 6d 20 2a 2c 20  AP(WhereTerm *, 
1ff50 70 52 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67  pRangeEnd, pRang
1ff60 65 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 0a 0a  eStart);.    }..
1ff70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
1ff80 61 6e 67 65 53 74 61 72 74 20 26 26 20 28 70 52  angeStart && (pR
1ff90 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72  angeStart->eOper
1ffa0 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30  ator & WO_LE)!=0
1ffb0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1ffc0 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26  ( pRangeStart &&
1ffd0 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65   (pRangeStart->e
1ffe0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45  Operator & WO_GE
1fff0 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  )!=0 );.    test
20000 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20  case( pRangeEnd 
20010 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65  && (pRangeEnd->e
20020 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45  Operator & WO_LE
20030 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  )!=0 );.    test
20040 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20  case( pRangeEnd 
20050 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65  && (pRangeEnd->e
20060 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45  Operator & WO_GE
20070 29 21 3d 30 20 29 3b 0a 20 20 20 20 73 74 61 72  )!=0 );.    star
20080 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74 61  tEq = !pRangeSta
20090 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61 72  rt || pRangeStar
200a0 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  t->eOperator & (
200b0 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20  WO_LE|WO_GE);.  
200c0 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52 61    endEq =   !pRa
200d0 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65  ngeEnd || pRange
200e0 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
200f0 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a   (WO_LE|WO_GE);.
20100 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72      start_constr
20110 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53 74  aints = pRangeSt
20120 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20  art || nEq>0;.. 
20130 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 69     /* Seek the i
20140 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20 74  ndex cursor to t
20150 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
20160 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43  range. */.    nC
20170 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b  onstraint = nEq;
20180 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 53  .    if( pRangeS
20190 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78  tart ){.      Ex
201a0 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61  pr *pRight = pRa
201b0 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72 2d  ngeStart->pExpr-
201c0 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73  >pRight;.      s
201d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
201e0 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72  Parse, pRight, r
201f0 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20  egBase+nEq);.   
20200 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 53 74     if( (pRangeSt
20210 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  art->wtFlags & T
20220 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b  ERM_VNULL)==0 ){
20230 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20240 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
20250 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65  mp(v, pRight, re
20260 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e  gBase+nEq, addrN
20270 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xt);.      }.   
20280 20 20 20 69 66 28 20 7a 53 74 61 72 74 41 66 66     if( zStartAff
20290 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
202a0 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
202b0 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a  finity(pRight, z
202c0 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 3d 3d  StartAff[nEq])==
202d0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29  SQLITE_AFF_NONE)
202e0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  {.          /* S
202f0 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69  ince the compari
20300 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72  son is to be per
20310 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63  formed with no c
20320 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20  onversions.     
20330 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20       ** applied 
20340 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c  to the operands,
20350 20 73 65 74 20 74 68 65 20 61 66 66 69 6e 69 74   set the affinit
20360 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52  y to apply to pR
20370 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20  ight to .       
20380 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46     ** SQLITE_AFF
20390 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20  _NONE.  */.     
203a0 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e       zStartAff[n
203b0 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  Eq] = SQLITE_AFF
203c0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
203d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
203e0 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
203f0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52  ffinityChange(pR
20400 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b  ight, zStartAff[
20410 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  nEq]) ){.       
20420 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71     zStartAff[nEq
20430 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
20440 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
20450 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20 6e       }  .      n
20460 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
20470 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
20480 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61  angeStart->wtFla
20490 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
204a0 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  L );.    }else i
204b0 66 28 20 69 73 4d 69 6e 51 75 65 72 79 20 29 7b  f( isMinQuery ){
204c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
204d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
204e0 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b  ull, 0, regBase+
204f0 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e  nEq);.      nCon
20500 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20  straint++;.     
20510 20 73 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20   startEq = 0;.  
20520 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72      start_constr
20530 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d  aints = 1;.    }
20540 0a 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66  .    codeApplyAf
20550 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72  finity(pParse, r
20560 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61  egBase, nConstra
20570 69 6e 74 2c 20 7a 53 74 61 72 74 41 66 66 29 3b  int, zStartAff);
20580 0a 20 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74  .    op = aStart
20590 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  Op[(start_constr
205a0 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61  aints<<2) + (sta
205b0 72 74 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d  rtEq<<1) + bRev]
205c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70  ;.    assert( op
205d0 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
205e0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69  ase( op==OP_Rewi
205f0 6e 64 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  nd );.    testca
20600 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20  se( op==OP_Last 
20610 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
20620 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29   op==OP_SeekGt )
20630 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
20640 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b  op==OP_SeekGe );
20650 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
20660 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a  p==OP_SeekLe );.
20670 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
20680 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20  ==OP_SeekLt );. 
20690 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
206a0 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69  dOp4Int(v, op, i
206b0 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c  IdxCur, addrNxt,
206c0 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74   regBase, nConst
206d0 72 61 69 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  raint);..    /* 
206e0 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65 20 66  Load the value f
206f0 6f 72 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74  or the inequalit
20700 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
20710 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
20720 20 20 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20     ** range (if 
20730 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  any)..    */.   
20740 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e   nConstraint = n
20750 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e  Eq;.    if( pRan
20760 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45  geEnd ){.      E
20770 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52  xpr *pRight = pR
20780 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e  angeEnd->pExpr->
20790 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71  pRight;.      sq
207a0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
207b0 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  move(pParse, reg
207c0 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20  Base+nEq, 1);.  
207d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
207e0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
207f0 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29  ht, regBase+nEq)
20800 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61  ;.      if( (pRa
20810 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20  ngeEnd->wtFlags 
20820 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
20830 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20840 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c  te3ExprCodeIsNul
20850 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c  lJump(v, pRight,
20860 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64   regBase+nEq, ad
20870 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  drNxt);.      }.
20880 20 20 20 20 20 20 69 66 28 20 7a 45 6e 64 41 66        if( zEndAf
20890 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  f ){.        if(
208a0 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
208b0 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20  ffinity(pRight, 
208c0 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 3d 3d 53  zEndAff[nEq])==S
208d0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b  QLITE_AFF_NONE){
208e0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  .          /* Si
208f0 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  nce the comparis
20900 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72 66  on is to be perf
20910 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f  ormed with no co
20920 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20  nversions.      
20930 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74      ** applied t
20940 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20  o the operands, 
20950 73 65 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  set the affinity
20960 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69   to apply to pRi
20970 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20  ght to .        
20980 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    ** SQLITE_AFF_
20990 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20  NONE.  */.      
209a0 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d      zEndAff[nEq]
209b0 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
209c0 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
209d0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
209e0 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
209f0 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68  nityChange(pRigh
20a00 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29  t, zEndAff[nEq])
20a10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 45   ){.          zE
20a20 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c  ndAff[nEq] = SQL
20a30 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
20a40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
20a50 20 0a 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c   .      codeAppl
20a60 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  yAffinity(pParse
20a70 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 71 2b 31  , regBase, nEq+1
20a80 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 20 20 20 20  , zEndAff);.    
20a90 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
20aa0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20ab0 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c   pRangeEnd->wtFl
20ac0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
20ad0 41 4c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  AL );.    }.    
20ae0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
20af0 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  , zStartAff);.  
20b00 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
20b10 64 62 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 0a 20  db, zEndAff);.. 
20b20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
20b30 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20   loop body */.  
20b40 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
20b50 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
20b60 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f  tAddr(v);..    /
20b70 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69  * Check if the i
20b80 6e 64 65 78 20 63 75 72 73 6f 72 20 69 73 20 70  ndex cursor is p
20b90 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
20ba0 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20  he range. */.   
20bb0 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28 70 52   op = aEndOp[(pR
20bc0 61 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71 29 20  angeEnd || nEq) 
20bd0 2a 20 28 31 20 2b 20 62 52 65 76 29 5d 3b 0a 20  * (1 + bRev)];. 
20be0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
20bf0 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20 20  =OP_Noop );.    
20c00 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
20c10 5f 49 64 78 47 45 20 29 3b 0a 20 20 20 20 74 65  _IdxGE );.    te
20c20 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49  stcase( op==OP_I
20c30 64 78 4c 54 20 29 3b 0a 20 20 20 20 69 66 28 20  dxLT );.    if( 
20c40 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  op!=OP_Noop ){. 
20c50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20c60 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c  AddOp4Int(v, op,
20c70 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78   iIdxCur, addrNx
20c80 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  t, regBase, nCon
20c90 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20  straint);.      
20ca0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
20cb0 65 50 35 28 76 2c 20 65 6e 64 45 71 21 3d 62 52  eP5(v, endEq!=bR
20cc0 65 76 20 3f 31 3a 30 29 3b 0a 20 20 20 20 7d 0a  ev ?1:0);.    }.
20cd0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
20ce0 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20   are inequality 
20cf0 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 63 68 65  constraints, che
20d00 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
20d10 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  e.    ** of the 
20d20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61  table column tha
20d30 74 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79  t the inequality
20d40 20 63 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f   contrains is no
20d50 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49  t NULL..    ** I
20d60 66 20 69 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f  f it is, jump to
20d70 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   the next iterat
20d80 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ion of the loop.
20d90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 31 20 3d  .    */.    r1 =
20da0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
20db0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
20dc0 74 65 73 74 63 61 73 65 28 20 70 4c 6f 6f 70 2d  testcase( pLoop-
20dd0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
20de0 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20 20  _BTM_LIMIT );.  
20df0 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 6f 6f    testcase( pLoo
20e00 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
20e10 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a  RE_TOP_LIMIT );.
20e20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
20e30 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
20e40 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45  _BTM_LIMIT|WHERE
20e50 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 20  _TOP_LIMIT))!=0 
20e60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20e70 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
20e80 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72  _Column, iIdxCur
20e90 2c 20 6e 45 71 2c 20 72 31 29 3b 0a 20 20 20 20  , nEq, r1);.    
20ea0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20eb0 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
20ec0 2c 20 72 31 2c 20 61 64 64 72 43 6f 6e 74 29 3b  , r1, addrCont);
20ed0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
20ee0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
20ef0 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 0a 20  (pParse, r1);.. 
20f00 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74     /* Seek the t
20f10 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20  able cursor, if 
20f20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20  required */.    
20f30 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
20f40 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29  el, pRangeStart)
20f50 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72  ;.    disableTer
20f60 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65  m(pLevel, pRange
20f70 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 6f 6d  End);.    if( om
20f80 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  itTable ){.     
20f90 20 2f 2a 20 70 49 64 78 20 69 73 20 61 20 63 6f   /* pIdx is a co
20fa0 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 4e  vering index.  N
20fb0 6f 20 6e 65 65 64 20 74 6f 20 61 63 63 65 73 73  o need to access
20fc0 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
20fd0 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   */.    }else if
20fe0 28 20 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d  ( HasRowid(pIdx-
20ff0 3e 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20  >pTable) ){.    
21000 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52    iRowidReg = iR
21010 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69  eleaseReg = sqli
21020 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
21030 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
21040 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21050 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69  , OP_IdxRowid, i
21060 49 64 78 43 75 72 2c 20 69 52 6f 77 69 64 52 65  IdxCur, iRowidRe
21070 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
21080 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
21090 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31  pParse, iCur, -1
210a0 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
210b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
210c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b  ddOp2(v, OP_Seek
210d0 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65  , iCur, iRowidRe
210e0 67 29 3b 20 20 2f 2a 20 44 65 66 65 72 72 65 64  g);  /* Deferred
210f0 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d 65 6c   seek */.    }el
21100 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
21110 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72  *pPk = sqlite3Pr
21120 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
21130 64 78 2d 3e 70 54 61 62 6c 65 29 3b 0a 20 20 20  dx->pTable);.   
21140 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 73     iRowidReg = s
21150 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
21160 67 65 28 70 50 61 72 73 65 2c 20 70 50 6b 2d 3e  ge(pParse, pPk->
21170 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20  nKeyCol);.      
21180 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e  for(j=0; j<pPk->
21190 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  nKeyCol; j++){. 
211a0 20 20 20 20 20 20 20 6b 20 3d 20 73 71 6c 69 74         k = sqlit
211b0 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
211c0 70 49 64 78 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c  pIdx, pPk->aiCol
211d0 75 6d 6e 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20  umn[j]);.       
211e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
211f0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
21200 20 69 49 64 78 43 75 72 2c 20 6b 2c 20 69 52 6f   iIdxCur, k, iRo
21210 77 69 64 52 65 67 2b 6a 29 3b 0a 20 20 20 20 20  widReg+j);.     
21220 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
21230 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
21240 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 43 75 72 2c  _NotFound, iCur,
21250 20 61 64 64 72 43 6f 6e 74 2c 20 69 52 6f 77 69   addrCont, iRowi
21260 64 52 65 67 2c 20 0a 20 20 20 20 20 20 20 20 20  dReg, .         
21270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
21280 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
21290 28 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 2c 20  (pPk->nKeyCol), 
212a0 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 7d  P4_INT32);.    }
212b0 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20  ..    /* Record 
212c0 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
212d0 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  used to terminat
212e0 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61  e the loop. Disa
212f0 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52  ble .    ** WHER
21300 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d  E clause terms m
21310 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79  ade redundant by
21320 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65   the index range
21330 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20   scan..    */.  
21340 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
21350 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
21360 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  ROW ){.      pLe
21370 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f  vel->op = OP_Noo
21380 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  p;.    }else if(
21390 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70   bRev ){.      p
213a0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50  Level->op = OP_P
213b0 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rev;.    }else{.
213c0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
213d0 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   = OP_Next;.    
213e0 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  }.    pLevel->p1
213f0 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20   = iIdxCur;.    
21400 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
21410 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53  ags & WHERE_CONS
21420 54 52 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20 20  TRAINT)==0 ){.  
21430 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d      pLevel->p5 =
21440 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
21450 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
21460 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21470 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65     assert( pLeve
21480 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20  l->p5==0 );.    
21490 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64  }.  }else..#ifnd
214a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ef SQLITE_OMIT_O
214b0 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  R_OPTIMIZATION. 
214c0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
214d0 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
214e0 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43  I_OR ){.    /* C
214f0 61 73 65 20 35 3a 20 20 54 77 6f 20 6f 72 20 6d  ase 5:  Two or m
21500 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79 20 69  ore separately i
21510 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e  ndexed terms con
21520 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20  nected by OR.   
21530 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70   **.    ** Examp
21540 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
21550 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
21560 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20   t1(a,b,c,d);.  
21570 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e    **   CREATE IN
21580 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b  DEX i1 ON t1(a);
21590 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
215a0 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28   INDEX i2 ON t1(
215b0 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  b);.    **   CRE
215c0 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20  ATE INDEX i3 ON 
215d0 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  t1(c);.    **.  
215e0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20    **   SELECT * 
215f0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
21600 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31  5 OR b=7 OR (c=1
21610 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20  1 AND d=13).    
21620 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65  **.    ** In the
21630 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20   example, there 
21640 61 72 65 20 74 68 72 65 65 20 69 6e 64 65 78 65  are three indexe
21650 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  d terms connecte
21660 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20  d by OR..    ** 
21670 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c  The top of the l
21680 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74  oop looks like t
21690 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  his:.    **.    
216a0 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c  **          Null
216b0 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
216c0 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74          # Zero t
216d0 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67  he rowset in reg
216e0 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   1.    **.    **
216f0 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20   Then, for each 
21700 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74 68  indexed term, th
21710 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65  e following. The
21720 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20   arguments to.  
21730 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74 20    ** RowSetTest 
21740 61 72 65 20 73 75 63 68 20 74 68 61 74 20 74 68  are such that th
21750 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63  e rowid of the c
21760 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69 6e  urrent row is in
21770 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e  serted.    ** in
21780 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20 49  to the RowSet. I
21790 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
217a0 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c  present, control
217b0 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20 2a   skips the.    *
217c0 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20 61  * Gosub opcode a
217d0 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67 68  nd jumps straigh
217e0 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65  t to the code ge
217f0 6e 65 72 61 74 65 64 20 62 79 20 57 68 65 72 65  nerated by Where
21800 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  End()..    **.  
21810 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69    **        sqli
21820 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c 74  te3WhereBegin(<t
21830 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20  erm>).    **    
21840 20 20 20 20 20 20 52 6f 77 53 65 74 54 65 73 74        RowSetTest
21850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21860 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69 64    # Insert rowid
21870 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20 20   into rowset.   
21880 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 73   **          Gos
21890 75 62 20 20 20 20 20 20 32 20 41 0a 20 20 20 20  ub      2 A.    
218a0 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  **        sqlite
218b0 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20 20  3WhereEnd().    
218c0 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77  **.    ** Follow
218d0 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20 63  ing the above, c
218e0 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ode to terminate
218f0 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c   the loop. Label
21900 20 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a 20   A, the target. 
21910 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73     ** of the Gos
21920 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20  ub above, jumps 
21930 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  to the instructi
21940 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72 20 74  on right after t
21950 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a  he Goto..    **.
21960 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
21970 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20  Null       1    
21980 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65              # Ze
21990 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e  ro the rowset in
219a0 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20 20   reg 1.    **   
219b0 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20         Goto     
219c0 20 20 42 20 20 20 20 20 20 20 20 20 20 20 20 20    B             
219d0 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69 73     # The loop is
219e0 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a   finished..    *
219f0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41  *.    **       A
21a00 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20  : <loop body>   
21a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
21a20 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68 61  Return data, wha
21a30 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20  tever..    **.  
21a40 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 65    **          Re
21a50 74 75 72 6e 20 20 20 20 20 32 20 20 20 20 20 20  turn     2      
21a60 20 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d 70            # Jump
21a70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f 73   back to the Gos
21a80 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ub.    **.    **
21a90 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65 72         B: <after
21aa0 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a   the loop>.    *
21ab0 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68 65  *.    */.    Whe
21ac0 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b  reClause *pOrWc;
21ad0 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c      /* The OR-cl
21ae0 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20  ause broken out 
21af0 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f  into subterms */
21b00 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4f  .    SrcList *pO
21b10 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 53  rTab;       /* S
21b20 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20 6c  hortened table l
21b30 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73 65  ist or OR-clause
21b40 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20   generation */. 
21b50 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 20 3d     Index *pCov =
21b60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
21b70 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f 76  /* Potential cov
21b80 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f 72 20  ering index (or 
21b90 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e 74  NULL) */.    int
21ba0 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61 72 73   iCovCur = pPars
21bb0 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20 43  e->nTab++;  /* C
21bc0 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 69  ursor used for i
21bd0 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66 20 61  ndex scans (if a
21be0 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20  ny) */..    int 
21bf0 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
21c00 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20  arse->nMem;     
21c10 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
21c20 72 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f 47  r used with OP_G
21c30 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20  osub */.    int 
21c40 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20 20  regRowset = 0;  
21c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c60 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
21c70 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a  r for RowSet obj
21c80 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ect */.    int r
21c90 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20  egRowid = 0;    
21ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cb0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
21cc0 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a   holding rowid *
21cd0 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42  /.    int iLoopB
21ce0 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ody = sqlite3Vdb
21cf0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
21d00 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70  /* Start of loop
21d10 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74   body */.    int
21d20 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20 20   iRetInit;      
21d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d40 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
21d50 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20 69  s of regReturn i
21d60 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75  nit */.    int u
21d70 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 30  ntestedTerms = 0
21d80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
21d90 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20   Some terms not 
21da0 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74 65  completely teste
21db0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  d */.    int ii;
21dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
21de0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
21df0 20 20 20 45 78 70 72 20 2a 70 41 6e 64 45 78 70     Expr *pAndExp
21e00 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
21e10 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e 20        /* An ".. 
21e20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70 72 65  AND (...)" expre
21e30 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a 20 20 20  ssion */.   .   
21e40 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e   pTerm = pLoop->
21e50 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61  aLTerm[0];.    a
21e60 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
21e70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
21e80 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
21e90 26 20 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61  & WO_OR );.    a
21ea0 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77  ssert( (pTerm->w
21eb0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  tFlags & TERM_OR
21ec0 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20  INFO)!=0 );.    
21ed0 70 4f 72 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWc = &pTerm->
21ee0 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
21ef0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
21f00 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20 70  OP_Return;.    p
21f10 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52  Level->p1 = regR
21f20 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53  eturn;..    /* S
21f30 65 74 20 75 70 20 61 20 6e 65 77 20 53 72 63 4c  et up a new SrcL
21f40 69 73 74 20 69 6e 20 70 4f 72 54 61 62 20 63 6f  ist in pOrTab co
21f50 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
21f60 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64  le being scanned
21f70 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
21f80 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b 30 5d  loop in the a[0]
21f90 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f   slot and all no
21fa0 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 69 6e  tReady tables in
21fb0 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20   a[1..] slots.. 
21fc0 20 20 20 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d     ** This becom
21fd0 65 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69  es the SrcList i
21fe0 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  n the recursive 
21ff0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
22000 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 20  hereBegin()..   
22010 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 49 6e   */.    if( pWIn
22020 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a  fo->nLevel>1 ){.
22030 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65        int nNotRe
22040 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
22050 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
22060 65 72 20 6f 66 20 6e 6f 74 52 65 61 64 79 20 74  er of notReady t
22070 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 73  ables */.      s
22080 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
22090 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20 20 20  em *origSrc;    
220a0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73   /* Original lis
220b0 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
220c0 20 20 20 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d       nNotReady =
220d0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20   pWInfo->nLevel 
220e0 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20  - iLevel - 1;.  
220f0 20 20 20 20 70 4f 72 54 61 62 20 3d 20 73 71 6c      pOrTab = sql
22100 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61  ite3StackAllocRa
22110 77 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  w(db,.          
22120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22130 20 20 73 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62    sizeof(*pOrTab
22140 29 2b 20 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a  )+ nNotReady*siz
22150 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d  eof(pOrTab->a[0]
22160 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  ));.      if( pO
22170 72 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  rTab==0 ) return
22180 20 6e 6f 74 52 65 61 64 79 3b 0a 20 20 20 20 20   notReady;.     
22190 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20   pOrTab->nAlloc 
221a0 3d 20 28 75 38 29 28 6e 4e 6f 74 52 65 61 64 79  = (u8)(nNotReady
221b0 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72   + 1);.      pOr
221c0 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54  Tab->nSrc = pOrT
221d0 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20  ab->nAlloc;.    
221e0 20 20 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d    memcpy(pOrTab-
221f0 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69  >a, pTabItem, si
22200 7a 65 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29  zeof(*pTabItem))
22210 3b 0a 20 20 20 20 20 20 6f 72 69 67 53 72 63 20  ;.      origSrc 
22220 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
22230 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72  st->a;.      for
22240 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61  (k=1; k<=nNotRea
22250 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  dy; k++){.      
22260 20 20 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62    memcpy(&pOrTab
22270 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63  ->a[k], &origSrc
22280 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d  [pLevel[k].iFrom
22290 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62  ], sizeof(pOrTab
222a0 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20  ->a[k]));.      
222b0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
222c0 20 20 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e     pOrTab = pWIn
222d0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
222e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74    }..    /* Init
222f0 69 61 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65  ialize the rowse
22300 74 20 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f  t register to co
22310 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53  ntain NULL. An S
22320 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20  QL NULL is .    
22330 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  ** equivalent to
22340 20 61 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74   an empty rowset
22350 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
22360 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  Also initialize 
22370 72 65 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e  regReturn to con
22380 74 61 69 6e 20 74 68 65 20 61 64 64 72 65 73 73  tain the address
22390 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75 63 74   of the instruct
223a0 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65  ion .    ** imme
223b0 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
223c0 67 20 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20  g the OP_Return 
223d0 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
223e0 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a   the loop. This.
223f0 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
22400 65 64 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63  ed in a few obsc
22410 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61  ure LEFT JOIN ca
22420 73 65 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f  ses where contro
22430 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f  l jumps.    ** o
22440 76 65 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74  ver the top of t
22450 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65  he loop into the
22460 20 62 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20   body of it. In 
22470 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 20  this case the . 
22480 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65     ** correct re
22490 73 70 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65  sponse for the e
224a0 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20  nd-of-loop code 
224b0 28 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20  (the OP_Return) 
224c0 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61  is to .    ** fa
224d0 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
224e0 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
224f0 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f  on, just as an O
22500 50 5f 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20  P_Next does if. 
22510 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20     ** called on 
22520 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  an uninitialized
22530 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a   cursor..    */.
22540 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d      if( (pWInfo-
22550 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
22560 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f  ERE_DUPLICATES_O
22570 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  K)==0 ){.      r
22580 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61  egRowset = ++pPa
22590 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
225a0 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50   regRowid = ++pP
225b0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
225c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
225d0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
225e0 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a 20  0, regRowset);. 
225f0 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49 6e 69     }.    iRetIni
22600 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
22610 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
22620 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74 75 72  ger, 0, regRetur
22630 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  n);..    /* If t
22640 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52  he original WHER
22650 45 20 63 6c 61 75 73 65 20 69 73 20 7a 20 6f 66  E clause is z of
22660 20 74 68 65 20 66 6f 72 6d 3a 20 20 28 78 31 20   the form:  (x1 
22670 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41 4e  OR x2 OR ...) AN
22680 44 20 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20  D y.    ** Then 
22690 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 78  for every term x
226a0 4e 2c 20 65 76 61 6c 75 61 74 65 20 61 73 20 74  N, evaluate as t
226b0 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
226c0 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20 2a  : xN AND z.    *
226d0 2a 20 54 68 61 74 20 77 61 79 2c 20 74 65 72 6d  * That way, term
226e0 73 20 69 6e 20 79 20 74 68 61 74 20 61 72 65 20  s in y that are 
226f0 66 61 63 74 6f 72 65 64 20 69 6e 74 6f 20 74 68  factored into th
22700 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77 69  e disjunction wi
22710 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 69 63  ll.    ** be pic
22720 6b 65 64 20 75 70 20 62 79 20 74 68 65 20 72 65  ked up by the re
22730 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f  cursive calls to
22740 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
22750 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20 20  in() below..    
22760 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74 75 61 6c  **.    ** Actual
22770 6c 79 2c 20 65 61 63 68 20 73 75 62 65 78 70 72  ly, each subexpr
22780 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65 72  ession is conver
22790 74 65 64 20 74 6f 20 22 78 4e 20 41 4e 44 20 77  ted to "xN AND w
227a0 22 20 77 68 65 72 65 20 77 20 69 73 0a 20 20 20  " where w is.   
227b0 20 2a 2a 20 74 68 65 20 22 69 6e 74 65 72 65 73   ** the "interes
227c0 74 69 6e 67 22 20 74 65 72 6d 73 20 6f 66 20 7a  ting" terms of z
227d0 20 2d 20 74 65 72 6d 73 20 74 68 61 74 20 64 69   - terms that di
227e0 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20  d not originate 
227f0 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 4e  in the.    ** ON
22800 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
22810 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   of a LEFT JOIN,
22820 20 61 6e 64 20 74 65 72 6d 73 20 74 68 61 74 20   and terms that 
22830 61 72 65 20 75 73 61 62 6c 65 20 61 73 20 0a 20  are usable as . 
22840 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a 20     ** indices.. 
22850 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
22860 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61  s optimization a
22870 6c 73 6f 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73  lso only applies
22880 20 69 66 20 74 68 65 20 28 78 31 20 4f 52 20 78   if the (x1 OR x
22890 32 20 4f 52 20 2e 2e 2e 29 20 74 65 72 6d 0a 20  2 OR ...) term. 
228a0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e     ** is not con
228b0 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 4f 4e  tained in the ON
228c0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46   clause of a LEF
228d0 54 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20 53  T JOIN..    ** S
228e0 65 65 20 74 69 63 6b 65 74 20 68 74 74 70 3a 2f  ee ticket http:/
228f0 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f  /www.sqlite.org/
22900 73 72 63 2f 69 6e 66 6f 2f 66 32 33 36 39 33 30  src/info/f236930
22910 34 65 34 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  4e4.    */.    i
22920 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31 20  f( pWC->nTerm>1 
22930 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 65  ){.      int iTe
22940 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 54  rm;.      for(iT
22950 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57 43  erm=0; iTerm<pWC
22960 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b  ->nTerm; iTerm++
22970 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
22980 2a 70 45 78 70 72 20 3d 20 70 57 43 2d 3e 61 5b  *pExpr = pWC->a[
22990 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20  iTerm].pExpr;.  
229a0 20 20 20 20 20 20 69 66 28 20 26 70 57 43 2d 3e        if( &pWC->
229b0 61 5b 69 54 65 72 6d 5d 20 3d 3d 20 70 54 65 72  a[iTerm] == pTer
229c0 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  m ) continue;.  
229d0 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
229e0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
229f0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
22a00 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
22a10 20 20 69 66 28 20 70 57 43 2d 3e 61 5b 69 54 65    if( pWC->a[iTe
22a20 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 28 54  rm].wtFlags & (T
22a30 45 52 4d 5f 4f 52 49 4e 46 4f 29 20 29 20 63 6f  ERM_ORINFO) ) co
22a40 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
22a50 69 66 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72  if( (pWC->a[iTer
22a60 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m].eOperator & W
22a70 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74  O_ALL)==0 ) cont
22a80 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45  inue;.        pE
22a90 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
22aa0 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
22ab0 30 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64  0);.        pAnd
22ac0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
22ad0 70 72 41 6e 64 28 64 62 2c 20 70 41 6e 64 45 78  prAnd(db, pAndEx
22ae0 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  pr, pExpr);.    
22af0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 41    }.      if( pA
22b00 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  ndExpr ){.      
22b10 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c    pAndExpr = sql
22b20 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
22b30 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e  , TK_AND, 0, pAn
22b40 64 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  dExpr, 0);.     
22b50 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
22b60 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63  r(ii=0; ii<pOrWc
22b70 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a  ->nTerm; ii++){.
22b80 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
22b90 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57  *pOrTerm = &pOrW
22ba0 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20  c->a[ii];.      
22bb0 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
22bc0 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c  tCursor==iCur ||
22bd0 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
22be0 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d  ator & WO_AND)!=
22bf0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65  0 ){.        Whe
22c00 72 65 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66  reInfo *pSubWInf
22c10 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  o;          /* I
22c20 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f  nfo for single O
22c30 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20  R-term scan */. 
22c40 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72         Expr *pOr
22c50 45 78 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  Expr = pOrTerm->
22c60 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
22c70 66 28 20 70 41 6e 64 45 78 70 72 20 26 26 20 21  f( pAndExpr && !
22c80 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
22c90 70 4f 72 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  pOrExpr, EP_From
22ca0 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  Join) ){.       
22cb0 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65     pAndExpr->pLe
22cc0 66 74 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20  ft = pOrExpr;.  
22cd0 20 20 20 20 20 20 20 20 70 4f 72 45 78 70 72 20          pOrExpr 
22ce0 3d 20 70 41 6e 64 45 78 70 72 3b 0a 20 20 20 20  = pAndExpr;.    
22cf0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
22d00 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61   Loop through ta
22d10 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74  ble entries that
22d20 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54   match term pOrT
22d30 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  erm. */.        
22d40 70 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69  pSubWInfo = sqli
22d50 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
22d60 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f  arse, pOrTab, pO
22d70 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20  rExpr, 0, 0,.   
22d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d90 20 20 20 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f       WHERE_OMIT_
22da0 4f 50 45 4e 5f 43 4c 4f 53 45 20 7c 20 57 48 45  OPEN_CLOSE | WHE
22db0 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20  RE_AND_ONLY |.  
22dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22dd0 20 20 20 20 20 20 57 48 45 52 45 5f 46 4f 52 43        WHERE_FORC
22de0 45 5f 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f  E_TABLE | WHERE_
22df0 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 2c 20 69  ONETABLE_ONLY, i
22e00 43 6f 76 43 75 72 29 3b 0a 20 20 20 20 20 20 20  CovCur);.       
22e10 20 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e   assert( pSubWIn
22e20 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  fo || pParse->nE
22e30 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
22e40 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
22e50 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 20    if( pSubWInfo 
22e60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65  ){.          Whe
22e70 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f 70  reLoop *pSubLoop
22e80 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 6c  ;.          expl
22e90 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20  ainOneScan(.    
22ea0 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
22eb0 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57  , pOrTab, &pSubW
22ec0 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76  Info->a[0], iLev
22ed0 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  el, pLevel->iFro
22ee0 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20 29  m, 0.          )
22ef0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22f00 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
22f10 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c  ags & WHERE_DUPL
22f20 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b  ICATES_OK)==0 ){
22f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
22f40 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f   iSet = ((ii==pO
22f50 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31  rWc->nTerm-1)?-1
22f60 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  :ii);.          
22f70 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20    int r;.       
22f80 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33       r = sqlite3
22f90 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
22fa0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74  n(pParse, pTabIt
22fb0 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43  em->pTab, -1, iC
22fc0 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ur, .           
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
22ff0 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20  gRowid, 0);.    
23000 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23010 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
23020 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72  OP_RowSetTest, r
23030 65 67 52 6f 77 73 65 74 2c 0a 20 20 20 20 20 20  egRowset,.      
23040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23050 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
23060 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
23070 72 28 76 29 2b 32 2c 20 72 2c 20 69 53 65 74 29  r(v)+2, r, iSet)
23080 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
23090 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
230a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
230b0 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e  Gosub, regReturn
230c0 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20  , iLoopBody);.. 
230d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
230e0 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  pSubWInfo->untes
230f0 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65  tedTerms flag me
23100 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f 52  ans that this OR
23110 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20   term.          
23120 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65  ** contained one
23130 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72   or more AND ter
23140 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64  m from a notRead
23150 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20  y table.  The.  
23160 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73          ** terms
23170 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61   from the notRea
23180 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e  dy table could n
23190 6f 74 20 62 65 20 74 65 73 74 65 64 20 61 6e 64  ot be tested and
231a0 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20   will.          
231b0 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65  ** need to be te
231c0 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20  sted later..    
231d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
231e0 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
231f0 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
23200 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ) untestedTerms 
23210 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
23220 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  /* If all of the
23230 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
23240 72 6d 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65  rms are optimize
23250 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
23260 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
23270 64 65 78 2c 20 61 6e 64 20 74 68 65 20 69 6e 64  dex, and the ind
23280 65 78 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  ex is opened usi
23290 6e 67 20 74 68 65 20 73 61 6d 65 20 63 75 72 73  ng the same curs
232a0 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  or number.      
232b0 20 20 20 20 2a 2a 20 62 79 20 65 61 63 68 20 63      ** by each c
232c0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
232d0 65 72 65 42 65 67 69 6e 28 29 20 6d 61 64 65 20  ereBegin() made 
232e0 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74  by this loop, it
232f0 20 6d 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a   may.          *
23300 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  * be possible to
23310 20 75 73 65 20 74 68 61 74 20 69 6e 64 65 78 20   use that index 
23320 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  as a covering in
23330 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
23340 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  *.          ** I
23350 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  f the call to sq
23360 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
23370 29 20 61 62 6f 76 65 20 72 65 73 75 6c 74 65 64  ) above resulted
23380 20 69 6e 20 61 20 73 63 61 6e 20 74 68 61 74 0a   in a scan that.
23390 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
233a0 73 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20  s an index, and 
233b0 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 74  this is either t
233c0 68 65 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e  he first OR-conn
233d0 65 63 74 65 64 20 74 65 72 6d 0a 20 20 20 20 20  ected term.     
233e0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
233f0 64 20 6f 72 20 74 68 65 20 69 6e 64 65 78 20 69  d or the index i
23400 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
23410 61 74 20 75 73 65 64 20 62 79 20 61 6c 6c 20 70  at used by all p
23420 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
23430 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74 20    ** terms, set 
23440 70 43 6f 76 20 74 6f 20 74 68 65 20 63 61 6e 64  pCov to the cand
23450 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69  idate covering i
23460 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73 65 2c  ndex. Otherwise,
23470 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 20 20   set .          
23480 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20  ** pCov to NULL 
23490 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
234a0 20 6e 6f 20 63 61 6e 64 69 64 61 74 65 20 63 6f   no candidate co
234b0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 77 69 6c  vering index wil
234c0 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l .          ** 
234d0 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20  be available..  
234e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
234f0 20 20 20 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20       pSubLoop = 
23500 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  pSubWInfo->a[0].
23510 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  pWLoop;.        
23520 20 20 61 73 73 65 72 74 28 20 28 70 53 75 62 4c    assert( (pSubL
23530 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
23540 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
23550 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
23560 20 69 66 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e   if( (pSubLoop->
23570 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
23580 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
23590 20 20 20 20 20 20 20 26 26 20 28 69 69 3d 3d 30         && (ii==0
235a0 20 7c 7c 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e   || pSubLoop->u.
235b0 62 74 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70 43  btree.pIndex==pC
235c0 6f 76 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  ov).          ){
235d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
235e0 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e  ert( pSubWInfo->
235f0 61 5b 30 5d 2e 69 49 64 78 43 75 72 3d 3d 69 43  a[0].iIdxCur==iC
23600 6f 76 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20  ovCur );.       
23610 20 20 20 20 20 70 43 6f 76 20 3d 20 70 53 75 62       pCov = pSub
23620 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
23630 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20  ndex;.          
23640 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
23650 20 20 20 70 43 6f 76 20 3d 20 30 3b 0a 20 20 20     pCov = 0;.   
23660 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
23670 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68      /* Finish th
23680 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  e loop through t
23690 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61  able entries tha
236a0 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72  t match term pOr
236b0 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20  Term. */.       
236c0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
236d0 6e 64 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20  nd(pSubWInfo);. 
236e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
236f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
23700 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 20 3d 20 70  l->u.pCovidx = p
23710 43 6f 76 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  Cov;.    if( pCo
23720 76 20 29 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  v ) pLevel->iIdx
23730 43 75 72 20 3d 20 69 43 6f 76 43 75 72 3b 0a 20  Cur = iCovCur;. 
23740 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
23750 29 7b 0a 20 20 20 20 20 20 70 41 6e 64 45 78 70  ){.      pAndExp
23760 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20  r->pLeft = 0;.  
23770 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
23780 65 6c 65 74 65 28 64 62 2c 20 70 41 6e 64 45 78  elete(db, pAndEx
23790 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  pr);.    }.    s
237a0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
237b0 50 31 28 76 2c 20 69 52 65 74 49 6e 69 74 2c 20  P1(v, iRetInit, 
237c0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
237d0 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20  ntAddr(v));.    
237e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
237f0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
23800 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
23810 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
23820 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
23830 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20  , iLoopBody);.. 
23840 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
23850 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65  Level>1 ) sqlite
23860 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70  3StackFree(db, p
23870 4f 72 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20  OrTab);.    if( 
23880 21 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29  !untestedTerms )
23890 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
238a0 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d  vel, pTerm);.  }
238b0 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
238c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
238d0 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20  TIMIZATION */.. 
238e0 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 36   {.    /* Case 6
238f0 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75  :  There is no u
23900 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65  sable index.  We
23910 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c   must do a compl
23920 65 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ete.    **      
23930 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20      scan of the 
23940 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20  entire table..  
23950 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20    */.    static 
23960 63 6f 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d  const u8 aStep[]
23970 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50   = { OP_Next, OP
23980 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61  _Prev };.    sta
23990 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
239a0 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77  art[] = { OP_Rew
239b0 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a  ind, OP_Last };.
239c0 20 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76      assert( bRev
239d0 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29  ==0 || bRev==1 )
239e0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
239f0 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a   = aStep[bRev];.
23a00 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
23a10 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
23a20 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69  l->p2 = 1 + sqli
23a30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
23a40 20 61 53 74 61 72 74 5b 62 52 65 76 5d 2c 20 69   aStart[bRev], i
23a50 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20  Cur, addrBrk);. 
23a60 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20     pLevel->p5 = 
23a70 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
23a80 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b  S_FULLSCAN_STEP;
23a90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  .  }..  /* Inser
23aa0 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65  t code to test e
23ab0 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69  very subexpressi
23ac0 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63  on that can be c
23ad0 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63  ompletely.  ** c
23ae0 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68  omputed using th
23af0 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66  e current set of
23b00 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
23b10 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
23b20 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , j=pWC->nTerm; 
23b30 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b  j>0; j--, pTerm+
23b40 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
23b50 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
23b60 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
23b70 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
23b80 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
23b90 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
23ba0 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
23bb0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
23bc0 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
23bd0 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
23be0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23bf0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
23c00 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d  reqAll & pLevel-
23c10 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b  >notReady)!=0 ){
23c20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
23c30 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
23c40 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20  dTerms==0.      
23c50 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
23c60 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
23c70 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
23c80 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20  _ONLY)!=0 );.   
23c90 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73     pWInfo->untes
23ca0 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20  tedTerms = 1;.  
23cb0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
23cc0 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65    }.    pE = pTe
23cd0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61  rm->pExpr;.    a
23ce0 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a  ssert( pE!=0 );.
23cf0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
23d00 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78  iLeftJoin && !Ex
23d10 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
23d20 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
23d30 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
23d40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
23d50 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
23d60 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43  Parse, pE, addrC
23d70 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
23d80 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65  IFNULL);.    pTe
23d90 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
23da0 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a  ERM_CODED;.  }..
23db0 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65    /* Insert code
23dc0 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6d 70   to test for imp
23dd0 6c 69 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73  lied constraints
23de0 20 62 61 73 65 64 20 6f 6e 20 74 72 61 6e 73 69   based on transi
23df0 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74  tivity.  ** of t
23e00 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72  he "==" operator
23e10 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
23e20 70 6c 65 3a 20 49 66 20 74 68 65 20 57 48 45 52  ple: If the WHER
23e30 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
23e40 73 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e  s "t1.a=t2.b" an
23e50 64 20 22 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a  d "t2.b=123".  *
23e60 2a 20 61 6e 64 20 77 65 20 61 72 65 20 63 6f 64  * and we are cod
23e70 69 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ing the t1 loop 
23e80 61 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f 70 20  and the t2 loop 
23e90 68 61 73 20 6e 6f 74 20 79 65 74 20 63 6f 64 65  has not yet code
23ea0 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65 20  d,.  ** then we 
23eb0 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20 22  cannot use the "
23ec0 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74  t1.a=t2.b" const
23ed0 72 61 69 6e 74 2c 20 62 75 74 20 77 65 20 63 61  raint, but we ca
23ee0 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20  n code.  ** the 
23ef0 69 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d 31 32  implied "t1.a=12
23f00 33 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  3" constraint.. 
23f10 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   */.  for(pTerm=
23f20 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e  pWC->a, j=pWC->n
23f30 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
23f40 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
23f50 70 72 20 2a 70 45 2c 20 2a 70 45 41 6c 74 3b 0a  pr *pE, *pEAlt;.
23f60 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
23f70 41 6c 74 3b 0a 20 20 20 20 69 66 28 20 70 54 65  Alt;.    if( pTe
23f80 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
23f90 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
23fa0 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
23fb0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
23fc0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28 57  m->eOperator!=(W
23fd0 4f 5f 45 51 55 49 56 7c 57 4f 5f 45 51 29 20 29  O_EQUIV|WO_EQ) )
23fe0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
23ff0 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
24000 72 73 6f 72 21 3d 69 43 75 72 20 29 20 63 6f 6e  rsor!=iCur ) con
24010 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
24020 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
24030 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
24040 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pE = pTerm->pEx
24050 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
24060 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
24070 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  (pE, EP_FromJoin
24080 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
24090 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
240a0 69 67 68 74 20 26 20 70 4c 65 76 65 6c 2d 3e 6e  ight & pLevel->n
240b0 6f 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a 20  otReady)!=0 );. 
240c0 20 20 20 70 41 6c 74 20 3d 20 66 69 6e 64 54 65     pAlt = findTe
240d0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 54  rm(pWC, iCur, pT
240e0 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
240f0 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  n, notReady, WO_
24100 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20  EQ|WO_IN, 0);.  
24110 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29 20    if( pAlt==0 ) 
24120 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
24130 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20  ( pAlt->wtFlags 
24140 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  & (TERM_CODED) )
24150 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 74   continue;.    t
24160 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65  estcase( pAlt->e
24170 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
24180 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
24190 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f  ( pAlt->eOperato
241a0 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
241b0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
241c0 28 28 76 2c 20 22 62 65 67 69 6e 20 74 72 61 6e  ((v, "begin tran
241d0 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e  sitive constrain
241e0 74 22 29 29 3b 0a 20 20 20 20 70 45 41 6c 74 20  t"));.    pEAlt 
241f0 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c  = sqlite3StackAl
24200 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
24210 66 28 2a 70 45 41 6c 74 29 29 3b 0a 20 20 20 20  f(*pEAlt));.    
24220 69 66 28 20 70 45 41 6c 74 20 29 7b 0a 20 20 20  if( pEAlt ){.   
24230 20 20 20 2a 70 45 41 6c 74 20 3d 20 2a 70 41 6c     *pEAlt = *pAl
24240 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  t->pExpr;.      
24250 70 45 41 6c 74 2d 3e 70 4c 65 66 74 20 3d 20 70  pEAlt->pLeft = p
24260 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  E->pLeft;.      
24270 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
24280 73 65 28 70 50 61 72 73 65 2c 20 70 45 41 6c 74  se(pParse, pEAlt
24290 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
242a0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
242b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 61        sqlite3Sta
242c0 63 6b 46 72 65 65 28 64 62 2c 20 70 45 41 6c 74  ckFree(db, pEAlt
242d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
242e0 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f 55  /* For a LEFT OU
242f0 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61  TER JOIN, genera
24300 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
24310 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  l record the fac
24320 74 20 74 68 61 74 0a 20 20 2a 2a 20 61 74 20 6c  t that.  ** at l
24330 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  east one row of 
24340 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
24350 68 61 73 20 6d 61 74 63 68 65 64 20 74 68 65 20  has matched the 
24360 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20  left table.  .  
24370 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  */.  if( pLevel-
24380 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  >iLeftJoin ){.  
24390 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69    pLevel->addrFi
243a0 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rst = sqlite3Vdb
243b0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
243c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
243d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
243e0 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d  eger, 1, pLevel-
243f0 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
24400 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
24410 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f   "record LEFT JO
24420 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20 73  IN hit"));.    s
24430 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
24440 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
24450 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
24460 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e  >a, j=0; j<pWC->
24470 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72  nTerm; j++, pTer
24480 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65 73 74  m++){.      test
24490 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
244a0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
244b0 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UAL );.      tes
244c0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
244d0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
244e0 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ED );.      if( 
244f0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
24500 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
24510 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
24520 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
24530 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
24540 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  ll & pLevel->not
24550 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20  Ready)!=0 ){.   
24560 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49       assert( pWI
24570 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
24580 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ms );.        co
24590 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
245a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
245b0 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  erm->pExpr );.  
245c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
245d0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
245e0 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64 64  Term->pExpr, add
245f0 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55  rCont, SQLITE_JU
24600 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
24610 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
24620 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
24630 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
24640 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
24650 28 70 50 61 72 73 65 2c 20 69 52 65 6c 65 61 73  (pParse, iReleas
24660 65 52 65 67 29 3b 0a 0a 20 20 72 65 74 75 72 6e  eReg);..  return
24670 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64   pLevel->notRead
24680 79 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45  y;.}..#ifdef WHE
24690 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
246a0 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68  /*.** Print a Wh
246b0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66  ereLoop object f
246c0 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70 75 72  or debugging pur
246d0 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  poses.*/.static 
246e0 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72  void whereLoopPr
246f0 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70  int(WhereLoop *p
24700 2c 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c  , SrcList *pTabL
24710 69 73 74 29 7b 0a 20 20 69 6e 74 20 6e 62 20 3d  ist){.  int nb =
24720 20 31 2b 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53   1+(pTabList->nS
24730 72 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63  rc+7)/8;.  struc
24740 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
24750 70 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73 74  pItem = pTabList
24760 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20  ->a + p->iTab;. 
24770 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
24780 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71  Item->pTab;.  sq
24790 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
247a0 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25  ("%c%2d.%0*llx.%
247b0 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a  0*llx", p->cId,.
247c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247d0 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62       p->iTab, nb
247e0 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e  , p->maskSelf, n
247f0 62 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20  b, p->prereq);. 
24800 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24810 6e 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20  ntf(" %12s",.   
24820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24830 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20    pItem->zAlias 
24840 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ? pItem->zAlias 
24850 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  : pTab->zName);.
24860 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
24870 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
24880 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  LTABLE)==0 ){.  
24890 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65    if( p->u.btree
248a0 2e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20  .pIndex ){.     
248b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
248c0 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e  me = p->u.btree.
248d0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 0a 20  pIndex->zName;. 
248e0 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d       if( zName==
248f0 30 20 29 20 7a 4e 61 6d 65 20 3d 20 22 69 70 6b  0 ) zName = "ipk
24900 22 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ";.      if( str
24910 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  ncmp(zName, "sql
24920 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c  ite_autoindex_",
24930 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   17)==0 ){.     
24940 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74     int i = sqlit
24950 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
24960 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77  ) - 1;.        w
24970 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d  hile( zName[i]!=
24980 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20  '_' ) i--;.     
24990 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20     zName += i;. 
249a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
249b0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
249c0 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e  ".%-16s %2d", zN
249d0 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  ame, p->u.btree.
249e0 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nEq);.    }else{
249f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
24a00 62 75 67 50 72 69 6e 74 66 28 22 25 32 30 73 22  bugPrintf("%20s"
24a10 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ,"");.    }.  }e
24a20 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
24a30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76  ;.    if( p->u.v
24a40 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20  tab.idxStr ){.  
24a50 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
24a60 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25  mprintf("(%d,\"%
24a70 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20  s\",%x)",.      
24a80 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76            p->u.v
24a90 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75  tab.idxNum, p->u
24aa0 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d  .vtab.idxStr, p-
24ab0 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
24ac0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
24ad0 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
24ae0 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29  mprintf("(%d,%x)
24af0 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  ", p->u.vtab.idx
24b00 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f  Num, p->u.vtab.o
24b10 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a  mitMask);.    }.
24b20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24b30 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c  Printf(" %-19s",
24b40 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   z);.    sqlite3
24b50 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20  _free(z);.  }.  
24b60 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24b70 74 66 28 22 20 66 20 25 30 34 78 20 4e 20 25 64  tf(" f %04x N %d
24b80 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70  ", p->wsFlags, p
24b90 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 73 71 6c  ->nLTerm);.  sql
24ba0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24bb0 22 20 63 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c  " cost %d,%d,%d\
24bc0 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20 70  n", p->rSetup, p
24bd0 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29  ->rRun, p->nOut)
24be0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
24bf0 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d  * Convert bulk m
24c00 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c  emory into a val
24c10 69 64 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61  id WhereLoop tha
24c20 74 20 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a  t can be passed.
24c30 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43  ** to whereLoopC
24c40 6c 65 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e  lear harmlessly.
24c50 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
24c60 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68  whereLoopInit(Wh
24c70 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70  ereLoop *p){.  p
24c80 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c  ->aLTerm = p->aL
24c90 54 65 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e  TermSpace;.  p->
24ca0 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d  nLTerm = 0;.  p-
24cb0 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53  >nLSlot = ArrayS
24cc0 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61  ize(p->aLTermSpa
24cd0 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67  ce);.  p->wsFlag
24ce0 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s = 0;.}../*.** 
24cf0 43 6c 65 61 72 20 74 68 65 20 57 68 65 72 65 4c  Clear the WhereL
24d00 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65  oop.u union.  Le
24d10 61 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c  ave WhereLoop.pL
24d20 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a  Term intact..*/.
24d30 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
24d40 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28  eLoopClearUnion(
24d50 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
24d60 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66  reLoop *p){.  if
24d70 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  ( p->wsFlags & (
24d80 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
24d90 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e  LE|WHERE_AUTO_IN
24da0 44 45 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20  DEX) ){.    if( 
24db0 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
24dc0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
24dd0 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61  )!=0 && p->u.vta
24de0 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20  b.needFree ){.  
24df0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24e00 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  (p->u.vtab.idxSt
24e10 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76  r);.      p->u.v
24e20 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
24e30 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61  ;.      p->u.vta
24e40 62 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  b.idxStr = 0;.  
24e50 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e    }else if( (p->
24e60 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
24e70 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26  AUTO_INDEX)!=0 &
24e80 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  & p->u.btree.pIn
24e90 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dex!=0 ){.      
24ea0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
24eb0 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  , p->u.btree.pIn
24ec0 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  dex->zColAff);. 
24ed0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
24ee0 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65  ee(db, p->u.btre
24ef0 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  e.pIndex);.     
24f00 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
24f10 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ex = 0;.    }.  
24f20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  }.}../*.** Deall
24f30 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d  ocate internal m
24f40 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 20  emory used by a 
24f50 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
24f60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
24f70 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73  whereLoopClear(s
24f80 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
24f90 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28  eLoop *p){.  if(
24fa0 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61   p->aLTerm!=p->a
24fb0 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c  LTermSpace ) sql
24fc0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
24fd0 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65  ->aLTerm);.  whe
24fe0 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e  reLoopClearUnion
24ff0 28 64 62 2c 20 70 29 3b 0a 20 20 77 68 65 72 65  (db, p);.  where
25000 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a  LoopInit(p);.}..
25010 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74  /*.** Increase t
25020 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
25030 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e  tion for pLoop->
25040 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61  aLTerm[] to be a
25050 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74  t least n..*/.st
25060 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
25070 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33  opResize(sqlite3
25080 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
25090 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68  *p, int n){.  Wh
250a0 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b  ereTerm **paNew;
250b0 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74  .  if( p->nLSlot
250c0 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c  >=n ) return SQL
250d0 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e  ITE_OK;.  n = (n
250e0 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20  +7)&~7;.  paNew 
250f0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
25100 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
25110 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29  p->aLTerm[0])*n)
25120 3b 0a 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30  ;.  if( paNew==0
25130 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
25140 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79  _NOMEM;.  memcpy
25150 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72  (paNew, p->aLTer
25160 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54  m, sizeof(p->aLT
25170 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f  erm[0])*p->nLSlo
25180 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54  t);.  if( p->aLT
25190 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70  erm!=p->aLTermSp
251a0 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46  ace ) sqlite3DbF
251b0 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72  ree(db, p->aLTer
251c0 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20  m);.  p->aLTerm 
251d0 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c  = paNew;.  p->nL
251e0 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75  Slot = n;.  retu
251f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
25200 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20  ./*.** Transfer 
25210 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
25220 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e   second pLoop in
25230 74 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f  to the first..*/
25240 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
25250 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65  eLoopXfer(sqlite
25260 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
25270 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70   *pTo, WhereLoop
25280 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72   *pFrom){.  wher
25290 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28  eLoopClearUnion(
252a0 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20  db, pTo);.  if( 
252b0 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
252c0 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e  db, pTo, pFrom->
252d0 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d  nLTerm) ){.    m
252e0 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30  emset(&pTo->u, 0
252f0 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29  , sizeof(pTo->u)
25300 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
25310 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
25320 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46    memcpy(pTo, pF
25330 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f  rom, WHERE_LOOP_
25340 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63  XFER_SZ);.  memc
25350 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20  py(pTo->aLTerm, 
25360 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70  pFrom->aLTerm, p
25370 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f  To->nLTerm*sizeo
25380 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d  f(pTo->aLTerm[0]
25390 29 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  ));.  if( pFrom-
253a0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
253b0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
253c0 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74  .    pFrom->u.vt
253d0 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
253e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46  .  }else if( (pF
253f0 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
25400 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
25410 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d  !=0 ){.    pFrom
25420 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
25430 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
25440 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
25450 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
25460 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
25470 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25480 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28  whereLoopDelete(
25490 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
254a0 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68  reLoop *p){.  wh
254b0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
254c0 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62   p);.  sqlite3Db
254d0 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
254e0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65  /*.** Free a Whe
254f0 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
25500 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25510 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71  whereInfoFree(sq
25520 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
25530 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
25540 20 69 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e   if( ALWAYS(pWIn
25550 66 6f 29 20 29 7b 0a 20 20 20 20 77 68 65 72 65  fo) ){.    where
25560 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57 49  ClauseClear(&pWI
25570 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77  nfo->sWC);.    w
25580 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c  hile( pWInfo->pL
25590 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68  oops ){.      Wh
255a0 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49  ereLoop *p = pWI
255b0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20  nfo->pLoops;.   
255c0 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70     pWInfo->pLoop
255d0 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  s = p->pNextLoop
255e0 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
255f0 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a  pDelete(db, p);.
25600 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
25610 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e  3DbFree(db, pWIn
25620 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  fo);.  }.}../*.*
25630 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c  * Insert or repl
25640 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  ace a WhereLoop 
25650 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20  entry using the 
25660 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65  template supplie
25670 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  d..**.** An exis
25680 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65  ting WhereLoop e
25690 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76  ntry might be ov
256a0 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
256b0 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a   new template.**
256c0 20 69 73 20 62 65 74 74 65 72 20 61 6e 64 20 68   is better and h
256d0 61 73 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  as fewer depende
256e0 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74  ncies.  Or the t
256f0 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20  emplate will be 
25700 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e  ignored.** and n
25710 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63  o insert will oc
25720 63 75 72 20 69 66 20 61 6e 20 65 78 69 73 74 69  cur if an existi
25730 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ng WhereLoop is 
25740 66 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a  faster and has.*
25750 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  * fewer dependen
25760 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 74 65  cies than the te
25770 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69  mplate.  Otherwi
25780 73 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f  se a new WhereLo
25790 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62  op is.** added b
257a0 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70  ased on the temp
257b0 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  late..**.** If p
257c0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
257d0 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
257e0 20 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62   we only care ab
257f0 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  out only the.** 
25800 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61 6e  prerequisites an
25810 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20  d rRun and nOut 
25820 63 6f 73 74 73 20 6f 66 20 74 68 65 20 4e 20 62  costs of the N b
25830 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74  est loops.  That
25840 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
25850 69 73 20 67 61 74 68 65 72 65 64 20 69 6e 20 74  is gathered in t
25860 68 65 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  he pBuilder->pOr
25870 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69  Set object.  Thi
25880 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f  s special.** pro
25890 63 65 73 73 69 6e 67 20 6d 6f 64 65 20 69 73 20  cessing mode is 
258a0 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52  used only for OR
258b0 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
258c0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ng..**.** When a
258d0 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74  ccumulating mult
258e0 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e  iple loops (when
258f0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
25900 74 20 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a  t is NULL) we.**
25910 20 73 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65   still might ove
25920 72 77 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c  rwrite similar l
25930 6f 6f 70 73 20 77 69 74 68 20 74 68 65 20 6e 65  oops with the ne
25940 77 20 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68  w template if th
25950 65 0a 2a 2a 20 74 65 6d 70 6c 61 74 65 20 69 73  e.** template is
25960 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20   better.  Loops 
25970 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69 74 74  may be overwritt
25980 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  en if the follow
25990 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  ing .** conditio
259a0 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a  ns are met:.**.*
259b0 2a 20 20 20 20 28 31 29 20 20 54 68 65 79 20 68  *    (1)  They h
259c0 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 54 61  ave the same iTa
259d0 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68  b..**    (2)  Th
259e0 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
259f0 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20   iSortIdx..**   
25a00 20 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61   (3)  The templa
25a10 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66  te has same or f
25a20 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
25a30 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  s than the curre
25a40 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34  nt loop.**    (4
25a50 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
25a60 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20  has the same or 
25a70 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20  lower cost than 
25a80 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
25a90 0a 2a 2a 20 20 20 20 28 35 29 20 20 54 68 65 20  .**    (5)  The 
25aa0 74 65 6d 70 6c 61 74 65 20 75 73 65 73 20 6d 6f  template uses mo
25ab0 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  re terms of the 
25ac0 73 61 6d 65 20 69 6e 64 65 78 20 62 75 74 20 68  same index but h
25ad0 61 73 20 6e 6f 20 61 64 64 69 74 69 6f 6e 61 6c  as no additional
25ae0 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 70 65  .**         depe
25af0 6e 64 65 6e 63 69 65 73 20 20 20 20 20 20 20 20  ndencies        
25b00 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74    .*/.static int
25b10 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
25b20 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
25b30 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65  r *pBuilder, Whe
25b40 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74  reLoop *pTemplat
25b50 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  e){.  WhereLoop 
25b60 2a 2a 70 70 50 72 65 76 2c 20 2a 70 2c 20 2a 70  **ppPrev, *p, *p
25b70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 57 68 65 72  Next = 0;.  Wher
25b80 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
25b90 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
25ba0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
25bb0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
25bc0 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  ->db;..  /* If p
25bd0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
25be0 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  is defined, then
25bf0 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b   only keep track
25c00 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20   of the costs.  
25c10 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a  ** and prereqs..
25c20 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c    */.  if( pBuil
25c30 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29  der->pOrSet!=0 )
25c40 7b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  {.#if WHERETRACE
25c50 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 75 31 36  _ENABLED.    u16
25c60 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70   n = pBuilder->p
25c70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e  OrSet->n;.    in
25c80 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20  t x =.#endif.   
25c90 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70   whereOrInsert(p
25ca0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c  Builder->pOrSet,
25cb0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
25cc0 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72  eq, pTemplate->r
25cd0 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Run,.           
25ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cf0 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
25d00 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57  te->nOut);.#if W
25d10 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
25d20 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  D.    if( sqlite
25d30 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
25d40 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  8 ){.      sqlit
25d50 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 78 3f  e3DebugPrintf(x?
25d60 22 20 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20  "   or-%d:  ":" 
25d70 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a    or-X:  ", n);.
25d80 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
25d90 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
25da0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
25db0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
25dc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25dd0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
25de0 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78  Search for an ex
25df0 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
25e00 20 74 6f 20 6f 76 65 72 77 72 69 74 65 2c 20 6f   to overwrite, o
25e10 72 20 77 68 69 63 68 20 74 61 6b 65 73 0a 20 20  r which takes.  
25e20 2a 2a 20 70 72 69 6f 72 69 74 79 20 6f 76 65 72  ** priority over
25e30 20 70 54 65 6d 70 6c 61 74 65 2e 0a 20 20 2a 2f   pTemplate..  */
25e40 0a 20 20 66 6f 72 28 70 70 50 72 65 76 3d 26 70  .  for(ppPrev=&p
25e50 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70  WInfo->pLoops, p
25e60 3d 2a 70 70 50 72 65 76 3b 20 70 3b 20 70 70 50  =*ppPrev; p; ppP
25e70 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f  rev=&p->pNextLoo
25e80 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20  p, p=*ppPrev){. 
25e90 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d     if( p->iTab!=
25ea0 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20  pTemplate->iTab 
25eb0 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d  || p->iSortIdx!=
25ec0 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74  pTemplate->iSort
25ed0 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Idx ){.      /* 
25ee0 49 66 20 65 69 74 68 65 72 20 74 68 65 20 69 54  If either the iT
25ef0 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76  ab or iSortIdx v
25f00 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68  alues for two Wh
25f10 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66  ereLoop are diff
25f20 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74  erent.      ** t
25f30 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c  hen those WhereL
25f40 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20  oops need to be 
25f50 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61 72  considered separ
25f60 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20  ately.  Neither 
25f70 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61  is.      ** a ca
25f80 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61  ndidate to repla
25f90 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f  ce the other. */
25fa0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
25fb0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e  .    }.    /* In
25fc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   the current imp
25fd0 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65  lementation, the
25fe0 20 72 53 65 74 75 70 20 76 61 6c 75 65 20 69 73   rSetup value is
25ff0 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20   either zero.   
26000 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20   ** or the cost 
26010 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61  of building an a
26020 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28  utomatic index (
26030 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e  NlogN) and the N
26040 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74  logN.    ** is t
26050 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70  he same for comp
26060 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70  atible WhereLoop
26070 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  s. */.    assert
26080 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c  ( p->rSetup==0 |
26090 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  | pTemplate->rSe
260a0 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  tup==0 .        
260b0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72           || p->r
260c0 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65  Setup==pTemplate
260d0 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20  ->rSetup );..   
260e0 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64   /* whereLoopAdd
260f0 42 74 72 65 65 28 29 20 61 6c 77 61 79 73 20 67  Btree() always g
26100 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73  enerates and ins
26110 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74  erts the automat
26120 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20  ic index.    ** 
26130 63 61 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e  case first.  Hen
26140 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61  ce compatible ca
26150 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f  ndidate WhereLoo
26160 70 73 20 6e 65 76 65 72 20 68 61 76 65 20 61 20  ps never have a 
26170 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53  larger.    ** rS
26180 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20  etup. Call this 
26190 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20  SETUP-INVARIANT 
261a0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
261b0 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c  ->rSetup>=pTempl
261c0 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a  ate->rSetup );..
261d0 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
261e0 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e  eq & pTemplate->
261f0 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72  prereq)==p->prer
26200 65 71 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53  eq.     && p->rS
26210 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d  etup<=pTemplate-
26220 3e 72 53 65 74 75 70 0a 20 20 20 20 20 26 26 20  >rSetup.     && 
26230 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61  p->rRun<=pTempla
26240 74 65 2d 3e 72 52 75 6e 0a 20 20 20 20 20 26 26  te->rRun.     &&
26250 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c   p->nOut<=pTempl
26260 61 74 65 2d 3e 6e 4f 75 74 0a 20 20 20 20 29 7b  ate->nOut.    ){
26270 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
26280 72 61 6e 63 68 20 74 61 6b 65 6e 20 77 68 65 6e  ranch taken when
26290 20 70 20 69 73 20 65 71 75 61 6c 20 6f 72 20 62   p is equal or b
262a0 65 74 74 65 72 20 74 68 61 6e 20 70 54 65 6d 70  etter than pTemp
262b0 6c 61 74 65 20 69 6e 20 0a 20 20 20 20 20 20 2a  late in .      *
262c0 2a 20 61 6c 6c 20 6f 66 20 28 31 29 20 64 65 70  * all of (1) dep
262d0 65 6e 64 65 6e 63 69 65 73 20 28 32 29 20 73 65  endencies (2) se
262e0 74 75 70 2d 63 6f 73 74 2c 20 28 33 29 20 72 75  tup-cost, (3) ru
262f0 6e 2d 63 6f 73 74 2c 20 61 6e 64 0a 20 20 20 20  n-cost, and.    
26300 20 20 2a 2a 20 28 34 29 20 6e 75 6d 62 65 72 20    ** (4) number 
26310 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2e 20  of output rows. 
26320 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
26330 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d   p->rSetup==pTem
26340 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
26350 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72  .      if( p->pr
26360 65 72 65 71 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  ereq==pTemplate-
26370 3e 70 72 65 72 65 71 0a 20 20 20 20 20 20 20 26  >prereq.       &
26380 26 20 70 2d 3e 6e 4c 54 65 72 6d 3c 70 54 65 6d  & p->nLTerm<pTem
26390 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 0a 20 20  plate->nLTerm.  
263a0 20 20 20 20 20 26 26 20 28 70 2d 3e 77 73 46 6c       && (p->wsFl
263b0 61 67 73 20 26 20 70 54 65 6d 70 6c 61 74 65 2d  ags & pTemplate-
263c0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
263d0 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20  _INDEXED)!=0.   
263e0 20 20 20 20 26 26 20 28 70 2d 3e 75 2e 62 74 72      && (p->u.btr
263f0 65 65 2e 70 49 6e 64 65 78 3d 3d 70 54 65 6d 70  ee.pIndex==pTemp
26400 6c 61 74 65 2d 3e 75 2e 62 74 72 65 65 2e 70 49  late->u.btree.pI
26410 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 7c  ndex.          |
26420 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  | pTemplate->rRu
26430 6e 2b 70 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 2d 3e  n+p->nLTerm<=p->
26440 72 52 75 6e 2b 70 54 65 6d 70 6c 61 74 65 2d 3e  rRun+pTemplate->
26450 6e 4c 54 65 72 6d 29 0a 20 20 20 20 20 20 29 7b  nLTerm).      ){
26460 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72  .        /* Over
26470 77 72 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e  write an existin
26480 67 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68  g WhereLoop with
26490 20 61 6e 20 73 69 6d 69 6c 61 72 20 6f 6e 65 20   an similar one 
264a0 74 68 61 74 20 75 73 65 73 0a 20 20 20 20 20 20  that uses.      
264b0 20 20 2a 2a 20 6d 6f 72 65 20 74 65 72 6d 73 20    ** more terms 
264c0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  of the index */.
264d0 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20          pNext = 
264e0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20  p->pNextLoop;.  
264f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26500 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26510 20 20 2f 2a 20 70 54 65 6d 70 6c 61 74 65 20 69    /* pTemplate i
26520 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c 2e 0a 20  s not helpful.. 
26530 20 20 20 20 20 20 20 2a 2a 20 52 65 74 75 72 6e         ** Return
26540 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
26550 67 20 6f 72 20 61 64 64 69 6e 67 20 61 6e 79 74  g or adding anyt
26560 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20  hing */.        
26570 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 49 6e  goto whereLoopIn
26580 73 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20  sert_noop;.     
26590 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
265a0 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
265b0 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
265c0 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  ==pTemplate->pre
265d0 72 65 71 0a 20 20 20 20 20 26 26 20 70 2d 3e 72  req.     && p->r
265e0 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run>=pTemplate->
265f0 72 52 75 6e 0a 20 20 20 20 20 26 26 20 70 2d 3e  rRun.     && p->
26600 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  nOut>=pTemplate-
26610 3e 6e 4f 75 74 0a 20 20 20 20 29 7b 0a 20 20 20  >nOut.    ){.   
26620 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20     /* Overwrite 
26630 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  an existing Wher
26640 65 4c 6f 6f 70 20 77 69 74 68 20 61 20 62 65 74  eLoop with a bet
26650 74 65 72 20 6f 6e 65 3a 20 6f 6e 65 20 74 68 61  ter one: one tha
26660 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 62 65  t is.      ** be
26670 74 74 65 72 20 61 74 20 6f 6e 65 20 6f 66 20 28  tter at one of (
26680 31 29 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2c  1) dependencies,
26690 20 28 32 29 20 73 65 74 75 70 2d 63 6f 73 74 2c   (2) setup-cost,
266a0 20 28 33 29 20 72 75 6e 2d 63 6f 73 74 0a 20 20   (3) run-cost.  
266b0 20 20 20 20 2a 2a 20 6f 72 20 28 34 29 20 6e 75      ** or (4) nu
266c0 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
266d0 6f 77 73 2c 20 61 6e 64 20 69 73 20 6e 6f 20 77  ows, and is no w
266e0 6f 72 73 65 20 69 6e 20 61 6e 79 20 6f 66 20 74  orse in any of t
266f0 68 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 61  hose.      ** ca
26700 74 65 67 6f 72 69 65 73 2e 20 2a 2f 0a 20 20 20  tegories. */.   
26710 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
26720 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  etup>=pTemplate-
26730 3e 72 53 65 74 75 70 20 29 3b 20 2f 2a 20 53 45  >rSetup ); /* SE
26740 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62  TUP-INVARIANT ab
26750 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  ove */.      pNe
26760 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  xt = p->pNextLoo
26770 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  p;.      break;.
26780 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
26790 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
267a0 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20   point it means 
267b0 74 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20  that either p[] 
267c0 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72  should be overwr
267d0 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20  itten.  ** with 
267e0 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70  pTemplate[] if p
267f0 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66  [] exists, or if
26800 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c   p==NULL then al
26810 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a  locate a new.  *
26820 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20  * WhereLoop and 
26830 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a  insert it..  */.
26840 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
26850 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
26860 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
26870 20 30 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20   0x8 ){.    if( 
26880 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p!=0 ){.      sq
26890 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
268a0 28 22 69 6e 73 2d 64 65 6c 3a 20 20 22 29 3b 0a  ("ins-del:  ");.
268b0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
268c0 72 69 6e 74 28 70 2c 20 70 57 49 6e 66 6f 2d 3e  rint(p, pWInfo->
268d0 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d  pTabList);.    }
268e0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
268f0 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 6e 65 77  gPrintf("ins-new
26900 3a 20 20 22 29 3b 0a 20 20 20 20 77 68 65 72 65  :  ");.    where
26910 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
26920 61 74 65 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ate, pWInfo->pTa
26930 62 4c 69 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64  bList);.  }.#end
26940 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  if.  if( p==0 ){
26950 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
26960 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
26970 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
26980 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  ));.    if( p==0
26990 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
269a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72  _NOMEM;.    wher
269b0 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20  eLoopInit(p);.  
269c0 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 58 66 65  }.  whereLoopXfe
269d0 72 28 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61  r(db, p, pTempla
269e0 74 65 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 4c  te);.  p->pNextL
269f0 6f 6f 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 2a  oop = pNext;.  *
26a00 70 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 69 66  ppPrev = p;.  if
26a10 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
26a20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
26a30 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e  LE)==0 ){.    In
26a40 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d  dex *pIndex = p-
26a50 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
26a60 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20  .    if( pIndex 
26a70 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d  && pIndex->tnum=
26a80 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75  =0 ){.      p->u
26a90 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
26aa0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
26ab0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26ac0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
26ad0 20 69 66 20 74 68 65 20 69 6e 73 65 72 74 20 69   if the insert i
26ae0 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 77 68 65  s a no-op */.whe
26af0 72 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f  reLoopInsert_noo
26b00 70 3a 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  p:.#if WHERETRAC
26b10 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
26b20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
26b30 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 73  e & 0x8 ){.    s
26b40 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
26b50 66 28 22 69 6e 73 2d 6e 6f 6f 70 3a 20 22 29 3b  f("ins-noop: ");
26b60 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72  .    whereLoopPr
26b70 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  int(pTemplate, p
26b80 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29  WInfo->pTabList)
26b90 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
26ba0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26bb0 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75    .}../*.** Adju
26bc0 73 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  st the WhereLoop
26bd0 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64 6f 77 6e  .nOut value down
26be0 77 61 72 64 20 74 6f 20 61 63 63 6f 75 6e 74 20  ward to account 
26bf0 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65  for terms of the
26c00 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
26c10 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
26c20 74 68 65 20 6c 6f 6f 70 20 62 75 74 20 77 68 69  the loop but whi
26c30 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ch are not used 
26c40 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a  by an.** index..
26c50 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 75 72  **.** In the cur
26c60 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
26c70 69 6f 6e 2c 20 74 68 65 20 66 69 72 73 74 20 65  ion, the first e
26c80 78 74 72 61 20 57 48 45 52 45 20 63 6c 61 75 73  xtra WHERE claus
26c90 65 20 74 65 72 6d 20 72 65 64 75 63 65 73 0a 2a  e term reduces.*
26ca0 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
26cb0 6f 75 74 70 75 74 20 72 6f 77 73 20 62 79 20 61  output rows by a
26cc0 20 66 61 63 74 6f 72 20 6f 66 20 31 30 20 61 6e   factor of 10 an
26cd0 64 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61  d each additiona
26ce0 6c 20 74 65 72 6d 0a 2a 2a 20 72 65 64 75 63 65  l term.** reduce
26cf0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
26d00 6f 75 74 70 75 74 20 72 6f 77 73 20 62 79 20 73  output rows by s
26d10 71 72 74 28 32 29 2e 0a 2a 2f 0a 73 74 61 74 69  qrt(2)..*/.stati
26d20 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
26d30 4f 75 74 70 75 74 41 64 6a 75 73 74 28 57 68 65  OutputAdjust(Whe
26d40 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 57  reClause *pWC, W
26d50 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 29  hereLoop *pLoop)
26d60 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
26d70 54 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74  Term, *pX;.  Bit
26d80 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20  mask notAllowed 
26d90 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65  = ~(pLoop->prere
26da0 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  q|pLoop->maskSel
26db0 66 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  f);.  int i, j;.
26dc0 0a 20 20 69 66 28 20 21 4f 70 74 69 6d 69 7a 61  .  if( !Optimiza
26dd0 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 43 2d  tionEnabled(pWC-
26de0 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  >pWInfo->pParse-
26df0 3e 64 62 2c 20 53 51 4c 49 54 45 5f 41 64 6a 75  >db, SQLITE_Adju
26e00 73 74 4f 75 74 45 73 74 29 20 29 7b 0a 20 20 20  stOutEst) ){.   
26e10 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66   return;.  }.  f
26e20 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c  or(i=pWC->nTerm,
26e30 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
26e40 3e 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b  >0; i--, pTerm++
26e50 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  ){.    if( (pTer
26e60 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
26e70 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 29 20  M_VIRTUAL)!=0 ) 
26e80 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 28  break;.    if( (
26e90 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
26ea0 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65   & pLoop->maskSe
26eb0 6c 66 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  lf)==0 ) continu
26ec0 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  e;.    if( (pTer
26ed0 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e  m->prereqAll & n
26ee0 6f 74 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20  otAllowed)!=0 ) 
26ef0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
26f00 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72  r(j=pLoop->nLTer
26f10 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b  m-1; j>=0; j--){
26f20 0a 20 20 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f  .      pX = pLoo
26f30 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20  p->aLTerm[j];.  
26f40 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65 72      if( pX==pTer
26f50 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
26f60 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e 74   if( pX->iParent
26f70 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61 5b  >=0 && (&pWC->a[
26f80 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70  pX->iParent])==p
26f90 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
26fa0 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20    }.    if( j<0 
26fb0 29 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d  ) pLoop->nOut +=
26fc0 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
26fd0 62 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b;.  }.}../*.** 
26fe0 57 65 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d  We have so far m
26ff0 61 74 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d  atched pBuilder-
27000 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  >pNew->u.btree.n
27010 45 71 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  Eq terms of the 
27020 69 6e 64 65 78 20 70 49 6e 64 65 78 2e 0a 2a 2a  index pIndex..**
27030 20 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e   Try to match on
27040 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e more..**.** If
27050 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30   pProbe->tnum==0
27060 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 70 49 6e  , that means pIn
27070 64 65 78 20 69 73 20 61 20 66 61 6b 65 20 69 6e  dex is a fake in
27080 64 65 78 20 75 73 65 64 20 66 6f 72 20 74 68 65  dex used for the
27090 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d  .** INTEGER PRIM
270a0 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74  ARY KEY..*/.stat
270b0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
270c0 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 0a 20  AddBtreeIndex(. 
270d0 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
270e0 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 20 20  r *pBuilder,    
270f0 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f   /* The WhereLoo
27100 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73  p factory */.  s
27110 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
27120 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f  em *pSrc,      /
27130 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  * FROM clause te
27140 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  rm being analyze
27150 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  d */.  Index *pP
27160 72 6f 62 65 2c 20 20 20 20 20 20 20 20 20 20 20  robe,           
27170 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
27180 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20  ex on pSrc */.  
27190 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20  LogEst nInMul   
271a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271b0 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66  /* log(Number of
271c0 20 69 74 65 72 61 74 69 6f 6e 73 20 64 75 65 20   iterations due 
271d0 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57  to IN) */.){.  W
271e0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
271f0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
27200 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20 61  nfo;  /* WHERE a
27210 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78 74 20 2a  nalyse context *
27220 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
27230 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
27240 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se;        /* Pa
27250 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
27260 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
27270 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
27280 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
27290 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63  onnection malloc
272a0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
272b0 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
272c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
272d0 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c   Template WhereL
272e0 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  oop under constr
272f0 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  uction */.  Wher
27300 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
27310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
27320 20 57 68 65 72 65 54 65 72 6d 20 75 6e 64 65 72   WhereTerm under
27330 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a   consideration *
27340 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20  /.  int opMask; 
27350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27360 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65      /* Valid ope
27370 72 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74  rators for const
27380 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72  raints */.  Wher
27390 65 53 63 61 6e 20 73 63 61 6e 3b 20 20 20 20 20  eScan scan;     
273a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
273b0 74 65 72 61 74 6f 72 20 66 6f 72 20 57 48 45 52  terator for WHER
273c0 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74  E terms */.  Bit
273d0 6d 61 73 6b 20 73 61 76 65 64 5f 70 72 65 72 65  mask saved_prere
273e0 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  q;           /* 
273f0 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
27400 66 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a  f pNew->prereq *
27410 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 4c  /.  u16 saved_nL
27420 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
27430 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
27440 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e  value of pNew->n
27450 4c 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 73  LTerm */.  int s
27460 61 76 65 64 5f 6e 45 71 3b 20 20 20 20 20 20 20  aved_nEq;       
27470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
27480 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
27490 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
274a0 71 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64  q */.  u32 saved
274b0 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  _wsFlags;       
274c0 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
274d0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
274e0 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c  ->wsFlags */.  L
274f0 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75 74  ogEst saved_nOut
27500 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
27510 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
27520 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a   of pNew->nOut *
27530 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20  /.  int iCol;   
27540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27550 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
27560 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  the column in th
27570 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
27580 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
275a0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
275b0 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 3b   LogEst nRowEst;
275c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275d0 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 69 6e   /* Estimated in
275e0 64 65 78 20 73 65 6c 65 63 74 69 76 69 74 79 20  dex selectivity 
275f0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67  */.  LogEst rLog
27600 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
27610 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68       /* Logarith
27620 6d 20 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20  m of table size 
27630 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
27640 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20  pTop = 0, *pBtm 
27650 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20  = 0; /* Top and 
27660 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e  bottom range con
27670 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70  straints */..  p
27680 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
27690 70 4e 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e  pNew;.  if( db->
276a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
276b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
276c0 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  EM;..  assert( (
276d0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
276e0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
276f0 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  LE)==0 );.  asse
27700 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
27710 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
27720 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66  IMIT)==0 );.  if
27730 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  ( pNew->wsFlags 
27740 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
27750 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  T ){.    opMask 
27760 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  = WO_LT|WO_LE;. 
27770 20 7d 65 6c 73 65 20 69 66 28 20 70 50 72 6f 62   }else if( pProb
27780 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70  e->tnum<=0 || (p
27790 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  Src->jointype & 
277a0 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
277b0 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45     opMask = WO_E
277c0 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f  Q|WO_IN|WO_GT|WO
277d0 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  _GE|WO_LT|WO_LE;
277e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
277f0 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
27800 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  IN|WO_ISNULL|WO_
27810 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
27820 4f 5f 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  O_LE;.  }.  if( 
27830 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
27840 65 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e  ed ) opMask &= ~
27850 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  (WO_GT|WO_GE|WO_
27860 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73  LT|WO_LE);..  as
27870 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74  sert( pNew->u.bt
27880 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d  ree.nEq<=pProbe-
27890 3e 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 69 66  >nKeyCol );.  if
278a0 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
278b0 6e 45 71 20 3c 20 70 50 72 6f 62 65 2d 3e 6e 4b  nEq < pProbe->nK
278c0 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 69 43 6f  eyCol ){.    iCo
278d0 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  l = pProbe->aiCo
278e0 6c 75 6d 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74 72  lumn[pNew->u.btr
278f0 65 65 2e 6e 45 71 5d 3b 0a 20 20 20 20 6e 52 6f  ee.nEq];.    nRo
27900 77 45 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  wEst = sqlite3Lo
27910 67 45 73 74 28 70 50 72 6f 62 65 2d 3e 61 69 52  gEst(pProbe->aiR
27920 6f 77 45 73 74 5b 70 4e 65 77 2d 3e 75 2e 62 74  owEst[pNew->u.bt
27930 72 65 65 2e 6e 45 71 2b 31 5d 29 3b 0a 20 20 20  ree.nEq+1]);.   
27940 20 69 66 28 20 6e 52 6f 77 45 73 74 3d 3d 30 20   if( nRowEst==0 
27950 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72  && pProbe->onErr
27960 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 6e 52  or==OE_None ) nR
27970 6f 77 45 73 74 20 3d 20 31 3b 0a 20 20 7d 65 6c  owEst = 1;.  }el
27980 73 65 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 2d  se{.    iCol = -
27990 31 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 3d  1;.    nRowEst =
279a0 20 30 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20   0;.  }.  pTerm 
279b0 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28  = whereScanInit(
279c0 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d  &scan, pBuilder-
279d0 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72  >pWC, pSrc->iCur
279e0 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20 20 20 20  sor, iCol,.     
279f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a00 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62     opMask, pProb
27a10 65 29 3b 0a 20 20 73 61 76 65 64 5f 6e 45 71 20  e);.  saved_nEq 
27a20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  = pNew->u.btree.
27a30 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4c 54  nEq;.  saved_nLT
27a40 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65  erm = pNew->nLTe
27a50 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73 46 6c  rm;.  saved_wsFl
27a60 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46 6c  ags = pNew->wsFl
27a70 61 67 73 3b 0a 20 20 73 61 76 65 64 5f 70 72 65  ags;.  saved_pre
27a80 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72  req = pNew->prer
27a90 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75 74  eq;.  saved_nOut
27aa0 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20   = pNew->nOut;. 
27ab0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
27ac0 30 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20  0;.  rLogSize = 
27ad0 65 73 74 4c 6f 67 28 73 71 6c 69 74 65 33 4c 6f  estLog(sqlite3Lo
27ae0 67 45 73 74 28 70 50 72 6f 62 65 2d 3e 61 69 52  gEst(pProbe->aiR
27af0 6f 77 45 73 74 5b 30 5d 29 29 3b 0a 20 20 66 6f  owEst[0]));.  fo
27b00 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
27b10 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70  K && pTerm!=0; p
27b20 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e  Term = whereScan
27b30 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20  Next(&scan)){.  
27b40 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23    int nIn = 0;.#
27b50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
27b60 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
27b70 54 34 0a 20 20 20 20 69 6e 74 20 6e 52 65 63 56  T4.    int nRecV
27b80 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d  alid = pBuilder-
27b90 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64  >nRecValid;.#end
27ba0 69 66 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  if.    if( (pTer
27bb0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
27bc0 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72  _ISNULL || (pTer
27bd0 6d 2d 3e 77 74 46 6c 61 67 73 26 54 45 52 4d 5f  m->wtFlags&TERM_
27be0 56 4e 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20  VNULL)!=0).     
27bf0 26 26 20 28 69 43 6f 6c 3c 30 20 7c 7c 20 70 53  && (iCol<0 || pS
27c00 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  rc->pTab->aCol[i
27c10 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 29 0a 20 20  Col].notNull).  
27c20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69    ){.      conti
27c30 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49  nue; /* ignore I
27c40 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e  S [NOT] NULL con
27c50 73 74 72 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20  straints on NOT 
27c60 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  NULL columns */.
27c70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
27c80 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
27c90 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c   & pNew->maskSel
27ca0 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  f ) continue;.. 
27cb0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
27cc0 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75  >nOut==saved_nOu
27cd0 74 20 29 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e  t );..    pNew->
27ce0 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
27cf0 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65  wsFlags;.    pNe
27d00 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
27d10 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20   saved_nEq;.    
27d20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73  pNew->nLTerm = s
27d30 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20  aved_nLTerm;.   
27d40 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
27d50 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70  size(db, pNew, p
27d60 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29  New->nLTerm+1) )
27d70 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a   break; /* OOM *
27d80 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65  /.    pNew->aLTe
27d90 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  rm[pNew->nLTerm+
27da0 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  +] = pTerm;.    
27db0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 28  pNew->prereq = (
27dc0 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20 70  saved_prereq | p
27dd0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
27de0 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b  t) & ~pNew->mask
27df0 53 65 6c 66 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Self;.    pNew->
27e00 72 52 75 6e 20 3d 20 72 4c 6f 67 53 69 7a 65 3b  rRun = rLogSize;
27e10 20 2f 2a 20 42 61 73 65 6c 69 6e 65 20 63 6f 73   /* Baseline cos
27e20 74 20 69 73 20 6c 6f 67 32 28 4e 29 2e 20 20 41  t is log2(N).  A
27e30 64 6a 75 73 74 6d 65 6e 74 73 20 62 65 6c 6f 77  djustments below
27e40 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72   */.    if( pTer
27e50 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
27e60 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  O_IN ){.      Ex
27e70 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
27e80 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
27e90 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
27ea0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
27eb0 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
27ec0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
27ed0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
27ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22   ){.        /* "
27ef0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
27f00 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68 65  )":  TUNING: the
27f10 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20   SELECT returns 
27f20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  25 rows */.     
27f30 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73     nIn = 46;  as
27f40 73 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65  sert( 46==sqlite
27f50 33 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 20  3LogEst(25) );. 
27f60 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
27f70 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
27f80 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78  List && pExpr->x
27f90 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  .pList->nExpr) )
27fa0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20  {.        /* "x 
27fb0 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65  IN (value, value
27fc0 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20  , ...)" */.     
27fd0 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33     nIn = sqlite3
27fe0 4c 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78 2e  LogEst(pExpr->x.
27ff0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  pList->nExpr);. 
28000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
28010 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 3b 0a  w->rRun += nIn;.
28020 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
28030 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20  ree.nEq++;.     
28040 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52   pNew->nOut = nR
28050 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b  owEst + nInMul +
28060 20 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20   nIn;.    }else 
28070 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
28080 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 29 20 29  ator & (WO_EQ) )
28090 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
280a0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
280b0 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e   (WHERE_COLUMN_N
280c0 55 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ULL|WHERE_COLUMN
280d0 5f 49 4e 29 29 21 3d 30 0a 20 20 20 20 20 20 20  _IN))!=0.       
280e0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6e 49             || nI
280f0 6e 4d 75 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  nMul==0 );.     
28100 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
28110 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
28120 51 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  Q;.      if( iCo
28130 6c 3c 30 20 20 0a 20 20 20 20 20 20 20 7c 7c 20  l<0  .       || 
28140 28 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72  (pProbe->onError
28150 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 6e 49 6e  !=OE_None && nIn
28160 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  Mul==0.         
28170 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72    && pNew->u.btr
28180 65 65 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e  ee.nEq==pProbe->
28190 6e 4b 65 79 43 6f 6c 2d 31 29 0a 20 20 20 20 20  nKeyCol-1).     
281a0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
281b0 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
281c0 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
281d0 4e 5f 49 4e 29 3d 3d 30 20 7c 7c 20 69 43 6f 6c  N_IN)==0 || iCol
281e0 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  <0 );.        pN
281f0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
28200 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20  HERE_ONEROW;.   
28210 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
28220 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a  >u.btree.nEq++;.
28230 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
28240 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e   = nRowEst + nIn
28250 4d 75 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  Mul;.    }else i
28260 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
28270 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c  tor & (WO_ISNULL
28280 29 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ) ){.      pNew-
28290 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
282a0 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20  E_COLUMN_NULL;. 
282b0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
282c0 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20  ee.nEq++;.      
282d0 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 53 20 4e 55  /* TUNING: IS NU
282e0 4c 4c 20 73 65 6c 65 63 74 73 20 32 20 72 6f 77  LL selects 2 row
282f0 73 20 2a 2f 0a 20 20 20 20 20 20 6e 49 6e 20 3d  s */.      nIn =
28300 20 31 30 3b 20 20 61 73 73 65 72 74 28 20 31 30   10;  assert( 10
28310 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
28320 32 29 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  2) );.      pNew
28330 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74  ->nOut = nRowEst
28340 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b   + nInMul + nIn;
28350 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
28360 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
28370 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20  & (WO_GT|WO_GE) 
28380 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
28390 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
283a0 74 6f 72 20 26 20 57 4f 5f 47 54 20 29 3b 0a 20  tor & WO_GT );. 
283b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
283c0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
283d0 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20  & WO_GE );.     
283e0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
283f0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  = WHERE_COLUMN_R
28400 41 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c  ANGE|WHERE_BTM_L
28410 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 42 74 6d  IMIT;.      pBtm
28420 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
28430 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65  pTop = 0;.    }e
28440 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
28450 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  t( pTerm->eOpera
28460 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f  tor & (WO_LT|WO_
28470 4c 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73  LE) );.      tes
28480 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
28490 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 54 20  perator & WO_LT 
284a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
284b0 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
284c0 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  tor & WO_LE );. 
284d0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
284e0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
284f0 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54  MN_RANGE|WHERE_T
28500 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
28510 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pTop = pTerm;.  
28520 20 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77      pBtm = (pNew
28530 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
28540 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20  E_BTM_LIMIT)!=0 
28550 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
28560 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
28570 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
28580 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 20  -2] : 0;.    }. 
28590 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46     if( pNew->wsF
285a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
285b0 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  UMN_RANGE ){.   
285c0 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75     /* Adjust nOu
285d0 74 20 61 6e 64 20 72 52 75 6e 20 66 6f 72 20 53  t and rRun for S
285e0 54 41 54 33 20 72 61 6e 67 65 20 76 61 6c 75 65  TAT3 range value
285f0 73 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  s */.      asser
28600 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73  t( pNew->nOut==s
28610 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20  aved_nOut );.   
28620 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61     whereRangeSca
28630 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
28640 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f  ilder, pBtm, pTo
28650 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a  p, pNew);.    }.
28660 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
28670 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
28680 41 54 34 0a 20 20 20 20 69 66 28 20 6e 49 6e 4d  AT4.    if( nInM
28690 75 6c 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  ul==0 .     && p
286a0 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a  Probe->nSample .
286b0 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e       && pNew->u.
286c0 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62  btree.nEq<=pProb
286d0 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20  e->nSampleCol.  
286e0 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
286f0 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
28700 4c 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20 20  LITE_Stat3) .   
28710 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
28720 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
28730 45 78 70 72 3b 0a 20 20 20 20 20 20 74 52 6f 77  Expr;.      tRow
28740 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20  cnt nOut = 0;.  
28750 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
28760 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
28770 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d  EQ|WO_ISNULL))!=
28780 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  0 ){.        tes
28790 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
287a0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
287b0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
287c0 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
287d0 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
287e0 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  L );.        rc 
287f0 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  = whereEqualScan
28800 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69  Est(pParse, pBui
28810 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 70 52 69  lder, pExpr->pRi
28820 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20  ght, &nOut);.   
28830 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54     }else if( (pT
28840 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
28850 20 57 4f 5f 49 4e 29 0a 20 20 20 20 20 20 20 20   WO_IN).        
28860 20 20 20 20 20 26 26 20 20 21 45 78 70 72 48 61       &&  !ExprHa
28870 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
28880 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 20   EP_xIsSelect)  
28890 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
288a0 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70  whereInScanEst(p
288b0 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
288c0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c   pExpr->x.pList,
288d0 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d   &nOut);.      }
288e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
288f0 4f 75 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  Out==0 || rc==SQ
28900 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
28910 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20   if( nOut ){.   
28920 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
28930 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
28940 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 69  nOut);.        i
28950 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61  f( pNew->nOut>sa
28960 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d  ved_nOut ) pNew-
28970 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
28980 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
28990 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
289a0 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
289b0 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  & (WHERE_IDX_ONL
289c0 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30  Y|WHERE_IPK))==0
289d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 61 63   ){.      /* Eac
289e0 68 20 72 6f 77 20 69 6e 76 6f 6c 76 65 73 20 61  h row involves a
289f0 20 73 74 65 70 20 6f 66 20 74 68 65 20 69 6e 64   step of the ind
28a00 65 78 2c 20 74 68 65 6e 20 61 20 62 69 6e 61 72  ex, then a binar
28a10 79 20 73 65 61 72 63 68 20 6f 66 0a 20 20 20 20  y search of.    
28a20 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20 74 61    ** the main ta
28a30 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  ble */.      pNe
28a40 77 2d 3e 72 52 75 6e 20 3d 20 20 73 71 6c 69 74  w->rRun =  sqlit
28a50 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77  e3LogEstAdd(pNew
28a60 2d 3e 72 52 75 6e 2c 72 4c 6f 67 53 69 7a 65 3e  ->rRun,rLogSize>
28a70 32 37 20 3f 20 72 4c 6f 67 53 69 7a 65 2d 31 37  27 ? rLogSize-17
28a80 20 3a 20 31 30 29 3b 0a 20 20 20 20 7d 0a 20 20   : 10);.    }.  
28a90 20 20 2f 2a 20 53 74 65 70 20 63 6f 73 74 20 66    /* Step cost f
28aa0 6f 72 20 65 61 63 68 20 6f 75 74 70 75 74 20 72  or each output r
28ab0 6f 77 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  ow */.    pNew->
28ac0 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
28ad0 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52  gEstAdd(pNew->rR
28ae0 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b  un, pNew->nOut);
28af0 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75  .    whereLoopOu
28b00 74 70 75 74 41 64 6a 75 73 74 28 70 42 75 69 6c  tputAdjust(pBuil
28b10 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77 29 3b  der->pWC, pNew);
28b20 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
28b30 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
28b40 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 69  er, pNew);.    i
28b50 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  f( (pNew->wsFlag
28b60 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
28b70 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  MIT)==0.     && 
28b80 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
28b90 71 3c 28 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43  q<(pProbe->nKeyC
28ba0 6f 6c 20 2b 20 28 70 50 72 6f 62 65 2d 3e 7a 4e  ol + (pProbe->zN
28bb0 61 6d 65 21 3d 30 29 29 0a 20 20 20 20 29 7b 0a  ame!=0)).    ){.
28bc0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41        whereLoopA
28bd0 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
28be0 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
28bf0 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29  obe, nInMul+nIn)
28c00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
28c10 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
28c20 4f 75 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Out;.#ifdef SQLI
28c30 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
28c40 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 70 42 75  OR_STAT4.    pBu
28c50 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
28c60 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65   = nRecValid;.#e
28c70 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  ndif.  }.  pNew-
28c80 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65 64 5f  >prereq = saved_
28c90 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e  prereq;.  pNew->
28ca0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61  u.btree.nEq = sa
28cb0 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d  ved_nEq;.  pNew-
28cc0 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64  >wsFlags = saved
28cd0 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  _wsFlags;.  pNew
28ce0 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
28cf0 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54  Out;.  pNew->nLT
28d00 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65  erm = saved_nLTe
28d10 72 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  rm;.  return rc;
28d20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
28d30 20 54 72 75 65 20 69 66 20 69 74 20 69 73 20 70   True if it is p
28d40 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70 49 6e  ossible that pIn
28d50 64 65 78 20 6d 69 67 68 74 20 62 65 20 75 73 65  dex might be use
28d60 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d  ful in.** implem
28d70 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52  enting the ORDER
28d80 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70 42   BY clause in pB
28d90 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  uilder..**.** Re
28da0 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20 70 42  turn False if pB
28db0 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74 20  uilder does not 
28dc0 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45 52  contain an ORDER
28dd0 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a   BY clause or.**
28de0 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
28df0 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78 20 74  way for pIndex t
28e00 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e 20 69  o be useful in i
28e10 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61 74  mplementing that
28e20 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61  .** ORDER BY cla
28e30 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
28e40 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c  nt indexMightHel
28e50 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a 20 20  pWithOrderBy(.  
28e60 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
28e70 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e   *pBuilder,.  In
28e80 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69  dex *pIndex,.  i
28e90 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20  nt iCursor.){.  
28ea0 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20  ExprList *pOB;. 
28eb0 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20   int ii, jj;..  
28ec0 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f  if( pIndex->bUno
28ed0 72 64 65 72 65 64 20 29 20 72 65 74 75 72 6e 20  rdered ) return 
28ee0 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20 3d 20  0;.  if( (pOB = 
28ef0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
28f00 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30 20 29  ->pOrderBy)==0 )
28f10 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72   return 0;.  for
28f20 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e  (ii=0; ii<pOB->n
28f30 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
28f40 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73   Expr *pExpr = s
28f50 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
28f60 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d  llate(pOB->a[ii]
28f70 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
28f80 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
28f90 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
28fa0 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
28fb0 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72  >iTable==iCursor
28fc0 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a   ){.      for(jj
28fd0 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e  =0; jj<pIndex->n
28fe0 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20  KeyCol; jj++){. 
28ff0 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
29000 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65  ->iColumn==pInde
29010 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20  x->aiColumn[jj] 
29020 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
29030 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
29040 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
29050 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 69 74 6d  ** Return a bitm
29060 61 73 6b 20 77 68 65 72 65 20 31 73 20 69 6e 64  ask where 1s ind
29070 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 63  icate that the c
29080 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c  orresponding col
29090 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61  umn of.** the ta
290a0 62 6c 65 20 69 73 20 75 73 65 64 20 62 79 20 61  ble is used by a
290b0 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74  n index.  Only t
290c0 68 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c 75  he first 63 colu
290d0 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  mns are consider
290e0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  ed..*/.static Bi
290f0 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49  tmask columnsInI
29100 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78  ndex(Index *pIdx
29110 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d  ){.  Bitmask m =
29120 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66   0;.  int j;.  f
29130 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  or(j=pIdx->nColu
29140 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  mn-1; j>=0; j--)
29150 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49  {.    int x = pI
29160 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
29170 0a 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b  .    if( x>=0 ){
29180 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
29190 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20   x==BMS-1 );.   
291a0 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
291b0 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 69  BMS-2 );.      i
291c0 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c  f( x<BMS-1 ) m |
291d0 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20  = MASKBIT(x);.  
291e0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
291f0 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20   m;.}../* Check 
29200 74 6f 20 73 65 65 20 69 66 20 61 20 70 61 72 74  to see if a part
29210 69 61 6c 20 69 6e 64 65 78 20 77 69 74 68 20 70  ial index with p
29220 50 61 72 74 49 6e 64 65 78 57 68 65 72 65 20 63  PartIndexWhere c
29230 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e  an be used.** in
29240 20 74 68 65 20 63 75 72 72 65 6e 74 20 71 75 65   the current que
29250 72 79 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  ry.  Return true
29260 20 69 66 20 69 74 20 63 61 6e 20 62 65 20 61 6e   if it can be an
29270 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  d false if not..
29280 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
29290 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c  ereUsablePartial
292a0 49 6e 64 65 78 28 69 6e 74 20 69 54 61 62 2c 20  Index(int iTab, 
292b0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
292c0 2c 20 45 78 70 72 20 2a 70 57 68 65 72 65 29 7b  , Expr *pWhere){
292d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
292e0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
292f0 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70  for(i=0, pTerm=p
29300 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
29310 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
29320 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
29330 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
29340 70 72 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  pr(pTerm->pExpr,
29350 20 70 57 68 65 72 65 2c 20 69 54 61 62 29 20 29   pWhere, iTab) )
29360 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
29370 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
29380 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
29390 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
293a0 72 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  r a single table
293b0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77 68 65   of the join whe
293c0 72 65 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  re the table.** 
293d0 69 73 20 69 64 65 6e 66 69 65 64 20 62 79 20 70  is idenfied by p
293e0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69  Builder->pNew->i
293f0 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65  Tab.  That table
29400 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
29410 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65  o be.** a b-tree
29420 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69   table, not a vi
29430 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a  rtual table..*/.
29440 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
29450 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 0a 20 20  LoopAddBtree(.  
29460 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
29470 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57   *pBuilder, /* W
29480 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f  HERE clause info
29490 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  rmation */.  Bit
294a0 6d 61 73 6b 20 6d 45 78 74 72 61 20 20 20 20 20  mask mExtra     
294b0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
294c0 61 20 70 72 65 72 65 71 75 65 73 69 74 65 73 20  a prerequesites 
294d0 66 6f 72 20 75 73 69 6e 67 20 74 68 69 73 20 74  for using this t
294e0 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  able */.){.  Whe
294f0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
29500 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52           /* WHER
29510 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65  E analysis conte
29520 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
29530 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20  Probe;          
29540 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
29550 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e  we are evaluatin
29560 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b  g */.  Index sPk
29570 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29580 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64     /* A fake ind
29590 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  ex object for th
295a0 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f  e primary key */
295b0 0a 20 20 74 52 6f 77 63 6e 74 20 61 69 52 6f 77  .  tRowcnt aiRow
295c0 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20 2f  EstPk[2];      /
295d0 2a 20 54 68 65 20 61 69 52 6f 77 45 73 74 5b 5d  * The aiRowEst[]
295e0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
295f0 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31  Pk index */.  i1
29600 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d  6 aiColumnPk = -
29610 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  1;        /* The
29620 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65   aColumn[] value
29630 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64   for the sPk ind
29640 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ex */.  SrcList 
29650 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20  *pTabList;      
29660 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
29670 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
29680 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
29690 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46  *pSrc;  /* The F
296a0 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65  ROM clause btree
296b0 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a   term to add */.
296c0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
296d0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  w;            /*
296e0 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c   Template WhereL
296f0 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
29700 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
29710 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52  OK;         /* R
29720 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
29730 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31  int iSortIdx = 1
29740 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
29750 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
29760 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20   int b;         
29770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29780 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20  A boolean value 
29790 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a  */.  LogEst rSiz
297a0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
297b0 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f   /* number of ro
297c0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
297d0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67  */.  LogEst rLog
297e0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
297f0 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66   /* Logarithm of
29800 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
29810 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
29820 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
29830 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
29840 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20    /* The parsed 
29850 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
29860 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
29870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29880 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   Table being que
29890 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65  ried */.  .  pNe
298a0 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
298b0 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70  ew;.  pWInfo = p
298c0 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
298d0 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57  .  pTabList = pW
298e0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
298f0 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73    pSrc = pTabLis
29900 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61  t->a + pNew->iTa
29910 62 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  b;.  pTab = pSrc
29920 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20  ->pTab;.  pWC = 
29930 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
29940 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72 74   assert( !IsVirt
29950 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20  ual(pSrc->pTab) 
29960 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e  );..  if( pSrc->
29970 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a  pIndex ){.    /*
29980 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   An INDEXED BY c
29990 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73 20  lause specifies 
299a0 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
299b0 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20  ex to use */.   
299c0 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e   pProbe = pSrc->
299d0 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20  pIndex;.  }else 
299e0 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
299f0 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62  ab) ){.    pProb
29a00 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  e = pTab->pIndex
29a10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
29a20 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e  * There is no IN
29a30 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e  DEXED BY clause.
29a40 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20    Create a fake 
29a50 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20  Index object in 
29a60 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72  local.    ** var
29a70 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70  iable sPk to rep
29a80 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64  resent the rowid
29a90 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
29aa0 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20  ex.  Make this. 
29ab0 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78     ** fake index
29ac0 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
29ad0 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f  chain of Index o
29ae0 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20  bjects with all 
29af0 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20  of the real.    
29b00 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f  ** indices to fo
29b10 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65  llow */.    Inde
29b20 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  x *pFirst;      
29b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
29b40 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64  irst of real ind
29b50 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
29b60 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  e */.    memset(
29b70 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sPk, 0, sizeof(
29b80 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b  Index));.    sPk
29b90 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20  .nKeyCol = 1;.  
29ba0 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d    sPk.aiColumn =
29bb0 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20   &aiColumnPk;.  
29bc0 20 20 73 50 6b 2e 61 69 52 6f 77 45 73 74 20 3d    sPk.aiRowEst =
29bd0 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20   aiRowEstPk;.   
29be0 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f   sPk.onError = O
29bf0 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20 20 73  E_Replace;.    s
29c00 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  Pk.pTable = pTab
29c10 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b  ;.    aiRowEstPk
29c20 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77  [0] = pTab->nRow
29c30 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Est;.    aiRowEs
29c40 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20  tPk[1] = 1;.    
29c50 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70  pFirst = pSrc->p
29c60 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
29c70 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e   if( pSrc->notIn
29c80 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  dexed==0 ){.    
29c90 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e    /* The real in
29ca0 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62  dices of the tab
29cb0 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73  le are only cons
29cc0 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20  idered if the.  
29cd0 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58      ** NOT INDEX
29ce0 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  ED qualifier is 
29cf0 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
29d00 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
29d10 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20        sPk.pNext 
29d20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a  = pFirst;.    }.
29d30 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50      pProbe = &sP
29d40 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d  k;.  }.  rSize =
29d50 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70   sqlite3LogEst(p
29d60 54 61 62 2d 3e 6e 52 6f 77 45 73 74 29 3b 0a 20  Tab->nRowEst);. 
29d70 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c   rLogSize = estL
29d80 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e  og(rSize);..#ifn
29d90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
29da0 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
29db0 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69    /* Automatic i
29dc0 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20  ndexes */.  if( 
29dd0 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65  !pBuilder->pOrSe
29de0 74 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d  t.   && (pWInfo-
29df0 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  >pParse->db->fla
29e00 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f  gs & SQLITE_Auto
29e10 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26 26 20  Index)!=0.   && 
29e20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a  pSrc->pIndex==0.
29e30 20 20 20 26 26 20 21 70 53 72 63 2d 3e 76 69 61     && !pSrc->via
29e40 43 6f 72 6f 75 74 69 6e 65 0a 20 20 20 26 26 20  Coroutine.   && 
29e50 21 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65  !pSrc->notIndexe
29e60 64 0a 20 20 20 26 26 20 48 61 73 52 6f 77 69 64  d.   && HasRowid
29e70 28 70 54 61 62 29 0a 20 20 20 26 26 20 21 70 53  (pTab).   && !pS
29e80 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64  rc->isCorrelated
29e90 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e  .  ){.    /* Gen
29ea0 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78  erate auto-index
29eb0 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20   WhereLoops */. 
29ec0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
29ed0 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65  erm;.    WhereTe
29ee0 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43  rm *pWCEnd = pWC
29ef0 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d  ->a + pWC->nTerm
29f00 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
29f10 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49  pWC->a; rc==SQLI
29f20 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70  TE_OK && pTerm<p
29f30 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
29f40 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
29f50 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
29f60 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29  pNew->maskSelf )
29f70 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
29f80 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
29f90 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
29fa0 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  rc, 0) ){.      
29fb0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
29fc0 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nEq = 1;.       
29fd0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70   pNew->u.btree.p
29fe0 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
29ff0 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
2a000 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 1;.        pNe
2a010 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70  w->aLTerm[0] = p
2a020 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a  Term;.        /*
2a030 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d   TUNING: One-tim
2a040 65 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75  e cost for compu
2a050 74 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74  ting the automat
2a060 69 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20  ic index is.    
2a070 20 20 20 20 2a 2a 20 61 70 70 72 6f 78 69 6d 61      ** approxima
2a080 74 65 6c 79 20 37 2a 4e 2a 6c 6f 67 32 28 4e 29  tely 7*N*log2(N)
2a090 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
2a0a0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
2a0b0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
2a0c0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64   table being ind
2a0d0 65 78 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  exed. */.       
2a0e0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
2a0f0 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a 65  rLogSize + rSize
2a100 20 2b 20 32 38 3b 20 20 61 73 73 65 72 74 28 20   + 28;  assert( 
2a110 32 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  28==sqlite3LogEs
2a120 74 28 37 29 20 29 3b 0a 20 20 20 20 20 20 20 20  t(7) );.        
2a130 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63 68 20  /* TUNING: Each 
2a140 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65  index lookup yie
2a150 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e 20 74  lds 20 rows in t
2a160 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 0a  he table.  This.
2a170 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f          ** is mo
2a180 72 65 20 74 68 61 6e 20 74 68 65 20 75 73 75 61  re than the usua
2a190 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20 72 6f  l guess of 10 ro
2a1a0 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68 61 76  ws, since we hav
2a1b0 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20 20 20  e no way.       
2a1c0 20 2a 2a 20 6f 66 20 6b 6e 6f 77 6e 69 6e 67 20   ** of knowning 
2a1d0 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20 74 68  how selective th
2a1e0 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74  e index will ult
2a1f0 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49 74 20  imately be.  It 
2a200 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  would.        **
2a210 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73 6f 6e   not be unreason
2a220 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68 69  able to make thi
2a230 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c 61 72  s value much lar
2a240 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ger. */.        
2a250 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b  pNew->nOut = 43;
2a260 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d 73 71    assert( 43==sq
2a270 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 30 29 20  lite3LogEst(20) 
2a280 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
2a290 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
2a2a0 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a  ogEstAdd(rLogSiz
2a2b0 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20  e,pNew->nOut);. 
2a2c0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
2a2d0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41 55 54  lags = WHERE_AUT
2a2e0 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20  O_INDEX;.       
2a2f0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
2a300 6d 45 78 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e  mExtra | pTerm->
2a310 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
2a320 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2a330 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
2a340 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
2a350 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
2a360 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2a370 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
2a380 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  EX */..  /* Loop
2a390 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63 65   over all indice
2a3a0 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72  s.  */.  for(; r
2a3b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2a3c0 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70  pProbe; pProbe=p
2a3d0 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53  Probe->pNext, iS
2a3e0 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69  ortIdx++){.    i
2a3f0 66 28 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74  f( pProbe->pPart
2a400 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20  IdxWhere!=0.    
2a410 20 26 26 20 21 77 68 65 72 65 55 73 61 62 6c 65   && !whereUsable
2a420 50 61 72 74 69 61 6c 49 6e 64 65 78 28 70 4e 65  PartialIndex(pNe
2a430 77 2d 3e 69 54 61 62 2c 20 70 57 43 2c 20 70 50  w->iTab, pWC, pP
2a440 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68  robe->pPartIdxWh
2a450 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  ere) ){.      co
2a460 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74  ntinue;  /* Part
2a470 69 61 6c 20 69 6e 64 65 78 20 69 6e 61 70 70 72  ial index inappr
2a480 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 69 73  opriate for this
2a490 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a   query */.    }.
2a4a0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
2a4b0 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70  e.nEq = 0;.    p
2a4c0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b  New->nLTerm = 0;
2a4d0 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74  .    pNew->iSort
2a4e0 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Idx = 0;.    pNe
2a4f0 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
2a500 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
2a510 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e  = mExtra;.    pN
2a520 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
2a530 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
2a540 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72  ree.pIndex = pPr
2a550 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64  obe;.    b = ind
2a560 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f  exMightHelpWithO
2a570 72 64 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c  rderBy(pBuilder,
2a580 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69   pProbe, pSrc->i
2a590 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20  Cursor);.    /* 
2a5a0 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49  The ONEPASS_DESI
2a5b0 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20  RED flags never 
2a5c0 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65 72 20  occurs together 
2a5d0 77 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f  with ORDER BY */
2a5e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 57  .    assert( (pW
2a5f0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2a600 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
2a610 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20  _DESIRED)==0 || 
2a620 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b==0 );.    if( 
2a630 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20  pProbe->tnum<=0 
2a640 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65  ){.      /* Inte
2a650 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ger primary key 
2a660 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70  index */.      p
2a670 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
2a680 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20  HERE_IPK;..     
2a690 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73   /* Full table s
2a6a0 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  can */.      pNe
2a6b0 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20  w->iSortIdx = b 
2a6c0 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a  ? iSortIdx : 0;.
2a6d0 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
2a6e0 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61   Cost of full ta
2a6f0 62 6c 65 20 73 63 61 6e 20 69 73 20 33 2a 28 4e  ble scan is 3*(N
2a700 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20 20 20   + log2(N))..   
2a710 20 20 20 2a 2a 20 20 2b 20 20 54 68 65 20 65 78     **  +  The ex
2a720 74 72 61 20 33 20 66 61 63 74 6f 72 20 69 73 20  tra 3 factor is 
2a730 74 6f 20 65 6e 63 6f 75 72 61 67 65 20 74 68 65  to encourage the
2a740 20 75 73 65 20 6f 66 20 69 6e 64 65 78 65 64 20   use of indexed 
2a750 6c 6f 6f 6b 75 70 73 0a 20 20 20 20 20 20 2a 2a  lookups.      **
2a760 20 20 20 20 20 6f 76 65 72 20 66 75 6c 6c 20 73       over full s
2a770 63 61 6e 73 2e 20 20 46 49 58 4d 45 20 2a 2f 0a  cans.  FIXME */.
2a780 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
2a790 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
2a7a0 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69  Add(rSize,rLogSi
2a7b0 7a 65 29 20 2b 20 31 36 3b 0a 20 20 20 20 20 20  ze) + 16;.      
2a7c0 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
2a7d0 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77 29  djust(pWC, pNew)
2a7e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  ;.      rc = whe
2a7f0 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
2a800 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
2a810 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2a820 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66   rSize;.      if
2a830 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
2a840 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42    }else{.      B
2a850 69 74 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20  itmask m;.      
2a860 69 66 28 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f  if( pProbe->isCo
2a870 76 65 72 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  vering ){.      
2a880 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2a890 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  = WHERE_IDX_ONLY
2a8a0 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   | WHERE_INDEXED
2a8b0 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 30 3b  ;.        m = 0;
2a8c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2a8d0 20 20 20 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e        m = pSrc->
2a8e0 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d  colUsed & ~colum
2a8f0 6e 73 49 6e 49 6e 64 65 78 28 70 50 72 6f 62 65  nsInIndex(pProbe
2a900 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
2a910 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30  >wsFlags = (m==0
2a920 29 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f  ) ? (WHERE_IDX_O
2a930 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45  NLY|WHERE_INDEXE
2a940 44 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58  D) : WHERE_INDEX
2a950 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ED;.      }..   
2a960 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20     /* Full scan 
2a970 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  via index */.   
2a980 20 20 20 69 66 28 20 62 0a 20 20 20 20 20 20 20     if( b.       
2a990 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20  || ( m==0.      
2a9a0 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55     && pProbe->bU
2a9b0 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20  nordered==0.    
2a9c0 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e       && pProbe->
2a9d0 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73  szIdxRow<pTab->s
2a9e0 7a 54 61 62 52 6f 77 0a 20 20 20 20 20 20 20 20  zTabRow.        
2a9f0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
2aa00 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2aa10 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
2aa20 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
2aa30 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2aa40 66 69 67 2e 62 55 73 65 43 69 73 0a 20 20 20 20  fig.bUseCis.    
2aa50 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61       && Optimiza
2aa60 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e  tionEnabled(pWIn
2aa70 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  fo->pParse->db, 
2aa80 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53  SQLITE_CoverIdxS
2aa90 63 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20 29  can).          )
2aaa0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2aab0 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78    pNew->iSortIdx
2aac0 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20   = b ? iSortIdx 
2aad0 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  : 0;.        if(
2aae0 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   m==0 ){.       
2aaf0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
2ab00 73 74 20 6f 66 20 61 20 63 6f 76 65 72 69 6e 67  st of a covering
2ab10 20 69 6e 64 65 78 20 73 63 61 6e 20 69 73 20 4b   index scan is K
2ab20 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a  *(N + log2(N))..
2ab30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20            **  + 
2ab40 20 54 68 65 20 65 78 74 72 61 20 66 61 63 74 6f   The extra facto
2ab50 72 20 4b 20 6f 66 20 62 65 74 77 65 65 6e 20 31  r K of between 1
2ab60 2e 31 20 61 6e 64 20 33 2e 30 20 74 68 61 74 20  .1 and 3.0 that 
2ab70 64 65 70 65 6e 64 73 0a 20 20 20 20 20 20 20 20  depends.        
2ab80 20 20 2a 2a 20 20 20 20 20 6f 6e 20 74 68 65 20    **     on the 
2ab90 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f  relative sizes o
2aba0 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  f the table and 
2abb0 74 68 65 20 69 6e 64 65 78 2e 20 20 4b 0a 20 20  the index.  K.  
2abc0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69          **     i
2abd0 73 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 73 6d  s smaller for sm
2abe0 61 6c 6c 65 72 20 69 6e 64 69 63 65 73 2c 20 74  aller indices, t
2abf0 68 75 73 20 66 61 76 6f 72 69 6e 67 20 74 68 65  hus favoring the
2ac00 6d 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  m..          */.
2ac10 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2ac20 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
2ac30 67 45 73 74 41 64 64 28 72 53 69 7a 65 2c 72 4c  gEstAdd(rSize,rL
2ac40 6f 67 53 69 7a 65 29 20 2b 20 31 20 2b 0a 20 20  ogSize) + 1 +.  
2ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac60 20 20 20 20 20 20 28 31 35 2a 70 50 72 6f 62 65        (15*pProbe
2ac70 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54 61 62  ->szIdxRow)/pTab
2ac80 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20  ->szTabRow;.    
2ac90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2aca0 20 20 20 20 20 61 73 73 65 72 74 28 20 62 21 3d       assert( b!=
2acb0 30 20 29 3b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ); .          
2acc0 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
2acd0 6f 66 20 73 63 61 6e 6e 69 6e 67 20 61 20 6e 6f  of scanning a no
2ace0 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
2acf0 20 69 73 20 28 4e 2b 31 29 2a 6c 6f 67 32 28 4e   is (N+1)*log2(N
2ad00 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77  ).          ** w
2ad10 68 69 63 68 20 77 65 20 77 69 6c 6c 20 73 69 6d  hich we will sim
2ad20 70 6c 69 66 79 20 74 6f 20 6a 75 73 74 20 4e 2a  plify to just N*
2ad30 6c 6f 67 32 28 4e 29 20 2a 2f 0a 20 20 20 20 20  log2(N) */.     
2ad40 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2ad50 3d 20 72 53 69 7a 65 20 2b 20 72 4c 6f 67 53 69  = rSize + rLogSi
2ad60 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ze;.        }.  
2ad70 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f        whereLoopO
2ad80 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c  utputAdjust(pWC,
2ad90 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   pNew);.        
2ada0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
2adb0 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
2adc0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  New);.        pN
2add0 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
2ade0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2adf0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2ae00 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  }.    }..    rc 
2ae10 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
2ae20 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
2ae30 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
2ae40 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   0);.#ifdef SQLI
2ae50 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
2ae60 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c  OR_STAT4.    sql
2ae70 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 46 72  ite3Stat4ProbeFr
2ae80 65 65 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65  ee(pBuilder->pRe
2ae90 63 29 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72  c);.    pBuilder
2aea0 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b  ->nRecValid = 0;
2aeb0 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70  .    pBuilder->p
2aec0 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Rec = 0;.#endif.
2aed0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
2aee0 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20   was an INDEXED 
2aef0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
2af00 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e  only that one in
2af10 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f  dex is.    ** co
2af20 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20  nsidered. */.   
2af30 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65   if( pSrc->pInde
2af40 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  x ) break;.  }. 
2af50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
2af60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2af70 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2af80 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68  /*.** Add all Wh
2af90 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
2afa0 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74  for a table of t
2afb0 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69  he join identifi
2afc0 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65  ed by.** pBuilde
2afd0 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20  r->pNew->iTab.  
2afe0 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75  That table is gu
2aff0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
2b000 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
2b010 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
2b020 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
2b030 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  l(.  WhereLoopBu
2b040 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 20  ilder *pBuilder 
2b050 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
2b060 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
2b070 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
2b080 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
2b090 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c     /* WHERE anal
2b0a0 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ysis context */.
2b0b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
2b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b0d0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
2b0e0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
2b0f0 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20  Clause *pWC;    
2b100 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
2b110 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
2b120 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2b130 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a  item *pSrc;   /*
2b140 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
2b150 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   term to search 
2b160 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
2b170 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
2b180 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
2b190 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b  _info *pIdxInfo;
2b1a0 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
2b1b0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
2b1c0 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
2b1d0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
2b1e0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
2b1f0 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
2b200 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
2b210 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  m;.  int i, j;. 
2b220 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54 65   int iTerm, mxTe
2b230 72 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74  rm;.  int nConst
2b240 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65 65  raint;.  int see
2b250 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nIn = 0;        
2b260 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2b270 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   an IN operator 
2b280 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74  is seen */.  int
2b290 20 73 65 65 6e 56 61 72 20 3d 20 30 3b 20 20 20   seenVar = 0;   
2b2a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2b2b0 65 20 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74  e if a non-const
2b2c0 61 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  ant constraint i
2b2d0 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  s seen */.  int 
2b2e0 69 50 68 61 73 65 3b 20 20 20 20 20 20 20 20 20  iPhase;         
2b2f0 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 63           /* 0: c
2b300 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20  onst w/o IN, 1: 
2b310 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c  const, 2: no IN,
2b320 20 20 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65    2: IN */.  Whe
2b330 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20  reLoop *pNew;.  
2b340 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2b350 4f 4b 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20  OK;..  pWInfo = 
2b360 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
2b370 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ;.  pParse = pWI
2b380 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  nfo->pParse;.  d
2b390 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2b3a0 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
2b3b0 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20  ->pWC;.  pNew = 
2b3c0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
2b3d0 20 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f    pSrc = &pWInfo
2b3e0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e  ->pTabList->a[pN
2b3f0 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54 61  ew->iTab];.  pTa
2b400 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  b = pSrc->pTab;.
2b410 20 20 61 73 73 65 72 74 28 20 49 73 56 69 72 74    assert( IsVirt
2b420 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 20 20 70  ual(pTab) );.  p
2b430 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61  IdxInfo = alloca
2b440 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72  teIndexInfo(pPar
2b450 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 70  se, pWC, pSrc, p
2b460 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42  Builder->pOrderB
2b470 79 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e  y);.  if( pIdxIn
2b480 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  fo==0 ) return S
2b490 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70  QLITE_NOMEM;.  p
2b4a0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b  New->prereq = 0;
2b4b0 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20  .  pNew->rSetup 
2b4c0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46  = 0;.  pNew->wsF
2b4d0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52  lags = WHERE_VIR
2b4e0 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65  TUALTABLE;.  pNe
2b4f0 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20  w->nLTerm = 0;. 
2b500 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
2b510 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 70 55  edFree = 0;.  pU
2b520 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  sage = pIdxInfo-
2b530 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
2b540 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74  e;.  nConstraint
2b550 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   = pIdxInfo->nCo
2b560 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28 20  nstraint;.  if( 
2b570 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
2b580 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74  db, pNew, nConst
2b590 72 61 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71  raint) ){.    sq
2b5a0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2b5b0 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 72  pIdxInfo);.    r
2b5c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2b5d0 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69  EM;.  }..  for(i
2b5e0 50 68 61 73 65 3d 30 3b 20 69 50 68 61 73 65 3c  Phase=0; iPhase<
2b5f0 3d 33 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a 20  =3; iPhase++){. 
2b600 20 20 20 69 66 28 20 21 73 65 65 6e 49 6e 20 26     if( !seenIn &
2b610 26 20 28 69 50 68 61 73 65 26 31 29 21 3d 30 20  & (iPhase&1)!=0 
2b620 29 7b 0a 20 20 20 20 20 20 69 50 68 61 73 65 2b  ){.      iPhase+
2b630 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 68  +;.      if( iPh
2b640 61 73 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a 20  ase>3 ) break;. 
2b650 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65     }.    if( !se
2b660 65 6e 56 61 72 20 26 26 20 69 50 68 61 73 65 3e  enVar && iPhase>
2b670 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  1 ) break;.    p
2b680 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
2b690 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
2b6a0 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
2b6b0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
2b6c0 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  aint;.    for(i=
2b6d0 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; i<pIdxInfo->n
2b6e0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
2b6f0 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20   pIdxCons++){.  
2b700 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73      j = pIdxCons
2b710 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20  ->iTermOffset;. 
2b720 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
2b730 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 73  C->a[j];.      s
2b740 77 69 74 63 68 28 20 69 50 68 61 73 65 20 29 7b  witch( iPhase ){
2b750 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 30 3a  .        case 0:
2b760 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73      /* Constants
2b770 20 77 69 74 68 6f 75 74 20 49 4e 20 6f 70 65 72   without IN oper
2b780 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  ator */.        
2b790 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
2b7a0 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  le = 0;.        
2b7b0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
2b7c0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
2b7d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2b7e0 20 20 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a 20     seenIn = 1;. 
2b7f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b800 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
2b810 70 72 65 72 65 71 52 69 67 68 74 21 3d 30 20 29  prereqRight!=0 )
2b820 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
2b830 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20 20  enVar = 1;.     
2b840 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
2b850 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2b860 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a   & WO_IN)==0 ){.
2b870 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
2b880 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31  Cons->usable = 1
2b890 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2b8a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2b8b0 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 20         case 1:  
2b8c0 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77    /* Constants w
2b8d0 69 74 68 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  ith IN operators
2b8e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
2b8f0 73 65 72 74 28 20 73 65 65 6e 49 6e 20 29 3b 0a  sert( seenIn );.
2b900 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
2b910 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54  ns->usable = (pT
2b920 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
2b930 3d 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ==0);.          
2b940 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
2b950 61 73 65 20 32 3a 20 20 20 20 2f 2a 20 56 61 72  ase 2:    /* Var
2b960 69 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49  iables without I
2b970 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  N */.          a
2b980 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 29  ssert( seenVar )
2b990 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  ;.          pIdx
2b9a0 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28  Cons->usable = (
2b9b0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2b9c0 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20   & WO_IN)==0;.  
2b9d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2b9e0 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
2b9f0 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77    /* Variables w
2ba00 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20  ith IN */.      
2ba10 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e      assert( seen
2ba20 56 61 72 20 26 26 20 73 65 65 6e 49 6e 20 29 3b  Var && seenIn );
2ba30 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43  .          pIdxC
2ba40 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b  ons->usable = 1;
2ba50 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2ba60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ba70 20 20 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67      memset(pUsag
2ba80 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73  e, 0, sizeof(pUs
2ba90 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f  age[0])*pIdxInfo
2baa0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  ->nConstraint);.
2bab0 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f      if( pIdxInfo
2bac0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
2bad0 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  tr ) sqlite3_fre
2bae0 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  e(pIdxInfo->idxS
2baf0 74 72 29 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  tr);.    pIdxInf
2bb00 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20  o->idxStr = 0;. 
2bb10 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
2bb20 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Num = 0;.    pId
2bb30 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
2bb40 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  eIdxStr = 0;.   
2bb50 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
2bb60 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a  ByConsumed = 0;.
2bb70 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73      pIdxInfo->es
2bb80 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51  timatedCost = SQ
2bb90 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28  LITE_BIG_DBL / (
2bba0 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20 72 63  double)2;.    rc
2bbb0 20 3d 20 76 74 61 62 42 65 73 74 49 6e 64 65 78   = vtabBestIndex
2bbc0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
2bbd0 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66  IdxInfo);.    if
2bbe0 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72  ( rc ) goto wher
2bbf0 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69  eLoopAddVtab_exi
2bc00 74 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20  t;.    pIdxCons 
2bc10 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
2bc20 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
2bc30 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
2bc40 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
2bc50 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
2bc60 20 30 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d   0;.    mxTerm =
2bc70 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28   -1;.    assert(
2bc80 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e   pNew->nLSlot>=n
2bc90 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20  Constraint );.  
2bca0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
2bcb0 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70  nstraint; i++) p
2bcc0 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d  New->aLTerm[i] =
2bcd0 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e   0;.    pNew->u.
2bce0 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20  vtab.omitMask = 
2bcf0 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
2bd00 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  i<nConstraint; i
2bd10 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b  ++, pIdxCons++){
2bd20 0a 20 20 20 20 20 20 69 66 28 20 28 69 54 65 72  .      if( (iTer
2bd30 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72  m = pUsage[i].ar
2bd40 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20  gvIndex - 1)>=0 
2bd50 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70  ){.        j = p
2bd60 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66  IdxCons->iTermOf
2bd70 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66  fset;.        if
2bd80 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72  ( iTerm>=nConstr
2bd90 61 69 6e 74 0a 20 20 20 20 20 20 20 20 20 7c 7c  aint.         ||
2bda0 20 6a 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c   j<0.         ||
2bdb0 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20   j>=pWC->nTerm. 
2bdc0 20 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d          || pNew-
2bdd0 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d  >aLTerm[iTerm]!=
2bde0 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
2bdf0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2be00 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
2be10 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2be20 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 2e  Msg(pParse, "%s.
2be30 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d 61 6c  xBestIndex() mal
2be40 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d  function", pTab-
2be50 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
2be60 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f     goto whereLoo
2be70 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20  pAddVtab_exit;. 
2be80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2be90 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d   testcase( iTerm
2bea0 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20  ==nConstraint-1 
2beb0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
2bec0 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20  ase( j==0 );.   
2bed0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
2bee0 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29  ==pWC->nTerm-1 )
2bef0 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  ;.        pTerm 
2bf00 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20  = &pWC->a[j];.  
2bf10 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
2bf20 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65  eq |= pTerm->pre
2bf30 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20  reqRight;.      
2bf40 20 20 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c    assert( iTerm<
2bf50 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a  pNew->nLSlot );.
2bf60 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c          pNew->aL
2bf70 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54  Term[iTerm] = pT
2bf80 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  erm;.        if(
2bf90 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20   iTerm>mxTerm ) 
2bfa0 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a  mxTerm = iTerm;.
2bfb0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2bfc0 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20  ( iTerm==15 );. 
2bfd0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2bfe0 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20   iTerm==16 );.  
2bff0 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c        if( iTerm<
2c000 31 36 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e  16 && pUsage[i].
2c010 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76  omit ) pNew->u.v
2c020 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20  tab.omitMask |= 
2c030 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20  1<<iTerm;.      
2c040 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
2c050 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
2c060 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2c070 20 69 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f   if( pUsage[i].o
2c080 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
2c090 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
2c0a0 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
2c0b0 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20  n IN constraint 
2c0c0 69 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  if the virtual t
2c0d0 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
2c0e0 20 2a 2a 20 73 61 79 73 20 74 68 61 74 20 74 68   ** says that th
2c0f0 65 20 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20  e equivalent EQ 
2c100 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f  constraint canno
2c110 74 20 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74  t be safely omit
2c120 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ted..           
2c130 20 2a 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74   ** If we do att
2c140 65 6d 70 74 20 74 6f 20 75 73 65 20 73 75 63 68  empt to use such
2c150 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73   a constraint, s
2c160 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62  ome rows might b
2c170 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
2c180 20 72 65 70 65 61 74 65 64 20 69 6e 20 74 68 65   repeated in the
2c190 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20   output. */.    
2c1a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2c1b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c1c0 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61       /* A virtua
2c1d0 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  l table that is 
2c1e0 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61  constrained by a
2c1f0 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20  n IN clause may 
2c200 6e 6f 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  not.          **
2c210 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44   consume the ORD
2c220 45 52 20 42 59 20 63 6c 61 75 73 65 20 62 65 63  ER BY clause bec
2c230 61 75 73 65 20 28 31 29 20 74 68 65 20 6f 72 64  ause (1) the ord
2c240 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20  er of IN terms. 
2c250 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e           ** is n
2c260 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72  ot necessarily r
2c270 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72  elated to the or
2c280 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65  der of output te
2c290 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20  rms and.        
2c2a0 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c    ** (2) Multipl
2c2b0 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61  e outputs from a
2c2c0 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65   single IN value
2c2d0 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a   will not merge.
2c2e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67            ** tog
2c2f0 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20  ether.  */.     
2c300 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f       pIdxInfo->o
2c310 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d  rderByConsumed =
2c320 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
2c330 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2c340 69 66 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69  if( i>=nConstrai
2c350 6e 74 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  nt ){.      pNew
2c360 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72  ->nLTerm = mxTer
2c370 6d 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  m+1;.      asser
2c380 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c  t( pNew->nLTerm<
2c390 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b  =pNew->nLSlot );
2c3a0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  .      pNew->u.v
2c3b0 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64  tab.idxNum = pId
2c3c0 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20  xInfo->idxNum;. 
2c3d0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
2c3e0 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64  b.needFree = pId
2c3f0 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
2c400 65 49 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70  eIdxStr;.      p
2c410 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
2c420 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20  reeIdxStr = 0;. 
2c430 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
2c440 62 2e 69 64 78 53 74 72 20 3d 20 70 49 64 78 49  b.idxStr = pIdxI
2c450 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20  nfo->idxStr;.   
2c460 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2c470 69 73 4f 72 64 65 72 65 64 20 3d 20 28 75 38 29  isOrdered = (u8)
2c480 28 28 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64  ((pIdxInfo->nOrd
2c490 65 72 42 79 21 3d 30 29 0a 20 20 20 20 20 20 20  erBy!=0).       
2c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
2c4c0 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
2c4d0 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 20  ByConsumed);.   
2c4e0 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
2c4f0 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 0;.      pNew-
2c500 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
2c510 6f 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28  ogEstFromDouble(
2c520 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
2c530 74 65 64 43 6f 73 74 29 3b 0a 20 20 20 20 20 20  tedCost);.      
2c540 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 76 65 72 79  /* TUNING: Every
2c550 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 71   virtual table q
2c560 75 65 72 79 20 72 65 74 75 72 6e 73 20 32 35 20  uery returns 25 
2c570 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 70 4e  rows */.      pN
2c580 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 36 3b 20 20  ew->nOut = 46;  
2c590 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71 6c 69  assert( 46==sqli
2c5a0 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20 29 3b  te3LogEst(25) );
2c5b0 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
2c5c0 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
2c5d0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66   pNew);.      if
2c5e0 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e  ( pNew->u.vtab.n
2c5f0 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20  eedFree ){.     
2c600 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2c610 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
2c620 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  Str);.        pN
2c630 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
2c640 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ree = 0;.      }
2c650 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a 77 68  .    }.  }  ..wh
2c660 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65  ereLoopAddVtab_e
2c670 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64 78 49  xit:.  if( pIdxI
2c680 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
2c690 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f  dxStr ) sqlite3_
2c6a0 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69  free(pIdxInfo->i
2c6b0 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  dxStr);.  sqlite
2c6c0 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78  3DbFree(db, pIdx
2c6d0 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20  Info);.  return 
2c6e0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
2c6f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2c700 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
2c710 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70  ** Add WhereLoop
2c720 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64   entries to hand
2c730 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68  le OR terms.  Th
2c740 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74  is works for eit
2c750 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72  her.** btrees or
2c760 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
2c770 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2c780 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 57 68  hereLoopAddOr(Wh
2c790 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
2c7a0 70 42 75 69 6c 64 65 72 2c 20 42 69 74 6d 61 73  pBuilder, Bitmas
2c7b0 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20 57 68 65  k mExtra){.  Whe
2c7c0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
2c7d0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
2c7e0 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  o;.  WhereClause
2c7f0 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f   *pWC;.  WhereLo
2c800 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72  op *pNew;.  Wher
2c810 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70  eTerm *pTerm, *p
2c820 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20  WCEnd;.  int rc 
2c830 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
2c840 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65  nt iCur;.  Where
2c850 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20  Clause tempWC;. 
2c860 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
2c870 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57  r sSubBuild;.  W
2c880 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20  hereOrSet sSum, 
2c890 73 43 75 72 2c 20 73 50 72 65 76 3b 0a 20 20 73  sCur, sPrev;.  s
2c8a0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2c8b0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20  em *pItem;.  .  
2c8c0 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
2c8d0 70 57 43 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  pWC;.  if( pWInf
2c8e0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
2c8f0 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 29  WHERE_AND_ONLY )
2c900 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2c910 4b 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57  K;.  pWCEnd = pW
2c920 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72  C->a + pWC->nTer
2c930 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  m;.  pNew = pBui
2c940 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65  lder->pNew;.  me
2c950 6d 73 65 74 28 26 73 53 75 6d 2c 20 30 2c 20 73  mset(&sSum, 0, s
2c960 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20  izeof(sSum));.  
2c970 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
2c980 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e  pTabList->a + pN
2c990 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43 75 72  ew->iTab;.  iCur
2c9a0 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
2c9b0 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d  r;..  for(pTerm=
2c9c0 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
2c9d0 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  CEnd && rc==SQLI
2c9e0 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b  TE_OK; pTerm++){
2c9f0 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
2ca00 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2ca10 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  OR)!=0.     && (
2ca20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
2ca30 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e  ->indexable & pN
2ca40 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  ew->maskSelf)!=0
2ca50 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57   .    ){.      W
2ca60 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e  hereClause * con
2ca70 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72  st pOrWC = &pTer
2ca80 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
2ca90 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
2caa0 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45  m * const pOrWCE
2cab0 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70  nd = &pOrWC->a[p
2cac0 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  OrWC->nTerm];.  
2cad0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
2cae0 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e  OrTerm;.      in
2caf0 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20  t once = 1;.    
2cb00 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
2cb10 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64  .      sSubBuild
2cb20 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20   = *pBuilder;.  
2cb30 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f      sSubBuild.pO
2cb40 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
2cb50 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 53    sSubBuild.pOrS
2cb60 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20  et = &sCur;..   
2cb70 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70     for(pOrTerm=p
2cb80 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d  OrWC->a; pOrTerm
2cb90 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65  <pOrWCEnd; pOrTe
2cba0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
2cbb0 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  f( (pOrTerm->eOp
2cbc0 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29  erator & WO_AND)
2cbd0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2cbe0 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d   sSubBuild.pWC =
2cbf0 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e   &pOrTerm->u.pAn
2cc00 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  dInfo->wc;.     
2cc10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
2cc20 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
2cc30 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ==iCur ){.      
2cc40 20 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66      tempWC.pWInf
2cc50 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b  o = pWC->pWInfo;
2cc60 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
2cc70 43 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a  C.pOuter = pWC;.
2cc80 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
2cc90 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
2cca0 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e          tempWC.n
2ccb0 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
2ccc0 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70      tempWC.a = p
2ccd0 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  OrTerm;.        
2cce0 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20    sSubBuild.pWC 
2ccf0 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20  = &tempWC;.     
2cd00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2cd10 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2cd20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cd30 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 6e  sCur.n = 0;.#ifn
2cd40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2cd50 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
2cd60 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75       if( IsVirtu
2cd70 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20  al(pItem->pTab) 
2cd80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2cd90 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
2cda0 72 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64  rtual(&sSubBuild
2cdb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
2cdc0 28 69 3d 30 3b 20 69 3c 73 43 75 72 2e 6e 3b 20  (i=0; i<sCur.n; 
2cdd0 69 2b 2b 29 20 73 43 75 72 2e 61 5b 69 5d 2e 70  i++) sCur.a[i].p
2cde0 72 65 72 65 71 20 7c 3d 20 6d 45 78 74 72 61 3b  rereq |= mExtra;
2cdf0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
2ce00 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
2ce10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
2ce20 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
2ce30 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78  (&sSubBuild, mEx
2ce40 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tra);.        }.
2ce50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2ce60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
2ce70 20 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20   sCur.n==0 );.  
2ce80 20 20 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e        if( sCur.n
2ce90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2cea0 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20   sSum.n = 0;.   
2ceb0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2cec0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2ced0 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  once ){.        
2cee0 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73    whereOrMove(&s
2cef0 53 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20  Sum, &sCur);.   
2cf00 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b         once = 0;
2cf10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2cf20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f            whereO
2cf30 72 4d 6f 76 65 28 26 73 50 72 65 76 2c 20 26 73  rMove(&sPrev, &s
2cf40 53 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Sum);.          
2cf50 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  sSum.n = 0;.    
2cf60 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2cf70 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a  <sPrev.n; i++){.
2cf80 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2cf90 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a  j=0; j<sCur.n; j
2cfa0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2cfb0 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74     whereOrInsert
2cfc0 28 26 73 53 75 6d 2c 20 73 50 72 65 76 2e 61 5b  (&sSum, sPrev.a[
2cfd0 69 5d 2e 70 72 65 72 65 71 20 7c 20 73 43 75 72  i].prereq | sCur
2cfe0 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20 20  .a[j].prereq,.  
2cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d000 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2d010 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65 76  3LogEstAdd(sPrev
2d020 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75 72  .a[i].rRun, sCur
2d030 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20 20  .a[j].rRun),.   
2d040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d050 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2d060 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65 76 2e  LogEstAdd(sPrev.
2d070 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e  a[i].nOut, sCur.
2d080 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20  a[j].nOut));.   
2d090 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d0a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2d0b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2d0c0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b  New->nLTerm = 1;
2d0d0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  .      pNew->aLT
2d0e0 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[0] = pTerm;.
2d0f0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
2d100 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54  ags = WHERE_MULT
2d110 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65 77  I_OR;.      pNew
2d120 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
2d130 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
2d140 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65  dx = 0;.      me
2d150 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30  mset(&pNew->u, 0
2d160 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75  , sizeof(pNew->u
2d170 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ));.      for(i=
2d180 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
2d190 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b   && i<sSum.n; i+
2d1a0 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  +){.        /* T
2d1b0 55 4e 49 4e 47 3a 20 4d 75 6c 74 69 70 6c 65 20  UNING: Multiple 
2d1c0 62 79 20 33 2e 35 20 66 6f 72 20 74 68 65 20 73  by 3.5 for the s
2d1d0 65 63 6f 6e 64 61 72 79 20 74 61 62 6c 65 20 6c  econdary table l
2d1e0 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 20 20 20  ookup */.       
2d1f0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53   pNew->rRun = sS
2d200 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31  um.a[i].rRun + 1
2d210 38 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  8;.        pNew-
2d220 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69  >nOut = sSum.a[i
2d230 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  ].nOut;.        
2d240 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73  pNew->prereq = s
2d250 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b  Sum.a[i].prereq;
2d260 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
2d270 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
2d280 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
2d290 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2d2a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2d2b0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57  ./*.** Add all W
2d2c0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
2d2d0 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
2d2e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2d2f0 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57  hereLoopAddAll(W
2d300 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
2d310 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68  *pBuilder){.  Wh
2d320 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
2d330 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
2d340 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45  fo;.  Bitmask mE
2d350 78 74 72 61 20 3d 20 30 3b 0a 20 20 42 69 74 6d  xtra = 0;.  Bitm
2d360 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30 3b 0a  ask mPrior = 0;.
2d370 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 53 72    int iTab;.  Sr
2d380 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
2d390 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
2d3a0 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
2d3b0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2d3c0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2d3d0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
2d3e0 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 54 61 62  ->db;.  int nTab
2d3f0 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e  List = pWInfo->n
2d400 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20 72 63 20  Level;.  int rc 
2d410 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
2d420 38 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20  8 priorJoinType 
2d430 3d 20 30 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  = 0;.  WhereLoop
2d440 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20 4c 6f   *pNew;..  /* Lo
2d450 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61 62 6c  op over the tabl
2d460 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20  es in the join, 
2d470 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
2d480 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70  ht */.  pNew = p
2d490 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
2d4a0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70   whereLoopInit(p
2d4b0 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69 54 61 62  New);.  for(iTab
2d4c0 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61 62 4c 69  =0, pItem=pTabLi
2d4d0 73 74 2d 3e 61 3b 20 69 54 61 62 3c 6e 54 61 62  st->a; iTab<nTab
2d4e0 4c 69 73 74 3b 20 69 54 61 62 2b 2b 2c 20 70 49  List; iTab++, pI
2d4f0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 70 4e 65 77  tem++){.    pNew
2d500 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20  ->iTab = iTab;. 
2d510 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c     pNew->maskSel
2d520 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49  f = getMask(&pWI
2d530 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
2d540 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
2d550 20 20 20 20 69 66 28 20 28 28 70 49 74 65 6d 2d      if( ((pItem-
2d560 3e 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a  >jointype|priorJ
2d570 6f 69 6e 54 79 70 65 29 20 26 20 28 4a 54 5f 4c  oinType) & (JT_L
2d580 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
2d590 30 20 29 7b 0a 20 20 20 20 20 20 6d 45 78 74 72  0 ){.      mExtr
2d5a0 61 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20  a = mPrior;.    
2d5b0 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69 6e 54  }.    priorJoinT
2d5c0 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e 6a 6f 69  ype = pItem->joi
2d5d0 6e 74 79 70 65 3b 0a 20 20 20 20 69 66 28 20 49  ntype;.    if( I
2d5e0 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e  sVirtual(pItem->
2d5f0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 72  pTab) ){.      r
2d600 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
2d610 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65 72  Virtual(pBuilder
2d620 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2d630 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2d640 6f 70 41 64 64 42 74 72 65 65 28 70 42 75 69 6c  opAddBtree(pBuil
2d650 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  der, mExtra);.  
2d660 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2d670 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d680 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2d690 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72 2c  pAddOr(pBuilder,
2d6a0 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a   mExtra);.    }.
2d6b0 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e      mPrior |= pN
2d6c0 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  ew->maskSelf;.  
2d6d0 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e    if( rc || db->
2d6e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
2d6f0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 65 72  reak;.  }.  wher
2d700 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70  eLoopClear(db, p
2d710 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  New);.  return r
2d720 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d  c;.}../*.** Exam
2d730 69 6e 65 20 61 20 57 68 65 72 65 50 61 74 68 20  ine a WherePath 
2d740 28 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69  (with the additi
2d750 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61 20  on of the extra 
2d760 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65  WhereLoop of the
2d770 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65   5th.** paramete
2d780 72 73 29 20 74 6f 20 73 65 65 20 69 66 20 69 74  rs) to see if it
2d790 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e   outputs rows in
2d7a0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 4f   the requested O
2d7b0 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47  RDER BY.** (or G
2d7c0 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75 74  ROUP BY) without
2d7d0 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65 70   requiring a sep
2d7e0 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61  arate sort opera
2d7f0 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 3a 0a 2a  tion.  Return:.*
2d800 2a 20 0a 2a 2a 20 20 20 20 30 3a 20 20 4f 52 44  * .**    0:  ORD
2d810 45 52 20 42 59 20 69 73 20 6e 6f 74 20 73 61 74  ER BY is not sat
2d820 69 73 66 69 65 64 2e 20 20 53 6f 72 74 69 6e 67  isfied.  Sorting
2d830 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 20 20 20   required.**    
2d840 31 3a 20 20 4f 52 44 45 52 20 42 59 20 69 73 20  1:  ORDER BY is 
2d850 73 61 74 69 73 66 69 65 64 2e 20 20 20 20 20 20  satisfied.      
2d860 4f 6d 69 74 20 73 6f 72 74 69 6e 67 0a 2a 2a 20  Omit sorting.** 
2d870 20 20 2d 31 3a 20 20 55 6e 6b 6e 6f 77 6e 20 61    -1:  Unknown a
2d880 74 20 74 68 69 73 20 74 69 6d 65 0a 2a 2a 0a 2a  t this time.**.*
2d890 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 72 6f 63  * Note that proc
2d8a0 65 73 73 69 6e 67 20 66 6f 72 20 57 48 45 52 45  essing for WHERE
2d8b0 5f 47 52 4f 55 50 42 59 20 61 6e 64 20 57 48 45  _GROUPBY and WHE
2d8c0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 69 73  RE_DISTINCTBY is
2d8d0 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72 69 63   not as.** stric
2d8e0 74 2e 20 20 57 69 74 68 20 47 52 4f 55 50 20 42  t.  With GROUP B
2d8f0 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 74  Y and DISTINCT t
2d900 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d  he only requirem
2d910 65 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a 20 65  ent is that.** e
2d920 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61  quivalent rows a
2d930 70 70 65 61 72 20 69 6d 6d 65 64 69 61 74 65 6c  ppear immediatel
2d940 79 20 61 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e  y adjacent to on
2d950 65 20 61 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55  e another.  GROU
2d960 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54  P BY.** and DIST
2d970 49 4e 54 20 64 6f 20 6e 6f 74 20 72 65 71 75 69  INT do not requi
2d980 72 65 20 72 6f 77 73 20 74 6f 20 61 70 70 65 61  re rows to appea
2d990 72 20 69 6e 20 61 6e 79 20 70 61 72 74 69 63 75  r in any particu
2d9a0 6c 61 72 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e  lar order as lon
2d9b0 67 0a 2a 2a 20 61 73 20 65 71 75 69 76 65 6c 65  g.** as equivele
2d9c0 6e 74 20 72 6f 77 73 20 61 72 65 20 67 72 6f 75  nt rows are grou
2d9d0 70 65 64 20 74 6f 67 65 74 68 65 72 2e 20 20 54  ped together.  T
2d9e0 68 75 73 20 66 6f 72 20 47 52 4f 55 50 20 42 59  hus for GROUP BY
2d9f0 20 61 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a   and DISTINCT.**
2da00 20 74 68 65 20 70 4f 72 64 65 72 42 79 20 74 65   the pOrderBy te
2da10 72 6d 73 20 63 61 6e 20 62 65 20 6d 61 74 63 68  rms can be match
2da20 65 64 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e  ed in any order.
2da30 20 20 57 69 74 68 20 4f 52 44 45 52 20 42 59 2c    With ORDER BY,
2da40 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42   the .** pOrderB
2da50 79 20 74 65 72 6d 73 20 6d 75 73 74 20 62 65 20  y terms must be 
2da60 6d 61 74 63 68 65 64 20 69 6e 20 73 74 72 69 63  matched in stric
2da70 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20  t left-to-right 
2da80 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
2da90 20 69 6e 74 20 77 68 65 72 65 50 61 74 68 53 61   int wherePathSa
2daa0 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 0a  tisfiesOrderBy(.
2dab0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2dac0 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20 57  nfo,    /* The W
2dad0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
2dae0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
2daf0 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20  rBy,   /* ORDER 
2db00 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f  BY or GROUP BY o
2db10 72 20 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73  r DISTINCT claus
2db20 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
2db30 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68  WherePath *pPath
2db40 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  ,     /* The Whe
2db50 72 65 50 61 74 68 20 74 6f 20 63 68 65 63 6b 20  rePath to check 
2db60 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c  */.  u16 wctrlFl
2db70 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4d 69  ags,       /* Mi
2db80 67 68 74 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  ght contain WHER
2db90 45 5f 47 52 4f 55 50 42 59 20 6f 72 20 57 48 45  E_GROUPBY or WHE
2dba0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 2a 2f  RE_DISTINCTBY */
2dbb0 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20  .  u16 nLoop,   
2dbc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2dbd0 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
2dbe0 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20   pPath->aLoop[] 
2dbf0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
2dc00 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20 41 64  pLast,     /* Ad
2dc10 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70  d this WhereLoop
2dc20 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 70   to the end of p
2dc30 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f  Path->aLoop[] */
2dc40 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70 52 65 76  .  Bitmask *pRev
2dc50 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a  Mask     /* OUT:
2dc60 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f   Mask of WhereLo
2dc70 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20 72 65  ops to run in re
2dc80 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29  verse order */.)
2dc90 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b 20 20  {.  u8 revSet;  
2dca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2dcb0 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e 6f 77  e if rev is know
2dcc0 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20 20  n */.  u8 rev;  
2dcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dce0 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74 20 6f  Composite sort o
2dcf0 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 76  rder */.  u8 rev
2dd00 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
2dd10 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20 6f 72  /* Index sort or
2dd20 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72  der */.  u8 isOr
2dd30 64 65 72 44 69 73 74 69 6e 63 74 3b 20 20 20 2f  derDistinct;   /
2dd40 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57 68 65 72  * All prior Wher
2dd50 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64 65 72  eLoops are order
2dd60 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75  -distinct */.  u
2dd70 38 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  8 distinctColumn
2dd80 73 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  s;   /* True if 
2dd90 74 68 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49  the loop has UNI
2dda0 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c  QUE NOT NULL col
2ddb0 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d  umns */.  u8 isM
2ddc0 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  atch;           
2ddd0 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68  /* iColumn match
2dde0 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65  es a term of the
2ddf0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2de00 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f   */.  u16 nKeyCo
2de10 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  l;          /* N
2de20 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
2de30 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20   in pIndex */.  
2de40 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 20 20 20  u16 nOrderBy;   
2de50 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2de60 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
2de70 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
2de80 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20    int iLoop;    
2de90 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2dea0 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e   of WhereLoop in
2deb0 20 70 50 61 74 68 20 62 65 69 6e 67 20 70 72 6f   pPath being pro
2dec0 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20  cessed */.  int 
2ded0 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
2dee0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2def0 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  rs */.  int iCur
2df00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2df10 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
2df20 6f 72 20 63 75 72 72 65 6e 74 20 57 68 65 72 65  or current Where
2df30 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43  Loop */.  int iC
2df40 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
2df50 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  /* A column numb
2df60 65 72 20 77 69 74 68 69 6e 20 74 61 62 6c 65 20  er within table 
2df70 69 43 75 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c  iCur */.  WhereL
2df80 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20  oop *pLoop = 0; 
2df90 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72 65  /* Current Where
2dfa0 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f 63 65  Loop being proce
2dfb0 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65  ssed. */.  Where
2dfc0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
2dfd0 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
2dfe0 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
2dff0 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20  lause */.  Expr 
2e000 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20  *pOBExpr;       
2e010 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f   /* An expressio
2e020 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52  n from the ORDER
2e030 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
2e040 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
2e050 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45        /* COLLATE
2e060 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61   function from a
2e070 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
2e080 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65  e term */.  Inde
2e090 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
2e0a0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 61    /* The index a
2e0b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
2e0c0 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Loop */.  sqlite
2e0d0 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
2e0e0 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
2e0f0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
2e100 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
2e110 20 6f 62 53 61 74 20 3d 20 30 3b 20 20 20 20 2f   obSat = 0;    /
2e120 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20  * Mask of ORDER 
2e130 42 59 20 74 65 72 6d 73 20 73 61 74 69 73 66 69  BY terms satisfi
2e140 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42  ed so far */.  B
2e150 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20  itmask obDone;  
2e160 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
2e170 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72  all ORDER BY ter
2e180 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
2e190 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
2e1a0 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61  k;  /* Mask of a
2e1b0 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20  ll well-ordered 
2e1c0 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61  loops */.  Bitma
2e1d0 73 6b 20 72 65 61 64 79 3b 20 20 20 20 20 20 20  sk ready;       
2e1e0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
2e1f0 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f  f inner loops */
2e200 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73  ..  /*.  ** We s
2e210 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ay the WhereLoop
2e220 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66   is "one-row" if
2e230 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 6e 6f   it generates no
2e240 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20   more than one. 
2e250 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75   ** row of outpu
2e260 74 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20  t.  A WhereLoop 
2e270 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c  is one-row if al
2e280 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
2e290 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a  ng are true:.  *
2e2a0 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e 64 65 78  *  (a) All index
2e2b0 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77   columns match w
2e2c0 69 74 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ith WHERE_COLUMN
2e2d0 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54  _EQ..  **  (b) T
2e2e0 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71  he index is uniq
2e2f0 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65 72  ue.  ** Any Wher
2e300 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 57 48  eLoop with an WH
2e310 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f  ERE_COLUMN_EQ co
2e320 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
2e330 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77  rowid is one-row
2e340 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65  ..  ** Every one
2e350 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 77  -row WhereLoop w
2e360 69 6c 6c 20 68 61 76 65 20 74 68 65 20 57 48 45  ill have the WHE
2e370 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73 65  RE_ONEROW bit se
2e380 74 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20  t in wsFlags..  
2e390 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74  **.  ** We say t
2e3a0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  he WhereLoop is 
2e3b0 22 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 22  "order-distinct"
2e3c0 20 69 66 20 74 68 65 20 73 65 74 20 6f 66 20 63   if the set of c
2e3d0 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a  olumns from.  **
2e3e0 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20   that WhereLoop 
2e3f0 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 20  that are in the 
2e400 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2e410 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f  are different fo
2e420 72 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77  r every.  ** row
2e430 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
2e440 70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f  p.  Every one-ro
2e450 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 61  w WhereLoop is a
2e460 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a  utomatically.  *
2e470 2a 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  * order-distinct
2e480 2e 20 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20  .   A WhereLoop 
2e490 74 68 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75  that has no colu
2e4a0 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  mns in the ORDER
2e4b0 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   BY clause.  ** 
2e4c0 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73  is not order-dis
2e4d0 74 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72 64  tinct. To be ord
2e4e0 65 72 2d 64 69 73 74 69 6e 63 74 20 69 73 20 6e  er-distinct is n
2e4f0 6f 74 20 71 75 69 74 65 20 74 68 65 20 73 61 6d  ot quite the sam
2e500 65 20 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20  e as being.  ** 
2e510 55 4e 49 51 55 45 20 73 69 6e 63 65 20 61 20 55  UNIQUE since a U
2e520 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20  NIQUE column or 
2e530 69 6e 64 65 78 20 63 61 6e 20 68 61 76 65 20 6d  index can have m
2e540 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74 68 61  ultiple rows tha
2e550 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c  t .  ** are NULL
2e560 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73   and NULL values
2e570 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 20   are equivalent 
2e580 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20  for the purpose 
2e590 6f 66 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  of order-distinc
2e5a0 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72  t..  ** To be or
2e5b0 64 65 72 2d 64 69 73 74 69 6e 63 74 2c 20 74 68  der-distinct, th
2e5c0 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62  e columns must b
2e5d0 65 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54  e UNIQUE and NOT
2e5e0 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   NULL..  **.  **
2e5f0 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 61   The rowid for a
2e600 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73   table is always
2e610 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20   UNIQUE and NOT 
2e620 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65 72  NULL so whenever
2e630 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20   the.  ** rowid 
2e640 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 4f  appears in the O
2e650 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
2e660 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2e670 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20  g WhereLoop is. 
2e680 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
2e690 79 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  y order-distinct
2e6a0 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ..  */..  assert
2e6b0 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b  ( pOrderBy!=0 );
2e6c0 0a 0a 20 20 2f 2a 20 53 6f 72 74 61 62 69 6c 69  ..  /* Sortabili
2e6d0 74 79 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61  ty of virtual ta
2e6e0 62 6c 65 73 20 69 73 20 64 65 74 65 72 6d 69 6e  bles is determin
2e6f0 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49  ed by the xBestI
2e700 6e 64 65 78 20 6d 65 74 68 6f 64 0a 20 20 2a 2a  ndex method.  **
2e710 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   of the virtual 
2e720 74 61 62 6c 65 20 69 74 73 65 6c 66 20 2a 2f 0a  table itself */.
2e730 20 20 69 66 28 20 70 4c 61 73 74 2d 3e 77 73 46    if( pLast->wsF
2e740 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
2e750 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20  TUALTABLE ){.   
2e760 20 74 65 73 74 63 61 73 65 28 20 6e 4c 6f 6f 70   testcase( nLoop
2e770 3e 30 20 29 3b 20 20 2f 2a 20 54 72 75 65 20 77  >0 );  /* True w
2e780 68 65 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20  hen outer loops 
2e790 61 72 65 20 6f 6e 65 2d 72 6f 77 20 61 6e 64 20  are one-row and 
2e7a0 6d 61 74 63 68 20 0a 20 20 20 20 20 20 20 20 20  match .         
2e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e7c0 20 2a 2a 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   ** no ORDER BY 
2e7d0 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 72 65 74  terms */.    ret
2e7e0 75 72 6e 20 70 4c 61 73 74 2d 3e 75 2e 76 74 61  urn pLast->u.vta
2e7f0 62 2e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 7d  b.isOrdered;.  }
2e800 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20  .  if( nLoop && 
2e810 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
2e820 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
2e830 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 29 20  OrderByIdxJoin) 
2e840 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e  ) return 0;..  n
2e850 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
2e860 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73  By->nExpr;.  tes
2e870 74 63 61 73 65 28 20 6e 4f 72 64 65 72 42 79 3d  tcase( nOrderBy=
2e880 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20  =BMS-1 );.  if( 
2e890 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31 20 29  nOrderBy>BMS-1 )
2e8a0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
2e8b0 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f  annot optimize o
2e8c0 76 65 72 6c 79 20 6c 61 72 67 65 20 4f 52 44 45  verly large ORDE
2e8d0 52 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64  R BYs */.  isOrd
2e8e0 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a  erDistinct = 1;.
2e8f0 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42    obDone = MASKB
2e900 49 54 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a  IT(nOrderBy)-1;.
2e910 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d    orderDistinctM
2e920 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64 79  ask = 0;.  ready
2e930 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f   = 0;.  for(iLoo
2e940 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73 74  p=0; isOrderDist
2e950 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f 62  inct && obSat<ob
2e960 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e  Done && iLoop<=n
2e970 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
2e980 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20      if( iLoop>0 
2e990 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70  ) ready |= pLoop
2e9a0 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
2e9b0 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c  pLoop = iLoop<nL
2e9c0 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61 4c 6f  oop ? pPath->aLo
2e9d0 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73  op[iLoop] : pLas
2e9e0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  t;.    assert( (
2e9f0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2ea00 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
2ea10 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69  BLE)==0 );.    i
2ea20 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Cur = pWInfo->pT
2ea30 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d  abList->a[pLoop-
2ea40 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a  >iTab].iCursor;.
2ea50 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66  .    /* Mark off
2ea60 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74 65   any ORDER BY te
2ea70 72 6d 20 58 20 74 68 61 74 20 69 73 20 61 20 63  rm X that is a c
2ea80 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62  olumn in the tab
2ea90 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  le of.    ** the
2eaa0 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f   current loop fo
2eab0 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69 73  r which there is
2eac0 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
2ead0 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  RE.    ** clause
2eae0 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49   of the form X I
2eaf0 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68  S NULL or X=? th
2eb00 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  at reference onl
2eb10 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c  y outer.    ** l
2eb20 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  oops..    */.   
2eb30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
2eb40 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
2eb50 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29    if( MASKBIT(i)
2eb60 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69   & obSat ) conti
2eb70 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45 78  nue;.      pOBEx
2eb80 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
2eb90 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64  SkipCollate(pOrd
2eba0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2ebb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42  );.      if( pOB
2ebc0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
2ebd0 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UMN ) continue;.
2ebe0 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
2ebf0 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20  r->iTable!=iCur 
2ec00 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2ec10 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
2ec20 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  rm(&pWInfo->sWC,
2ec30 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e   iCur, pOBExpr->
2ec40 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
2ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec60 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f  ~ready, WO_EQ|WO
2ec70 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20  _ISNULL, 0);.   
2ec80 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
2ec90 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2eca0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
2ecb0 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d  perator&WO_EQ)!=
2ecc0 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43  0 && pOBExpr->iC
2ecd0 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
2ece0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2ecf0 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20  z1, *z2;.       
2ed00 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
2ed10 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e  ExprCollSeq(pWIn
2ed20 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64  fo->pParse, pOrd
2ed30 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2ed40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
2ed50 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
2ed60 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
2ed70 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c         z1 = pCol
2ed80 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l->zName;.      
2ed90 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2eda0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49  3ExprCollSeq(pWI
2edb0 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54 65  nfo->pParse, pTe
2edc0 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  rm->pExpr);.    
2edd0 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
2ede0 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
2edf0 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
2ee00 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  z2 = pColl->zNam
2ee10 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  e;.        if( s
2ee20 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31  qlite3StrICmp(z1
2ee30 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74 69  , z2)!=0 ) conti
2ee40 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
2ee50 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
2ee60 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20  BIT(i);.    }.. 
2ee70 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
2ee80 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
2ee90 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20  NEROW)==0 ){.   
2eea0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
2eeb0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  Flags & WHERE_IP
2eec0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  K ){.        pIn
2eed0 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dex = 0;.       
2eee0 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20   nKeyCol = 0;.  
2eef0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
2ef00 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75  Index = pLoop->u
2ef10 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d  .btree.pIndex)==
2ef20 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e  0 || pIndex->bUn
2ef30 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20  ordered ){.     
2ef40 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
2ef50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ef60 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64    nKeyCol = pInd
2ef70 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20  ex->nKeyCol;.   
2ef80 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
2ef90 69 6e 63 74 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  inct = pIndex->o
2efa0 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b  nError!=OE_None;
2efb0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2efc0 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
2efd0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  all columns of t
2efe0 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61  he index and dea
2eff0 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a  l with the ones.
2f000 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72        ** that ar
2f010 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65  e not constraine
2f020 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20  d by == or IN.. 
2f030 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
2f040 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a  v = revSet = 0;.
2f050 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f        distinctCo
2f060 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  lumns = 0;.     
2f070 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 3d 6e 4b 65   for(j=0; j<=nKe
2f080 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  yCol; j++){.    
2f090 20 20 20 20 75 38 20 62 4f 6e 63 65 3b 20 20 20      u8 bOnce;   
2f0a0 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74  /* True to run t
2f0b0 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61 72  he ORDER BY sear
2f0c0 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20  ch loop */..    
2f0d0 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72      /* Skip over
2f0e0 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20   == and IS NULL 
2f0f0 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20  terms */.       
2f100 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e   if( j<pLoop->u.
2f110 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20  btree.nEq.      
2f120 20 20 20 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f     && ((i = pLoo
2f130 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f  p->aLTerm[j]->eO
2f140 70 65 72 61 74 6f 72 29 20 26 20 28 57 4f 5f 45  perator) & (WO_E
2f150 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30  Q|WO_ISNULL))!=0
2f160 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2f170 20 20 20 20 20 20 69 66 28 20 69 20 26 20 57 4f        if( i & WO
2f180 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
2f190 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2f1a0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2f1b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2f1c0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2f1d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
2f1e0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
2f1f0 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20 7d  nue;  .        }
2f200 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  ..        /* Get
2f210 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
2f220 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  er in the table 
2f230 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f  (iColumn) and so
2f240 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  rt order.       
2f250 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72   ** (revIdx) for
2f260 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
2f270 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   of the index.. 
2f280 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2f290 20 20 69 66 28 20 6a 3c 6e 4b 65 79 43 6f 6c 20    if( j<nKeyCol 
2f2a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2f2b0 4e 6f 72 6d 61 6c 20 69 6e 64 65 78 20 63 6f 6c  Normal index col
2f2c0 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  umns */.        
2f2d0 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    iColumn = pInd
2f2e0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  ex->aiColumn[j];
2f2f0 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64  .          revId
2f300 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72  x = pIndex->aSor
2f310 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20  tOrder[j];.     
2f320 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
2f330 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ==pIndex->pTable
2f340 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d  ->iPKey ) iColum
2f350 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
2f360 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2f370 20 2f 2a 20 54 68 65 20 52 4f 57 49 44 20 63 6f   /* The ROWID co
2f380 6c 75 6d 6e 20 61 74 20 74 68 65 20 65 6e 64 20  lumn at the end 
2f390 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
2f3a0 65 72 74 28 20 6a 3d 3d 6e 4b 65 79 43 6f 6c 20  ert( j==nKeyCol 
2f3b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  );.          iCo
2f3c0 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
2f3d0 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b       revIdx = 0;
2f3e0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2f3f0 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73      /* An uncons
2f400 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74  trained column t
2f410 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  hat might be NUL
2f420 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  L means that thi
2f430 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65  s.        ** Whe
2f440 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65  reLoop is not we
2f450 6c 6c 2d 6f 72 64 65 72 65 64 20 0a 20 20 20 20  ll-ordered .    
2f460 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2f470 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  f( isOrderDistin
2f480 63 74 0a 20 20 20 20 20 20 20 20 20 26 26 20 69  ct.         && i
2f490 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20  Column>=0.      
2f4a0 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e     && j>=pLoop->
2f4b0 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20  u.btree.nEq.    
2f4c0 20 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e       && pIndex->
2f4d0 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
2f4e0 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  lumn].notNull==0
2f4f0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2f500 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
2f510 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
2f520 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
2f530 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20   Find the ORDER 
2f540 42 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72  BY term that cor
2f550 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
2f560 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20  j-th column.    
2f570 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e      ** of the in
2f580 64 65 78 20 61 6e 64 20 61 6e 64 20 6d 61 72 6b  dex and and mark
2f590 20 74 68 61 74 20 4f 52 44 45 52 20 42 59 20 74   that ORDER BY t
2f5a0 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20 20  erm off .       
2f5b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f 6e 63   */.        bOnc
2f5c0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  e = 1;.        i
2f5d0 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  sMatch = 0;.    
2f5e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e      for(i=0; bOn
2f5f0 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79  ce && i<nOrderBy
2f600 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2f610 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29    if( MASKBIT(i)
2f620 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69   & obSat ) conti
2f630 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  nue;.          p
2f640 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  OBExpr = sqlite3
2f650 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
2f660 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2f670 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
2f680 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c   testcase( wctrl
2f690 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
2f6a0 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20 20 20  OUPBY );.       
2f6b0 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
2f6c0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2f6d0 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a 20 20  DISTINCTBY );.  
2f6e0 20 20 20 20 20 20 20 20 69 66 28 20 28 77 63 74          if( (wct
2f6f0 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  rlFlags & (WHERE
2f700 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45 5f 44  _GROUPBY|WHERE_D
2f710 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30 20 29  ISTINCTBY))==0 )
2f720 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20   bOnce = 0;.    
2f730 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
2f740 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
2f750 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2f760 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
2f770 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
2f780 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2f790 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
2f7a0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f  pr->iColumn!=iCo
2f7b0 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
2f7c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2f7d0 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
2f7e0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
2f7f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2f800 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  Seq(pWInfo->pPar
2f810 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
2f820 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
2f830 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
2f840 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
2f850 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2f860 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2f870 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
2f880 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e  >zName, pIndex->
2f890 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20  azColl[j])!=0 ) 
2f8a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2f8b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2f8c0 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20  isMatch = 1;.   
2f8d0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2f8e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f8f0 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20  if( isMatch ){. 
2f900 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
2f910 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
2f920 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2f930 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d  distinctColumns=
2f940 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2f950 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e    distinctColumn
2f960 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  s = 1;.         
2f970 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53   }.          obS
2f980 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
2f990 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2f9a0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
2f9b0 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
2f9c0 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  PBY)==0 ){.     
2f9d0 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73         /* Make s
2f9e0 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64  ure the sort ord
2f9f0 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65  er is compatible
2fa00 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
2fa10 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20  clause..        
2fa20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65      ** Sort orde
2fa30 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20  r is irrelevant 
2fa40 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63  for a GROUP BY c
2fa50 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20  lause. */.      
2fa60 20 20 20 20 20 20 69 66 28 20 72 65 76 53 65 74        if( revSet
2fa70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2fa80 20 20 69 66 28 20 28 72 65 76 20 5e 20 72 65 76    if( (rev ^ rev
2fa90 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e  Idx)!=pOrderBy->
2faa0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29  a[i].sortOrder )
2fab0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
2fac0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2fad0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 20              rev 
2fae0 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65  = revIdx ^ pOrde
2faf0 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
2fb00 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  der;.           
2fb10 20 20 20 69 66 28 20 72 65 76 20 29 20 2a 70 52     if( rev ) *pR
2fb20 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49  evMask |= MASKBI
2fb30 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  T(iLoop);.      
2fb40 20 20 20 20 20 20 20 20 72 65 76 53 65 74 20 3d          revSet =
2fb50 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
2fb60 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2fb70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2fb80 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74         /* No mat
2fb90 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  ch found */.    
2fba0 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c        if( j==0 |
2fbb0 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20  | j<nKeyCol ){. 
2fbc0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
2fbd0 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74  ase( isOrderDist
2fbe0 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  inct!=0 );.     
2fbf0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
2fc00 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
2fc10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fc20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2fc30 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e   }.      } /* en
2fc40 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  d Loop over all 
2fc50 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f  index columns */
2fc60 0a 20 20 20 20 20 20 69 66 28 20 64 69 73 74 69  .      if( disti
2fc70 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20  nctColumns ){.  
2fc80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2fc90 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d  isOrderDistinct=
2fca0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73  =0 );.        is
2fcb0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
2fcc0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
2fcd0 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f   /* end-if not o
2fce0 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f  ne-row */..    /
2fcf0 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f  * Mark off any o
2fd00 74 68 65 72 20 4f 52 44 45 52 20 42 59 20 74 65  ther ORDER BY te
2fd10 72 6d 73 20 74 68 61 74 20 72 65 66 65 72 65 6e  rms that referen
2fd20 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20  ce pLoop */.    
2fd30 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  if( isOrderDisti
2fd40 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64  nct ){.      ord
2fd50 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c  erDistinctMask |
2fd60 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  = pLoop->maskSel
2fd70 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  f;.      for(i=0
2fd80 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
2fd90 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
2fda0 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28   *p;.        if(
2fdb0 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62   MASKBIT(i) & ob
2fdc0 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Sat ) continue;.
2fdd0 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72 64          p = pOrd
2fde0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2fdf0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65  ;.        if( (e
2fe00 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 26 70  xprTableUsage(&p
2fe10 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
2fe20 20 70 29 26 7e 6f 72 64 65 72 44 69 73 74 69 6e   p)&~orderDistin
2fe30 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  ctMask)==0 ){.  
2fe40 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d          obSat |=
2fe50 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
2fe60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2fe70 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20     }.  } /* End 
2fe80 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c  the loop over al
2fe90 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f  l WhereLoops fro
2fea0 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77  m outer-most dow
2feb0 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20  n to inner-most 
2fec0 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d 3d  */.  if( obSat==
2fed0 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20  obDone ) return 
2fee0 31 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64 65  1;.  if( !isOrde
2fef0 72 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75  rDistinct ) retu
2ff00 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d  rn 0;.  return -
2ff10 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45  1;.}..#ifdef WHE
2ff20 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
2ff30 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e 67  /* For debugging
2ff40 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74   use only: */.st
2ff50 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2ff60 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 57  *wherePathName(W
2ff70 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c  herePath *pPath,
2ff80 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72   int nLoop, Wher
2ff90 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20  eLoop *pLast){. 
2ffa0 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e 61   static char zNa
2ffb0 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b  me[65];.  int i;
2ffc0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c  .  for(i=0; i<nL
2ffd0 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65  oop; i++){ zName
2ffe0 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f  [i] = pPath->aLo
2fff0 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20  op[i]->cId; }.  
30000 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d  if( pLast ) zNam
30010 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e  e[i++] = pLast->
30020 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20  cId;.  zName[i] 
30030 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e  = 0;.  return zN
30040 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ame;.}.#endif...
30050 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
30060 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  list of WhereLoo
30070 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70 57 49  p objects at pWI
30080 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69  nfo->pLoops, thi
30090 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74  s routine.** att
300a0 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68  empts to find th
300b0 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
300c0 74 68 20 74 68 61 74 20 76 69 73 69 74 73 20 65  th that visits e
300d0 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a  ach WhereLoop.**
300e0 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74   once.  This pat
300f0 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64  h is then loaded
30100 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f   into the pWInfo
30110 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65  ->a[].pWLoop fie
30120 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d  lds..**.** Assum
30130 65 20 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c  e that the total
30140 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
30150 74 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  t rows that will
30160 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72 74   need to be sort
30170 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52  ed.** will be nR
30180 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20 31 30  owEst (in the 10
30190 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74 61  *log2 representa
301a0 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f  tion).  Or, igno
301b0 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f  re sorting.** co
301c0 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d  sts if nRowEst==
301d0 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  0..**.** Return 
301e0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
301f0 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e  cess or SQLITE_N
30200 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79  OMEM of a memory
30210 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65   allocation.** e
30220 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
30230 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
30240 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65  PathSolver(Where
30250 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f  Info *pWInfo, Lo
30260 67 45 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20  gEst nRowEst){. 
30270 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20   int mxChoice;  
30280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
30290 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
302a0 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74  simultaneous pat
302b0 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20  hs tracked */.  
302c0 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20  int nLoop;      
302d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
302e0 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
302f0 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61  the join */.  Pa
30300 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
30310 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
30320 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
30330 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
30340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
30350 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
30360 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  tion */.  int iL
30370 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
30380 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
30390 74 65 72 20 6f 76 65 72 20 74 68 65 20 74 65 72  ter over the ter
303a0 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  ms of the join *
303b0 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20  /.  int ii, jj; 
303c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
303d0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
303e0 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b  /.  int mxI = 0;
303f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30400 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 65   Index of next e
30410 6e 74 72 79 20 74 6f 20 72 65 70 6c 61 63 65 20  ntry to replace 
30420 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 43 6f 73  */.  LogEst rCos
30430 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
30440 2a 20 43 6f 73 74 20 6f 66 20 61 20 70 61 74 68  * Cost of a path
30450 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 4f 75   */.  LogEst nOu
30460 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
30470 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
30480 70 75 74 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  puts */.  LogEst
30490 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20   mxCost = 0;    
304a0 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63      /* Maximum c
304b0 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20  ost of a set of 
304c0 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73  paths */.  LogEs
304d0 74 20 6d 78 4f 75 74 20 3d 20 30 3b 20 20 20 20  t mxOut = 0;    
304e0 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
304f0 6e 4f 75 74 20 76 61 6c 75 65 20 6f 6e 20 74 68  nOut value on th
30500 65 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a  e set of paths *
30510 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 6f 72 74  /.  LogEst rSort
30520 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Cost;         /*
30530 20 43 6f 73 74 20 74 6f 20 64 6f 20 61 20 73 6f   Cost to do a so
30540 72 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c  rt */.  int nTo,
30550 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20   nFrom;         
30560 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
30570 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20  alid entries in 
30580 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b  aTo[] and aFrom[
30590 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  ] */.  WherePath
305a0 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20   *aFrom;        
305b0 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61   /* All nFrom pa
305c0 74 68 73 20 61 74 20 74 68 65 20 70 72 65 76 69  ths at the previ
305d0 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57  ous level */.  W
305e0 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20  herePath *aTo;  
305f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
30600 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73 20 61  nTo best paths a
30610 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  t the current le
30620 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
30630 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20  th *pFrom;      
30640 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74     /* An element
30650 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74   of aFrom[] that
30660 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
30670 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  on */.  WherePat
30680 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20  h *pTo;         
30690 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20    /* An element 
306a0 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65  of aTo[] that we
306b0 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
306c0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
306d0 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f  pWLoop;        /
306e0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65  * One of the Whe
306f0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a  reLoop objects *
30700 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  /.  WhereLoop **
30710 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pX;           /*
30720 20 55 73 65 64 20 74 6f 20 64 69 76 79 20 75 70   Used to divy up
30730 20 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f   the pSpace memo
30740 72 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53  ry */.  char *pS
30750 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
30760 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d    /* Temporary m
30770 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68  emory used by th
30780 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20  is routine */.. 
30790 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
307a0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d  ->pParse;.  db =
307b0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e   pParse->db;.  n
307c0 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e  Loop = pWInfo->n
307d0 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49  Level;.  /* TUNI
307e0 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71  NG: For simple q
307f0 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65  ueries, only the
30800 20 62 65 73 74 20 70 61 74 68 20 69 73 20 74 72   best path is tr
30810 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20  acked..  ** For 
30820 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65  2-way joins, the
30830 20 35 20 62 65 73 74 20 70 61 74 68 73 20 61 72   5 best paths ar
30840 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a  e followed..  **
30850 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20   For joins of 3 
30860 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20  or more tables, 
30870 74 72 61 63 6b 20 74 68 65 20 31 30 20 62 65 73  track the 10 bes
30880 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43  t paths */.  mxC
30890 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3d 3d  hoice = (nLoop==
308a0 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d  1) ? 1 : (nLoop=
308b0 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20  =2 ? 5 : 10);.  
308c0 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70  assert( nLoop<=p
308d0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
308e0 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45  >nSrc );.  WHERE
308f0 54 52 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d  TRACE(0x002, ("-
30900 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72  --- begin solver
30910 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  \n"));..  /* All
30920 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
30930 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61  lize space for a
30940 54 6f 20 61 6e 64 20 61 46 72 6f 6d 20 2a 2f 0a  To and aFrom */.
30950 20 20 69 69 20 3d 20 28 73 69 7a 65 6f 66 28 57    ii = (sizeof(W
30960 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66  herePath)+sizeof
30970 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f  (WhereLoop*)*nLo
30980 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a  op)*mxChoice*2;.
30990 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74    pSpace = sqlit
309a0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
309b0 2c 20 69 69 29 3b 0a 20 20 69 66 28 20 70 53 70  , ii);.  if( pSp
309c0 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ace==0 ) return 
309d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
309e0 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68  aTo = (WherePath
309f0 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f  *)pSpace;.  aFro
30a00 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65  m = aTo+mxChoice
30a10 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d  ;.  memset(aFrom
30a20 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f  , 0, sizeof(aFro
30a30 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28  m[0]));.  pX = (
30a40 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72  WhereLoop**)(aFr
30a50 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20  om+mxChoice);.  
30a60 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a  for(ii=mxChoice*
30a70 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69  2, pFrom=aTo; ii
30a80 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b  >0; ii--, pFrom+
30a90 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b  +, pX += nLoop){
30aa0 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  .    pFrom->aLoo
30ab0 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20 20 2f  p = pX;.  }..  /
30ac0 2a 20 53 65 65 64 20 74 68 65 20 73 65 61 72 63  * Seed the searc
30ad0 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  h with a single 
30ae0 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69  WherePath contai
30af0 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c  ning zero WhereL
30b00 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oops..  **.  ** 
30b10 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c  TUNING: Do not l
30b20 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
30b30 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61   iterations go a
30b40 62 6f 76 65 20 32 35 2e 20 20 49 66 20 74 68 65  bove 25.  If the
30b50 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f   cost.  ** of co
30b60 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d  mputing an autom
30b70 61 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f  atic index is no
30b80 74 20 70 61 69 64 20 62 61 63 6b 20 77 69 74 68  t paid back with
30b90 69 6e 20 74 68 65 20 66 69 72 73 74 20 32 35 0a  in the first 25.
30ba0 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20    ** rows, then 
30bb0 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61  do not use the a
30bc0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20  utomatic index. 
30bd0 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52  */.  aFrom[0].nR
30be0 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d  ow = MIN(pParse-
30bf0 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 36 29  >nQueryLoop, 46)
30c00 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73  ;  assert( 46==s
30c10 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29  qlite3LogEst(25)
30c20 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b   );.  nFrom = 1;
30c30 0a 0a 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74  ..  /* Precomput
30c40 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f  e the cost of so
30c50 72 74 69 6e 67 20 74 68 65 20 66 69 6e 61 6c 20  rting the final 
30c60 72 65 73 75 6c 74 20 73 65 74 2c 20 69 66 20 74  result set, if t
30c70 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 74  he caller.  ** t
30c80 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
30c90 67 69 6e 28 29 20 77 61 73 20 63 6f 6e 63 65 72  gin() was concer
30ca0 6e 65 64 20 61 62 6f 75 74 20 73 6f 72 74 69 6e  ned about sortin
30cb0 67 20 2a 2f 0a 20 20 72 53 6f 72 74 43 6f 73 74  g */.  rSortCost
30cc0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57 49 6e   = 0;.  if( pWIn
30cd0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  fo->pOrderBy==0 
30ce0 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b  || nRowEst==0 ){
30cf0 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73  .    aFrom[0].is
30d00 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31  OrderedValid = 1
30d10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
30d20 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61  * TUNING: Estima
30d30 74 65 64 20 63 6f 73 74 20 6f 66 20 73 6f 72 74  ted cost of sort
30d40 69 6e 67 20 69 73 20 34 38 2a 4e 2a 6c 6f 67 32  ing is 48*N*log2
30d50 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20 74  (N) where N is t
30d60 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  he.    ** number
30d70 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2e   of output rows.
30d80 20 54 68 65 20 34 38 20 69 73 20 74 68 65 20 65   The 48 is the e
30d90 78 70 65 63 74 65 64 20 73 69 7a 65 20 6f 66 20  xpected size of 
30da0 61 20 72 6f 77 20 74 6f 20 73 6f 72 74 2e 20 0a  a row to sort. .
30db0 20 20 20 20 2a 2a 20 46 49 58 4d 45 3a 20 20 63      ** FIXME:  c
30dc0 6f 6d 70 75 74 65 20 61 20 62 65 74 74 65 72 20  ompute a better 
30dd0 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
30de0 34 38 20 6d 75 6c 74 69 70 6c 69 65 72 20 62 61  48 multiplier ba
30df0 73 65 64 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  sed on the.    *
30e00 2a 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70  * result set exp
30e10 72 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20  ressions. */.   
30e20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f   rSortCost = nRo
30e30 77 45 73 74 20 2b 20 65 73 74 4c 6f 67 28 6e 52  wEst + estLog(nR
30e40 6f 77 45 73 74 29 3b 0a 20 20 20 20 57 48 45 52  owEst);.    WHER
30e50 45 54 52 41 43 45 28 30 78 30 30 32 2c 28 22 2d  ETRACE(0x002,("-
30e60 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d  --- sort cost=%-
30e70 33 64 5c 6e 22 2c 20 72 53 6f 72 74 43 6f 73 74  3d\n", rSortCost
30e80 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  ));.  }..  /* Co
30e90 6d 70 75 74 65 20 73 75 63 63 65 73 73 69 76 65  mpute successive
30ea0 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50  ly longer WhereP
30eb0 61 74 68 73 20 75 73 69 6e 67 20 74 68 65 20 70  aths using the p
30ec0 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69  revious generati
30ed0 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65  on.  ** of Where
30ee0 50 61 74 68 73 20 61 73 20 74 68 65 20 62 61 73  Paths as the bas
30ef0 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e  is for the next.
30f00 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20    Keep track of 
30f10 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a  the mxChoice.  *
30f20 2a 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20  * best paths at 
30f30 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20  each generation 
30f40 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  */.  for(iLoop=0
30f50 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69  ; iLoop<nLoop; i
30f60 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f  Loop++){.    nTo
30f70 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69   = 0;.    for(ii
30f80 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b  =0, pFrom=aFrom;
30f90 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c   ii<nFrom; ii++,
30fa0 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
30fb0 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e   for(pWLoop=pWIn
30fc0 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f  fo->pLoops; pWLo
30fd0 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f  op; pWLoop=pWLoo
30fe0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20  p->pNextLoop){. 
30ff0 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
31000 61 73 6b 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  askNew;.        
31010 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20  Bitmask revMask 
31020 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20  = 0;.        u8 
31030 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d  isOrderedValid =
31040 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
31050 64 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20  dValid;.        
31060 75 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70  u8 isOrdered = p
31070 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b  From->isOrdered;
31080 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
31090 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e  Loop->prereq & ~
310a0 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29  pFrom->maskLoop)
310b0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
310c0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c          if( (pWL
310d0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20  oop->maskSelf & 
310e0 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29  pFrom->maskLoop)
310f0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
31100 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
31110 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70  is point, pWLoop
31120 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
31130 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c  to be the next l
31140 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  oop. .        **
31150 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73   Compute its cos
31160 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 43 6f  t */.        rCo
31170 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  st = sqlite3LogE
31180 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53  stAdd(pWLoop->rS
31190 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75  etup,pWLoop->rRu
311a0 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29  n + pFrom->nRow)
311b0 3b 0a 20 20 20 20 20 20 20 20 72 43 6f 73 74 20  ;.        rCost 
311c0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
311d0 64 64 28 72 43 6f 73 74 2c 20 70 46 72 6f 6d 2d  dd(rCost, pFrom-
311e0 3e 72 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20  >rCost);.       
311f0 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e   nOut = pFrom->n
31200 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f  Row + pWLoop->nO
31210 75 74 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  ut;.        mask
31220 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73  New = pFrom->mas
31230 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e  kLoop | pWLoop->
31240 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
31250 20 20 69 66 28 20 21 69 73 4f 72 64 65 72 65 64    if( !isOrdered
31260 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Valid ){.       
31270 20 20 20 73 77 69 74 63 68 28 20 77 68 65 72 65     switch( where
31280 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
31290 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20  erBy(pWInfo,.   
312a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
312b0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64      pWInfo->pOrd
312c0 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49  erBy, pFrom, pWI
312d0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c  nfo->wctrlFlags,
312e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
312f0 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70          iLoop, p
31300 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29  WLoop, &revMask)
31310 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31320 63 61 73 65 20 31 3a 20 20 2f 2a 20 59 65 73 2e  case 1:  /* Yes.
31330 20 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 64    pFrom+pWLoop d
31340 6f 65 73 20 73 61 74 69 73 66 79 20 74 68 65 20  oes satisfy the 
31350 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
31360 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
31370 20 69 73 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a   isOrdered = 1;.
31380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
31390 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31  OrderedValid = 1
313a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
313b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
313c0 20 20 20 63 61 73 65 20 30 3a 20 20 2f 2a 20 4e     case 0:  /* N
313d0 6f 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70  o.  pFrom+pWLoop
313e0 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
313f0 73 65 70 61 72 61 74 65 20 73 6f 72 74 20 2a 2f  separate sort */
31400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
31410 73 4f 72 64 65 72 65 64 20 3d 20 30 3b 0a 20 20  sOrdered = 0;.  
31420 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
31430 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a  deredValid = 1;.
31440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 43                rC
31450 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ost = sqlite3Log
31460 45 73 74 41 64 64 28 72 43 6f 73 74 2c 20 72 53  EstAdd(rCost, rS
31470 6f 72 74 43 6f 73 74 29 3b 0a 20 20 20 20 20 20  ortCost);.      
31480 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
31490 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75             defau
314a0 6c 74 3a 20 2f 2a 20 43 61 6e 6e 6f 74 20 74 65  lt: /* Cannot te
314b0 6c 6c 20 79 65 74 2e 20 20 54 72 79 20 61 67 61  ll yet.  Try aga
314c0 69 6e 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 69  in on the next i
314d0 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  teration */.    
314e0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
314f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31500 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
31510 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20 3d 20        revMask = 
31520 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a  pFrom->revLoop;.
31530 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31540 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
31550 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75  e if pWLoop shou
31560 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ld be added to t
31570 68 65 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74  he mxChoice best
31580 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20   so far */.     
31590 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f     for(jj=0, pTo
315a0 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a  =aTo; jj<nTo; jj
315b0 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20  ++, pTo++){.    
315c0 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d        if( pTo->m
315d0 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77  askLoop==maskNew
315e0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
315f0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c  To->isOrderedVal
31600 69 64 3d 3d 69 73 4f 72 64 65 72 65 64 56 61 6c  id==isOrderedVal
31610 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  id.           &&
31620 20 28 28 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72   ((pTo->rCost<=r
31630 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f  Cost && pTo->nRo
31640 77 3c 3d 6e 4f 75 74 29 20 7c 7c 0a 20 20 20 20  w<=nOut) ||.    
31650 20 20 20 20 20 20 20 20 20 20 20 20 28 70 54 6f              (pTo
31660 2d 3e 72 43 6f 73 74 3e 3d 72 43 6f 73 74 20 26  ->rCost>=rCost &
31670 26 20 70 54 6f 2d 3e 6e 52 6f 77 3e 3d 6e 4f 75  & pTo->nRow>=nOu
31680 74 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  t)).          ){
31690 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
316a0 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31  tcase( jj==nTo-1
316b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
316c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
316d0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
316e0 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f       if( jj>=nTo
316f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
31700 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20  ( nTo>=mxChoice 
31710 26 26 20 72 43 6f 73 74 3e 3d 6d 78 43 6f 73 74  && rCost>=mxCost
31720 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45   ){.#ifdef WHERE
31730 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
31740 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
31750 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
31760 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
31770 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
31780 67 50 72 69 6e 74 66 28 22 53 6b 69 70 20 20 20  gPrintf("Skip   
31790 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
317a0 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
317b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317c0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
317d0 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
317e0 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
317f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31800 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c      isOrderedVal
31810 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20  id ? (isOrdered 
31820 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27  ? 'Y' : 'N') : '
31830 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
31840 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
31850 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
31860 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31870 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20 6e        /* Add a n
31880 65 77 20 50 61 74 68 20 74 6f 20 74 68 65 20 61  ew Path to the a
31890 54 6f 5b 5d 20 73 65 74 20 2a 2f 0a 20 20 20 20  To[] set */.    
318a0 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78        if( nTo<mx
318b0 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20  Choice ){.      
318c0 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73        /* Increas
318d0 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
318e0 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f 6e 65  e aTo set by one
318f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
31900 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20  jj = nTo++;.    
31910 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31920 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
31930 70 61 74 68 20 72 65 70 6c 61 63 65 73 20 74 68  path replaces th
31940 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20 74 6f  e prior worst to
31950 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f   keep count belo
31960 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20  w mxChoice */.  
31970 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d            jj = m
31980 78 49 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xI;.          }.
31990 20 20 20 20 20 20 20 20 20 20 70 54 6f 20 3d 20            pTo = 
319a0 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66  &aTo[jj];.#ifdef
319b0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
319c0 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20 69 66  LED.          if
319d0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
319e0 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
319f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
31a00 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20  bugPrintf("New  
31a10 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
31a20 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
31a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a40 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
31a50 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
31a60 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
31a70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31a80 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64    isOrderedValid
31a90 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20   ? (isOrdered ? 
31aa0 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27  'Y' : 'N') : '?'
31ab0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  );.          }.#
31ac0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65  endif.        }e
31ad0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
31ae0 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72  f( pTo->rCost<=r
31af0 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f  Cost && pTo->nRo
31b00 77 3c 3d 6e 4f 75 74 20 29 7b 0a 23 69 66 64 65  w<=nOut ){.#ifde
31b10 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
31b20 42 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20 20  BLED.           
31b30 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
31b40 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
31b50 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
31b60 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
31b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b80 20 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73    "Skip   %s cos
31b90 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72  t=%-3d,%3d order
31ba0 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%c",.          
31bb0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
31bc0 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
31bd0 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
31be0 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
31bf0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
31c00 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73  deredValid ? (is
31c10 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
31c20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
31c30 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
31c40 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
31c50 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25 2d 33    vs %s cost=%-3
31c60 64 2c 25 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  d,%d order=%c\n"
31c70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31c80 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
31c90 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
31ca0 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
31cb0 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
31cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f               pTo
31cd0 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
31ce0 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   ? (pTo->isOrder
31cf0 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20  ed ? 'Y' : 'N') 
31d00 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
31d10 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
31d20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
31d30 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  e( pTo->rCost==r
31d40 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Cost );.        
31d50 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
31d60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31d70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
31d80 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b  o->rCost==rCost+
31d90 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  1 );.          /
31da0 2a 20 41 20 6e 65 77 20 61 6e 64 20 62 65 74 74  * A new and bett
31db0 65 72 20 73 63 6f 72 65 20 66 6f 72 20 61 20 70  er score for a p
31dc0 72 65 76 69 6f 75 73 6c 79 20 63 72 65 61 74 65  reviously create
31dd0 64 20 65 71 75 69 76 61 6c 65 6e 74 20 70 61 74  d equivalent pat
31de0 68 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52  h */.#ifdef WHER
31df0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
31e00 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
31e10 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
31e20 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
31e30 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
31e40 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
31e50 20 20 20 20 20 20 22 55 70 64 61 74 65 20 25 73        "Update %s
31e60 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f   cost=%-3d,%3d o
31e70 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20  rder=%c",.      
31e80 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
31e90 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
31ea0 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
31eb0 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20  Cost, nOut,.    
31ec0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
31ed0 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73  deredValid ? (is
31ee0 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
31ef0 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
31f00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31f10 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 77  DebugPrintf("  w
31f20 61 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c  as %s cost=%-3d,
31f30 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  %3d order=%c\n",
31f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31f50 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
31f60 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
31f70 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f   pTo->rCost, pTo
31f80 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  ->nRow,.        
31f90 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
31fa0 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70  rderedValid ? (p
31fb0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20  To->isOrdered ? 
31fc0 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27  'Y' : 'N') : '?'
31fd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  );.          }.#
31fe0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a  endif.        }.
31ff0 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f          /* pWLoo
32000 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20  p is a winner.  
32010 41 64 64 20 69 74 20 74 6f 20 74 68 65 20 73 65  Add it to the se
32020 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72  t of best so far
32030 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d   */.        pTo-
32040 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f  >maskLoop = pFro
32050 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57  m->maskLoop | pW
32060 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
32070 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76          pTo->rev
32080 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a  Loop = revMask;.
32090 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f          pTo->nRo
320a0 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20  w = nOut;.      
320b0 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72    pTo->rCost = r
320c0 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54  Cost;.        pT
320d0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  o->isOrderedVali
320e0 64 20 3d 20 69 73 4f 72 64 65 72 65 64 56 61 6c  d = isOrderedVal
320f0 69 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  id;.        pTo-
32100 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f  >isOrdered = isO
32110 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20  rdered;.        
32120 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f  memcpy(pTo->aLoo
32130 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c  p, pFrom->aLoop,
32140 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
32150 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  p*)*iLoop);.    
32160 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69      pTo->aLoop[i
32170 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a  Loop] = pWLoop;.
32180 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e          if( nTo>
32190 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20  =mxChoice ){.   
321a0 20 20 20 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a         mxI = 0;.
321b0 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74            mxCost
321c0 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b   = aTo[0].rCost;
321d0 0a 20 20 20 20 20 20 20 20 20 20 6d 78 4f 75 74  .          mxOut
321e0 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a   = aTo[0].nRow;.
321f0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a            for(jj
32200 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b  =1, pTo=&aTo[1];
32210 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a   jj<mxChoice; jj
32220 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20  ++, pTo++){.    
32230 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
32240 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c  >rCost>mxCost ||
32250 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78   (pTo->rCost==mx
32260 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f  Cost && pTo->nRo
32270 77 3e 6d 78 4f 75 74 29 20 29 7b 0a 20 20 20 20  w>mxOut) ){.    
32280 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74            mxCost
32290 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20   = pTo->rCost;. 
322a0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 4f               mxO
322b0 75 74 20 3d 20 70 54 6f 2d 3e 6e 52 6f 77 3b 0a  ut = pTo->nRow;.
322c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78                mx
322d0 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20  I = jj;.        
322e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
322f0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
32300 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65    }.    }..#ifde
32310 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
32320 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c  BLED.    if( sql
32330 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3e 3d  ite3WhereTrace>=
32340 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
32350 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d  e3DebugPrintf("-
32360 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20  --- after round 
32370 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f  %d ----\n", iLoo
32380 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  p);.      for(ii
32390 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c  =0, pTo=aTo; ii<
323a0 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b  nTo; ii++, pTo++
323b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
323c0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
323d0 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f  %s cost=%-3d nro
323e0 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22  w=%-3d order=%c"
323f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 77 68 65  ,.           whe
32400 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
32410 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
32420 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52  ->rCost, pTo->nR
32430 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ow,.           p
32440 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c  To->isOrderedVal
32450 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  id ? (pTo->isOrd
32460 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
32470 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
32480 20 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64    if( pTo->isOrd
32490 65 72 65 64 56 61 6c 69 64 20 26 26 20 70 54 6f  eredValid && pTo
324a0 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20  ->isOrdered ){. 
324b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
324c0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 72 65  DebugPrintf(" re
324d0 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f  v=0x%llx\n", pTo
324e0 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20  ->revLoop);.    
324f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32500 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
32510 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
32520 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32530 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
32540 20 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72     /* Swap the r
32550 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e  oles of aFrom an
32560 64 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65  d aTo for the ne
32570 78 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  xt generation */
32580 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f  .    pFrom = aTo
32590 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f  ;.    aTo = aFro
325a0 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70  m;.    aFrom = p
325b0 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20  From;.    nFrom 
325c0 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66  = nTo;.  }..  if
325d0 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20  ( nFrom==0 ){.  
325e0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
325f0 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75  g(pParse, "no qu
32600 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a  ery solution");.
32610 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
32620 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20  e(db, pSpace);. 
32630 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
32640 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20  _ERROR;.  }.  . 
32650 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77   /* Find the low
32660 65 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20  est cost path.  
32670 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65  pFrom will be le
32680 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ft pointing to t
32690 68 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46  hat path */.  pF
326a0 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66  rom = aFrom;.  f
326b0 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f  or(ii=1; ii<nFro
326c0 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  m; ii++){.    if
326d0 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61  ( pFrom->rCost>a
326e0 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29  From[ii].rCost )
326f0 20 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b   pFrom = &aFrom[
32700 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ii];.  }.  asser
32710 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  t( pWInfo->nLeve
32720 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a  l==nLoop );.  /*
32730 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74   Load the lowest
32740 20 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20   cost path into 
32750 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28  pWInfo */.  for(
32760 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e  iLoop=0; iLoop<n
32770 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
32780 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a      WhereLevel *
32790 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d  pLevel = pWInfo-
327a0 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20  >a + iLoop;.    
327b0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d  pLevel->pWLoop =
327c0 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d   pWLoop = pFrom-
327d0 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20  >aLoop[iLoop];. 
327e0 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d     pLevel->iFrom
327f0 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b   = pWLoop->iTab;
32800 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61  .    pLevel->iTa
32810 62 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  bCur = pWInfo->p
32820 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
32830 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f  l->iFrom].iCurso
32840 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57  r;.  }.  if( (pW
32850 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
32860 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
32870 53 54 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26  STINCT)!=0.   &&
32880 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
32890 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
328a0 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26  TINCTBY)==0.   &
328b0 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  & pWInfo->eDisti
328c0 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  nct==WHERE_DISTI
328d0 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e  NCT_NOOP.   && n
328e0 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20  RowEst.  ){.    
328f0 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b  Bitmask notUsed;
32900 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68  .    int rc = wh
32910 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
32920 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20  OrderBy(pWInfo, 
32930 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
32940 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20  et, pFrom,.     
32950 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
32960 45 5f 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c  E_DISTINCTBY, nL
32970 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c  oop-1, pFrom->aL
32980 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e  oop[nLoop-1], &n
32990 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28  otUsed);.    if(
329a0 20 72 63 3d 3d 31 20 29 20 70 57 49 6e 66 6f 2d   rc==1 ) pWInfo-
329b0 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
329c0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
329d0 52 45 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  RED;.  }.  if( p
329e0 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 20  From->isOrdered 
329f0 29 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  ){.    if( pWInf
32a00 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
32a10 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
32a20 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   ){.      pWInfo
32a30 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
32a40 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
32a50 45 52 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ERED;.    }else{
32a60 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 62  .      pWInfo->b
32a70 4f 42 53 61 74 20 3d 20 31 3b 0a 20 20 20 20 20  OBSat = 1;.     
32a80 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
32a90 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f   = pFrom->revLoo
32aa0 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  p;.    }.  }.  p
32ab0 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d  WInfo->nRowOut =
32ac0 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20   pFrom->nRow;.. 
32ad0 20 2f 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61   /* Free tempora
32ae0 72 79 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65  ry memory and re
32af0 74 75 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a  turn success */.
32b00 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
32b10 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72  db, pSpace);.  r
32b20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
32b30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71  .}../*.** Most q
32b40 75 65 72 69 65 73 20 75 73 65 20 6f 6e 6c 79 20  ueries use only 
32b50 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 28  a single table (
32b60 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69  they are not joi
32b70 6e 73 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20  ns) and have.** 
32b80 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72  simple == constr
32b90 61 69 6e 74 73 20 61 67 61 69 6e 73 74 20 69 6e  aints against in
32ba0 64 65 78 65 64 20 66 69 65 6c 64 73 2e 20 20 54  dexed fields.  T
32bb0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
32bc0 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20  mpts.** to plan 
32bd0 74 68 6f 73 65 20 73 69 6d 70 6c 65 20 63 61 73  those simple cas
32be0 65 73 20 75 73 69 6e 67 20 6d 75 63 68 20 6c 65  es using much le
32bf0 73 73 20 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e  ss ceremony than
32c00 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d   the.** general-
32c10 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c  purpose query pl
32c20 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68 65 72 65  anner, and there
32c30 62 79 20 79 69 65 6c 64 20 66 61 73 74 65 72 20  by yield faster 
32c40 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
32c50 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20 74  ).** times for t
32c60 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  he common case..
32c70 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e  **.** Return non
32c80 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73  -zero on success
32c90 2c 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20  , if this query 
32ca0 63 61 6e 20 62 65 20 68 61 6e 64 6c 65 64 20 62  can be handled b
32cb0 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69  y this.** no-fri
32cc0 6c 6c 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  lls query planne
32cd0 72 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20  r.  Return zero 
32ce0 69 66 20 74 68 69 73 20 71 75 65 72 79 20 6e 65  if this query ne
32cf0 65 64 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65  eds the .** gene
32d00 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72  ral-purpose quer
32d10 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74  y planner..*/.st
32d20 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 53 68  atic int whereSh
32d30 6f 72 74 43 75 74 28 57 68 65 72 65 4c 6f 6f 70  ortCut(WhereLoop
32d40 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
32d50 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  r){.  WhereInfo 
32d60 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63  *pWInfo;.  struc
32d70 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
32d80 70 49 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c  pItem;.  WhereCl
32d90 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65  ause *pWC;.  Whe
32da0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
32db0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
32dc0 70 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20  p;.  int iCur;. 
32dd0 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20   int j;.  Table 
32de0 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a  *pTab;.  Index *
32df0 70 49 64 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66  pIdx;.  .  pWInf
32e00 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
32e10 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e  Info;.  if( pWIn
32e20 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
32e30 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42   WHERE_FORCE_TAB
32e40 4c 45 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  LE ) return 0;. 
32e50 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
32e60 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e  >pTabList->nSrc>
32e70 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20  =1 );.  pItem = 
32e80 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
32e90 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49  ->a;.  pTab = pI
32ea0 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28  tem->pTab;.  if(
32eb0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
32ec0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
32ed0 66 28 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78  f( pItem->zIndex
32ee0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
32ef0 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  Cur = pItem->iCu
32f00 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70  rsor;.  pWC = &p
32f10 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c  WInfo->sWC;.  pL
32f20 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  oop = pBuilder->
32f30 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77  pNew;.  pLoop->w
32f40 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 54  sFlags = 0;.  pT
32f50 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
32f60 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c  WC, iCur, -1, 0,
32f70 20 57 4f 5f 45 51 2c 20 30 29 3b 0a 20 20 69 66   WO_EQ, 0);.  if
32f80 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 70  ( pTerm ){.    p
32f90 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
32fa0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
32fb0 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f  WHERE_IPK|WHERE_
32fc0 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f  ONEROW;.    pLoo
32fd0 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70  p->aLTerm[0] = p
32fe0 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  Term;.    pLoop-
32ff0 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  >nLTerm = 1;.   
33000 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
33010 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20  nEq = 1;.    /* 
33020 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20  TUNING: Cost of 
33030 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69  a rowid lookup i
33040 73 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f  s 10 */.    pLoo
33050 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f  p->rRun = 33;  /
33060 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  * 33==sqlite3Log
33070 45 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c  Est(10) */.  }el
33080 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  se{.    for(pIdx
33090 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
330a0 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
330b0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
330c0 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54  sert( pLoop->aLT
330d0 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d  ermSpace==pLoop-
330e0 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20 20  >aLTerm );.     
330f0 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69   assert( ArraySi
33100 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  ze(pLoop->aLTerm
33110 53 70 61 63 65 29 3d 3d 34 20 29 3b 0a 20 20 20  Space)==4 );.   
33120 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
33130 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 0a 20  rror==OE_None . 
33140 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 70        || pIdx->p
33150 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 20  PartIdxWhere!=0 
33160 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d  .       || pIdx-
33170 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53 69  >nKeyCol>ArraySi
33180 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  ze(pLoop->aLTerm
33190 53 70 61 63 65 29 20 0a 20 20 20 20 20 20 29 20  Space) .      ) 
331a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
331b0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d  for(j=0; j<pIdx-
331c0 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  >nKeyCol; j++){.
331d0 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
331e0 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
331f0 75 72 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ur, pIdx->aiColu
33200 6d 6e 5b 6a 5d 2c 20 30 2c 20 57 4f 5f 45 51 2c  mn[j], 0, WO_EQ,
33210 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
33220 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62  if( pTerm==0 ) b
33230 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 70 4c  reak;.        pL
33240 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d  oop->aLTerm[j] =
33250 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   pTerm;.      }.
33260 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49 64        if( j!=pId
33270 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e  x->nKeyCol ) con
33280 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f  tinue;.      pLo
33290 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  op->wsFlags = WH
332a0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48  ERE_COLUMN_EQ|WH
332b0 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45  ERE_ONEROW|WHERE
332c0 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20  _INDEXED;.      
332d0 69 66 28 20 70 49 64 78 2d 3e 69 73 43 6f 76 65  if( pIdx->isCove
332e0 72 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e  ring || (pItem->
332f0 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d  colUsed & ~colum
33300 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78 29 29  nsInIndex(pIdx))
33310 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
33320 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
33330 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b   WHERE_IDX_ONLY;
33340 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
33350 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a  Loop->nLTerm = j
33360 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  ;.      pLoop->u
33370 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a  .btree.nEq = j;.
33380 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62        pLoop->u.b
33390 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49  tree.pIndex = pI
333a0 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e  dx;.      /* TUN
333b0 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75  ING: Cost of a u
333c0 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b  nique index look
333d0 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20  up is 15 */.    
333e0 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20    pLoop->rRun = 
333f0 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69  39;  /* 39==sqli
33400 74 65 33 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f  te3LogEst(15) */
33410 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
33420 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c    }.  }.  if( pL
33430 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a  oop->wsFlags ){.
33440 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20      pLoop->nOut 
33450 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20  = (LogEst)1;.   
33460 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57   pWInfo->a[0].pW
33470 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20  Loop = pLoop;.  
33480 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c    pLoop->maskSel
33490 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49  f = getMask(&pWI
334a0 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69  nfo->sMaskSet, i
334b0 43 75 72 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  Cur);.    pWInfo
334c0 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d  ->a[0].iTabCur =
334d0 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49 6e 66   iCur;.    pWInf
334e0 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a  o->nRowOut = 1;.
334f0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
33500 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66  pOrderBy ) pWInf
33510 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 20 31 3b 0a  o->bOBSat =  1;.
33520 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
33530 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
33540 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
33550 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   ){.      pWInfo
33560 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
33570 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
33580 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  QUE;.    }.#ifde
33590 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
335a0 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20     pLoop->cId = 
335b0 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  '0';.#endif.    
335c0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
335d0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
335e0 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
335f0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
33600 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57   loop used for W
33610 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
33620 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72  essing..** The r
33630 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
33640 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
33650 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20  paque structure 
33660 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
33670 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65   information nee
33680 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ded to terminate
33690 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65   the loop.  Late
336a0 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  r, the calling r
336b0 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64  outine.** should
336c0 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57   invoke sqlite3W
336d0 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74  hereEnd() with t
336e0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
336f0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
33700 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
33710 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45  complete the WHE
33720 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
33730 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  sing..**.** If a
33740 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
33750 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
33760 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  urns NULL..**.**
33770 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20   The basic idea 
33780 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65  is to do a neste
33790 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70  d loop, one loop
337a0 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
337b0 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  in.** the FROM c
337c0 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63  lause of a selec
337d0 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20  t.  (INSERT and 
337e0 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
337f0 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d  s are the.** sam
33800 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69  e as a SELECT wi
33810 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  th only a single
33820 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
33830 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72  OM clause.)  For
33840 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  .** example, if 
33850 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a  the SQL is this:
33860 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c  .**.**       SEL
33870 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
33880 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b  2, t3 WHERE ...;
33890 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20  .**.** Then the 
338a0 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69  code generated i
338b0 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c  s conceptually l
338c0 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ike the followin
338d0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f  g:.**.**      fo
338e0 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
338f0 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43   do       \    C
33900 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
33910 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
33920 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20  row2 in t2 do   
33930 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
33940 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a  3WhereBegin().**
33950 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
33960 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20  h row3 in t3 do 
33970 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    /.**          
33980 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
33990 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
339a0 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43            \    C
339b0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
339c0 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
339d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
339e0 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
339f0 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20  3WhereEnd().**  
33a00 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
33a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  /.**.** Note tha
33a30 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68  t the loops migh
33a40 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20  t not be nested 
33a50 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20  in the order in 
33a60 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70  which they.** ap
33a70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
33a80 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66   clause if a dif
33a90 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20  ferent order is 
33aa0 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d  better able to m
33ab0 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e  ake.** use of in
33ac0 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73  dices.  Note als
33ad0 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20  o that when the 
33ae0 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65  IN operator appe
33af0 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48  ars in.** the WH
33b00 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d  ERE clause, it m
33b10 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61  ight result in a
33b20 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64  dditional nested
33b30 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63   loops for.** sc
33b40 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61  anning through a
33b50 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65  ll values on the
33b60 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
33b70 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a   of the IN..**.*
33b80 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65  * There are Btre
33b90 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  e cursors associ
33ba0 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74  ated with each t
33bb0 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63  able.  t1 uses c
33bc0 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20  ursor.** number 
33bd0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
33be0 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73  Cursor.  t2 uses
33bf0 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62   the cursor pTab
33c00 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73  List->a[1].iCurs
33c10 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f  or..** And so fo
33c20 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69  rth.  This routi
33c30 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
33c40 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20  e to open those 
33c50 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20  VDBE cursors.** 
33c60 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  and sqlite3Where
33c70 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20  End() generates 
33c80 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73  the code to clos
33c90 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  e them..**.** Th
33ca0 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69  e code that sqli
33cb0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
33cc0 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73  generates leaves
33cd0 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d   the cursors nam
33ce0 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73  ed.** in pTabLis
33cf0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  t pointing at th
33d00 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20  eir appropriate 
33d10 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e  entries.  The [.
33d20 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20  ..] code.** can 
33d30 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e  use OP_Column an
33d40 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64  d OP_Rowid opcod
33d50 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73  es on these curs
33d60 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a  ors to extract.*
33d70 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
33d80 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f  various tables o
33d90 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  f the loop..**.*
33da0 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  * If the WHERE c
33db0 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20  lause is empty, 
33dc0 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70  the foreach loop
33dd0 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e  s must each scan
33de0 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65   their.** entire
33df0 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61   tables.  Thus a
33e00 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20   three-way join 
33e10 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65  is an O(N^3) ope
33e20 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a  ration.  But if.
33e30 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61  ** the tables ha
33e40 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74  ve indices and t
33e50 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69  here are terms i
33e60 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
33e70 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  se that.** refer
33e80 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65   to those indice
33e90 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61  s, a complete ta
33ea0 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20  ble scan can be 
33eb0 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a  avoided and the.
33ec0 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e  ** code will run
33ed0 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d   much faster.  M
33ee0 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20  ost of the work 
33ef0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
33f00 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74  is checking.** t
33f10 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
33f20 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20  re indices that 
33f30 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73  can be used to s
33f40 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70  peed up the loop
33f50 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66  ..**.** Terms of
33f60 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
33f70 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20  e are also used 
33f80 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72  to limit which r
33f90 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  ows actually.** 
33fa0 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22  make it to the "
33fb0 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64  ..." in the midd
33fc0 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  le of the loop. 
33fd0 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72   After each "for
33fe0 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20  each",.** terms 
33ff0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
34000 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c  use that use onl
34010 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20  y terms in that 
34020 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a  loop and outer.*
34030 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c  * loops are eval
34040 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c  uated and if fal
34050 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  se a jump is mad
34060 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62  e around all sub
34070 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72  sequent.** inner
34080 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e   loops (or aroun
34090 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74  d the "..." if t
340a0 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77  he test occurs w
340b0 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d  ithin the inner-
340c0 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a  .** most loop).*
340d0 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53  *.** OUTER JOINS
340e0 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20  .**.** An outer 
340f0 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74  join of tables t
34100 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63  1 and t2 is conc
34110 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73  eptally coded as
34120 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
34130 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
34140 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20  in t1 do.**     
34150 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20   flag = 0.**    
34160 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
34170 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t2 do.**      
34180 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20    start:.**     
34190 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
341a0 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a       flag = 1.**
341b0 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20        end.**    
341c0 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65    if flag==0 the
341d0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65  n.**        move
341e0 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72   the row2 cursor
341f0 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a   to a null row.*
34200 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74  *        goto st
34210 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a  art.**      fi.*
34220 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f  *    end.**.** O
34230 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50  RDER BY CLAUSE P
34240 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20  ROCESSING.**.** 
34250 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70 6f  pOrderBy is a po
34260 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44  inter to the ORD
34270 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f 72  ER BY clause (or
34280 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
34290 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20 57  ause.** if the W
342a0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61  HERE_GROUPBY fla
342b0 67 20 69 73 20 73 65 74 20 69 6e 20 77 63 74 72  g is set in wctr
342c0 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45 4c  lFlags) of a SEL
342d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
342e0 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
342f0 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
34300 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
34310 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75  e or if this rou
34320 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
34330 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45  d from an UPDATE
34340 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
34350 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65  ment, then pOrde
34360 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  rBy is NULL..*/.
34370 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74  WhereInfo *sqlit
34380 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20  e3WhereBegin(.  
34390 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
343a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
343b0 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
343c0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
343d0 73 74 2c 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  st,    /* FROM c
343e0 6c 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f 66  lause: A list of
343f0 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62   all tables to b
34400 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45  e scanned */.  E
34410 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
34420 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
34430 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
34440 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
34450 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20  ,   /* An ORDER 
34460 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55  BY clause, or NU
34470 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
34480 20 2a 70 52 65 73 75 6c 74 53 65 74 2c 20 2f 2a   *pResultSet, /*
34490 20 52 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   Result set of t
344a0 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 75 31  he query */.  u1
344b0 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20  6 wctrlFlags,   
344c0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
344d0 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20  e WHERE_* flags 
344e0 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74  defined in sqlit
344f0 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20  eInt.h */.  int 
34500 69 49 64 78 43 75 72 20 20 20 20 20 20 20 20 20  iIdxCur         
34510 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e    /* If WHERE_ON
34520 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73  ETABLE_ONLY is s
34530 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72  et, index cursor
34540 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
34550 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20  int nByteWInfo; 
34560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
34570 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  m. bytes allocat
34580 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f  ed for WhereInfo
34590 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74   struct */.  int
345a0 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20   nTabList;      
345b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
345c0 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
345d0 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57   pTabList */.  W
345e0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
345f0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c  ;         /* Wil
34600 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74  l become the ret
34610 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
34620 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
34630 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
34640 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68  ->pVdbe;   /* Th
34650 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61  e virtual databa
34660 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42  se engine */.  B
34670 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b  itmask notReady;
34680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
34690 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
346a0 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64  t yet positioned
346b0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42   */.  WhereLoopB
346c0 75 69 6c 64 65 72 20 73 57 4c 42 3b 20 20 20 20  uilder sWLB;    
346d0 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f   /* The WhereLoo
346e0 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57  p builder */.  W
346f0 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
34700 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65  skSet;    /* The
34710 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b   expression mask
34720 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c   set */.  WhereL
34730 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20  evel *pLevel;   
34740 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
34750 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f   level in pWInfo
34760 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  ->a[] */.  Where
34770 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
34780 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
34790 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65   to a single Whe
347a0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
347b0 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
347c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
347d0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
347e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
347f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34800 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
34810 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
34820 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34830 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
34840 6f 64 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61  ode */...  /* Va
34850 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a  riable initializ
34860 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20  ation */.  db = 
34870 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65  pParse->db;.  me
34880 6d 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73  mset(&sWLB, 0, s
34890 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 20 20  izeof(sWLB));.  
348a0 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20  sWLB.pOrderBy = 
348b0 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  pOrderBy;..  /* 
348c0 44 69 73 61 62 6c 65 20 74 68 65 20 44 49 53 54  Disable the DIST
348d0 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f  INCT optimizatio
348e0 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74  n if SQLITE_Dist
348f0 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20 76  inctOpt is set v
34900 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ia.  ** sqlite3_
34910 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45  test_ctrl(SQLITE
34920 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
34930 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a  ZATIONS,...) */.
34940 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
34950 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
34960 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70  QLITE_DistinctOp
34970 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72 6c 46  t) ){.    wctrlF
34980 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 57  lags &= ~WHERE_W
34990 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20  ANT_DISTINCT;.  
349a0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62  }..  /* The numb
349b0 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
349c0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
349d0 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68  is limited by th
349e0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  e number of.  **
349f0 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61   bits in a Bitma
34a00 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  sk .  */.  testc
34a10 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e  ase( pTabList->n
34a20 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66  Src==BMS );.  if
34a30 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
34a40 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69  >BMS ){.    sqli
34a50 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
34a60 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20  se, "at most %d 
34a70 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e  tables in a join
34a80 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74  ", BMS);.    ret
34a90 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
34aa0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   This function n
34ab0 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  ormally generate
34ac0 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  s a nested loop 
34ad0 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  for all tables i
34ae0 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74  n .  ** pTabList
34af0 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57 48  .  But if the WH
34b00 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
34b10 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  Y flag is set, t
34b20 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20  hen we should.  
34b30 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65  ** only generate
34b40 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69   code for the fi
34b50 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61  rst table in pTa
34b60 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65  bList and assume
34b70 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63   that.  ** any c
34b80 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65  ursors associate
34b90 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65 6e  d with subsequen
34ba0 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69  t tables are uni
34bb0 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
34bc0 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77  .  nTabList = (w
34bd0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
34be0 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
34bf0 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d   ? 1 : pTabList-
34c00 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  >nSrc;..  /* All
34c10 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
34c20 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e  lize the WhereIn
34c30 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
34c40 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
34c50 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61  e.  ** return va
34c60 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c  lue. A single al
34c70 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64  location is used
34c80 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68   to store the Wh
34c90 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72  ereInfo.  ** str
34ca0 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  uct, the content
34cb0 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61  s of WhereInfo.a
34cc0 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61  [], the WhereCla
34cd0 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  use structure.  
34ce0 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65  ** and the Where
34cf0 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
34d00 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c  e. Since WhereCl
34d10 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ause contains an
34d20 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65   8-byte.  ** fie
34d30 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b  ld (type Bitmask
34d40 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69  ) it must be ali
34d50 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74  gned on an 8-byt
34d60 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20  e boundary on.  
34d70 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63  ** some architec
34d80 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65  tures. Hence the
34d90 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e   ROUND8() below.
34da0 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e  .  */.  nByteWIn
34db0 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  fo = ROUND8(size
34dc0 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e  of(WhereInfo)+(n
34dd0 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f  TabList-1)*sizeo
34de0 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a  f(WhereLevel));.
34df0 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
34e00 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
34e10 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20  b, nByteWInfo + 
34e20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
34e30 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ));.  if( db->ma
34e40 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
34e50 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
34e60 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20  db, pWInfo);.   
34e70 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20   pWInfo = 0;.   
34e80 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
34e90 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49  Error;.  }.  pWI
34ea0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54  nfo->nLevel = nT
34eb0 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
34ec0 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
34ed0 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61  e;.  pWInfo->pTa
34ee0 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  bList = pTabList
34ef0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  ;.  pWInfo->pOrd
34f00 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
34f10 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  .  pWInfo->pResu
34f20 6c 74 53 65 74 20 3d 20 70 52 65 73 75 6c 74 53  ltSet = pResultS
34f30 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42  et;.  pWInfo->iB
34f40 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
34f50 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
34f60 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46    pWInfo->wctrlF
34f70 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67  lags = wctrlFlag
34f80 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76  s;.  pWInfo->sav
34f90 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  edNQueryLoop = p
34fa0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
34fb0 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20  p;.  pMaskSet = 
34fc0 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
34fd0 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f  t;.  sWLB.pWInfo
34fe0 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c   = pWInfo;.  sWL
34ff0 42 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d  B.pWC = &pWInfo-
35000 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65  >sWC;.  sWLB.pNe
35010 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29  w = (WhereLoop*)
35020 28 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29  (((char*)pWInfo)
35030 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20  +nByteWInfo);.  
35040 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
35050 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c  TE_ALIGNMENT(sWL
35060 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65  B.pNew) );.  whe
35070 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e  reLoopInit(sWLB.
35080 70 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51  pNew);.#ifdef SQ
35090 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c  LITE_DEBUG.  sWL
350a0 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a  B.pNew->cId = '*
350b0 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  ';.#endif..  /* 
350c0 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20  Split the WHERE 
350d0 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61  clause into sepa
350e0 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69  rate subexpressi
350f0 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20  ons where each. 
35100 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f   ** subexpressio
35110 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62  n is separated b
35120 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  y an AND operato
35130 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61  r..  */.  initMa
35140 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b  skSet(pMaskSet);
35150 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  .  whereClauseIn
35160 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  it(&pWInfo->sWC,
35170 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69   pWInfo);.  sqli
35180 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74  te3ExprCodeConst
35190 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57 68  ants(pParse, pWh
351a0 65 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70 6c  ere);.  whereSpl
351b0 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  it(&pWInfo->sWC,
351c0 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29   pWhere, TK_AND)
351d0 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  ;.  sqlite3CodeV
351e0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
351f0 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65  se, -1); /* Inse
35200 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65  rt the cookie ve
35210 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20  rifier Goto */. 
35220 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c     .  /* Special
35230 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63   case: a WHERE c
35240 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f  lause that is co
35250 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74  nstant.  Evaluat
35260 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65  e the.  ** expre
35270 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72  ssion and either
35280 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f   jump over all o
35290 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61  f the code or fa
352a0 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20  ll thru..  */.  
352b0 69 66 28 20 70 57 68 65 72 65 20 26 26 20 28 6e  if( pWhere && (n
352c0 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71  TabList==0 || sq
352d0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
352e0 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72  antNotJoin(pWher
352f0 65 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  e)) ){.    sqlit
35300 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
35310 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57  arse, pWhere, pW
35320 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51  Info->iBreak, SQ
35330 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
35340 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30  ;.    pWhere = 0
35350 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63  ;.  }..  /* Spec
35360 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f  ial case: No FRO
35370 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  M clause.  */.  
35380 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20  if( nTabList==0 
35390 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  ){.    if( pOrde
353a0 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 62 4f  rBy ) pWInfo->bO
353b0 42 53 61 74 20 3d 20 31 3b 0a 20 20 20 20 69 66  BSat = 1;.    if
353c0 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
353d0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
353e0 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e  CT ){.      pWIn
353f0 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
35400 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
35410 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  NIQUE;.    }.  }
35420 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20  ..  /* Assign a 
35430 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74  bit from the bit
35440 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65  mask to every te
35450 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  rm in the FROM c
35460 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
35470 20 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20   When assigning 
35480 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74  bitmask values t
35490 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75  o FROM clause cu
354a0 72 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62  rsors, it must b
354b0 65 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20  e.  ** the case 
354c0 74 68 61 74 20 69 66 20 58 20 69 73 20 74 68 65  that if X is the
354d0 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
354e0 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73   N-th FROM claus
354f0 65 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a  e term then.  **
35500 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
35510 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65   all FROM clause
35520 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65   terms to the le
35530 66 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74  ft of the N-th t
35540 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31  erm.  ** is (X-1
35550 29 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73 69  ).   An expressi
35560 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63  on from the ON c
35570 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20  lause of a LEFT 
35580 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a  JOIN can use.  *
35590 2a 20 69 74 73 20 45 78 70 72 2e 69 52 69 67 68  * its Expr.iRigh
355a0 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65  tJoinTable value
355b0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74   to find the bit
355c0 6d 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68  mask of the righ
355d0 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20  t table.  ** of 
355e0 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72  the join.  Subtr
355f0 61 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20  acting one from 
35600 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
35610 62 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a  bitmask gives a.
35620 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72    ** bitmask for
35630 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74   all tables to t
35640 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a  he left of the j
35650 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68  oin.  Knowing th
35660 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66  e bitmask.  ** f
35670 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  or all tables to
35680 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c   the left of a l
35690 65 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f  eft join is impo
356a0 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23  rtant.  Ticket #
356b0 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  3015..  **.  ** 
356c0 4e 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61 73  Note that bitmas
356d0 6b 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66  ks are created f
356e0 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d  or all pTabList-
356f0 3e 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a  >nSrc tables in.
35700 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e    ** pTabList, n
35710 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73  ot just the firs
35720 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65  t nTabList table
35730 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20  s.  nTabList is 
35740 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71  normally.  ** eq
35750 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d  ual to pTabList-
35760 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20  >nSrc but might 
35770 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20  be shortened to 
35780 31 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48  1 if the.  ** WH
35790 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
357a0 59 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20  Y flag is set.. 
357b0 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
357c0 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ii<pTabList->nSr
357d0 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72  c; ii++){.    cr
357e0 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65  eateMask(pMaskSe
357f0 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
35800 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d  i].iCursor);.  }
35810 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
35820 20 20 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20    {.    Bitmask 
35830 74 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20  toTheLeft = 0;. 
35840 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
35850 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
35860 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74  ii++){.      Bit
35870 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b  mask m = getMask
35880 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c  (pMaskSet, pTabL
35890 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73  ist->a[ii].iCurs
358a0 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  or);.      asser
358b0 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c  t( (m-1)==toTheL
358c0 65 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54  eft );.      toT
358d0 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20  heLeft |= m;.   
358e0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
358f0 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20   /* Analyze all 
35900 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73  of the subexpres
35910 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61  sions.  Note tha
35920 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20  t exprAnalyze() 
35930 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e  might.  ** add n
35940 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ew virtual terms
35950 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
35960 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
35970 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20  e.  We do not.  
35980 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79  ** want to analy
35990 7a 65 20 74 68 65 73 65 20 76 69 72 74 75 61 6c  ze these virtual
359a0 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74   terms, so start
359b0 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68   analyzing at th
359c0 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77  e end.  ** and w
359d0 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74  ork forward so t
359e0 68 61 74 20 74 68 65 20 61 64 64 65 64 20 76 69  hat the added vi
359f0 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20  rtual terms are 
35a00 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e  never processed.
35a10 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c  .  */.  exprAnal
35a20 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c  yzeAll(pTabList,
35a30 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a   &pWInfo->sWC);.
35a40 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
35a50 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
35a60 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
35a70 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  or;.  }..  /* If
35a80 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 28 6f   the ORDER BY (o
35a90 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61 75  r GROUP BY) clau
35aa0 73 65 20 63 6f 6e 74 61 69 6e 73 20 72 65 66 65  se contains refe
35ab0 72 65 6e 63 65 73 20 74 6f 20 67 65 6e 65 72 61  rences to genera
35ac0 6c 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  l.  ** expressio
35ad0 6e 73 2c 20 74 68 65 6e 20 77 65 20 77 6f 6e 27  ns, then we won'
35ae0 74 20 62 65 20 61 62 6c 65 20 74 6f 20 73 61 74  t be able to sat
35af0 69 73 66 79 20 69 74 20 75 73 69 6e 67 20 69 6e  isfy it using in
35b00 64 69 63 65 73 2c 20 73 6f 0a 20 20 2a 2a 20 67  dices, so.  ** g
35b10 6f 20 61 68 65 61 64 20 61 6e 64 20 64 69 73 61  o ahead and disa
35b20 62 6c 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f  ble it now..  */
35b30 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
35b40 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
35b50 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
35b60 49 4e 43 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  INCT)!=0 ){.    
35b70 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72  for(ii=0; ii<pOr
35b80 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69  derBy->nExpr; ii
35b90 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
35ba0 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  *pExpr = sqlite3
35bb0 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
35bc0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e  pOrderBy->a[ii].
35bd0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
35be0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
35bf0 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
35c00 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
35c10 42 79 20 3d 20 70 4f 72 64 65 72 42 79 20 3d 20  By = pOrderBy = 
35c20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  0;.        break
35c30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
35c40 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
35c50 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  <0 ){.        br
35c60 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
35c70 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 63   }.  }..  if( wc
35c80 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
35c90 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
35ca0 7b 0a 20 20 20 20 69 66 28 20 69 73 44 69 73 74  {.    if( isDist
35cb0 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50  inctRedundant(pP
35cc0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
35cd0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52  &pWInfo->sWC, pR
35ce0 65 73 75 6c 74 53 65 74 29 20 29 7b 0a 20 20 20  esultSet) ){.   
35cf0 20 20 20 2f 2a 20 54 68 65 20 44 49 53 54 49 4e     /* The DISTIN
35d00 43 54 20 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f  CT marking is po
35d10 69 6e 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65  intless.  Ignore
35d20 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57   it. */.      pW
35d30 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
35d40 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
35d50 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c  _UNIQUE;.    }el
35d60 73 65 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d  se if( pOrderBy=
35d70 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
35d80 72 79 20 74 6f 20 4f 52 44 45 52 20 42 59 20 74  ry to ORDER BY t
35d90 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74 6f  he result set to
35da0 20 6d 61 6b 65 20 64 69 73 74 69 6e 63 74 20 70   make distinct p
35db0 72 6f 63 65 73 73 69 6e 67 20 65 61 73 69 65 72  rocessing easier
35dc0 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   */.      pWInfo
35dd0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  ->wctrlFlags |= 
35de0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
35df0 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ;.      pWInfo->
35e00 70 4f 72 64 65 72 42 79 20 3d 20 70 52 65 73 75  pOrderBy = pResu
35e10 6c 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  ltSet;.    }.  }
35e20 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74  ..  /* Construct
35e30 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   the WhereLoop o
35e40 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 48 45 52  bjects */.  WHER
35e50 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 28 22  ETRACE(0xffff,("
35e60 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74  *** Optimizer St
35e70 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20  art ***\n"));.  
35e80 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20  if( nTabList!=1 
35e90 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75 74  || whereShortCut
35ea0 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20  (&sWLB)==0 ){.  
35eb0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
35ec0 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20  AddAll(&sWLB);. 
35ed0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
35ee0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
35ef0 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 44 69 73 70  ;.  .    /* Disp
35f00 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 57  lay all of the W
35f10 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
35f20 20 69 66 20 77 68 65 72 65 74 72 61 63 65 20 69   if wheretrace i
35f30 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 23 69 66  s enabled */.#if
35f40 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
35f50 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73  NABLED.    if( s
35f60 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
35f70 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c   ){.      WhereL
35f80 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e  oop *p;.      in
35f90 74 20 69 3b 0a 20 20 20 20 20 20 73 74 61 74 69  t i;.      stati
35fa0 63 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20  c char zLabel[] 
35fb0 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63  = "0123456789abc
35fc0 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
35fd0 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20  tuvwyxz".       
35fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36000 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
36010 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20  PQRSTUVWYXZ";.  
36020 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f      for(p=pWInfo
36030 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70  ->pLoops, i=0; p
36040 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ; p=p->pNextLoop
36050 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  , i++){.        
36060 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b  p->cId = zLabel[
36070 69 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29  i%sizeof(zLabel)
36080 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  ];.        where
36090 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 54 61  LoopPrint(p, pTa
360a0 62 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  bList);.      }.
360b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a      }.#endif.  .
360c0 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c      wherePathSol
360d0 76 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a  ver(pWInfo, 0);.
360e0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
360f0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
36100 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
36110 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
36120 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
36130 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c      wherePathSol
36140 76 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e  ver(pWInfo, pWIn
36150 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a  fo->nRowOut+1);.
36160 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
36170 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
36180 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
36190 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  or;.    }.  }.  
361a0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
361b0 65 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e  erBy==0 && (db->
361c0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
361d0 65 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30 20  everseOrder)!=0 
361e0 29 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ){.     pWInfo->
361f0 72 65 76 4d 61 73 6b 20 3d 20 28 42 69 74 6d 61  revMask = (Bitma
36200 73 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 69  sk)(-1);.  }.  i
36210 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
36220 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c  || NEVER(db->mal
36230 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20  locFailed) ){.  
36240 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
36250 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64  nError;.  }.#ifd
36260 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
36270 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
36280 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b  te3WhereTrace ){
36290 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
362a0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
362b0 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69  ntf("---- Soluti
362c0 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49  on nRow=%d", pWI
362d0 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20  nfo->nRowOut);. 
362e0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 62     if( pWInfo->b
362f0 4f 42 53 61 74 20 29 7b 0a 20 20 20 20 20 20 73  OBSat ){.      s
36300 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
36310 66 28 22 20 4f 52 44 45 52 42 59 3d 30 78 25 6c  f(" ORDERBY=0x%l
36320 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76  lx", pWInfo->rev
36330 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Mask);.    }.   
36340 20 73 77 69 74 63 68 28 20 70 57 49 6e 66 6f 2d   switch( pWInfo-
36350 3e 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  >eDistinct ){.  
36360 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
36370 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20  ISTINCT_UNIQUE: 
36380 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
36390 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
363a0 44 49 53 54 49 4e 43 54 3d 75 6e 69 71 75 65 22  DISTINCT=unique"
363b0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
363c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
363d0 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
363e0 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20  NCT_ORDERED: {. 
363f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
36400 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
36410 54 49 4e 43 54 3d 6f 72 64 65 72 65 64 22 29 3b  TINCT=ordered");
36420 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
36430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
36440 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  se WHERE_DISTINC
36450 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20  T_UNORDERED: {. 
36460 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
36470 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
36480 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64 22  TINCT=unordered"
36490 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
364a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
364b0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
364c0 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
364d0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
364e0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
364f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72  i++){.      wher
36500 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e 66  eLoopPrint(pWInf
36510 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c  o->a[ii].pWLoop,
36520 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20   pTabList);.    
36530 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f  }.  }.#endif.  /
36540 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69  * Attempt to omi
36550 74 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74 68  t tables from th
36560 65 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e  e join that do n
36570 6f 74 20 65 66 66 65 63 74 20 74 68 65 20 72 65  ot effect the re
36580 73 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20 70 57  sult */.  if( pW
36590 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a  Info->nLevel>=2.
365a0 20 20 20 26 26 20 70 52 65 73 75 6c 74 53 65 74     && pResultSet
365b0 21 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69  !=0.   && Optimi
365c0 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
365d0 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f  , SQLITE_OmitNoo
365e0 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20  pJoin).  ){.    
365f0 42 69 74 6d 61 73 6b 20 74 61 62 55 73 65 64 20  Bitmask tabUsed 
36600 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
36610 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
36620 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20  ResultSet);.    
36630 69 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42  if( sWLB.pOrderB
36640 79 20 29 20 74 61 62 55 73 65 64 20 7c 3d 20 65  y ) tabUsed |= e
36650 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
36660 65 28 70 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42  e(pMaskSet, sWLB
36670 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  .pOrderBy);.    
36680 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 6e  while( pWInfo->n
36690 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20 20 20 20  Level>=2 ){.    
366a0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
366b0 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20  rm, *pEnd;.     
366c0 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d   pLoop = pWInfo-
366d0 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  >a[pWInfo->nLeve
366e0 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20  l-1].pWLoop;.   
366f0 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
36700 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f  pTabList->a[pLoo
36710 70 2d 3e 69 54 61 62 5d 2e 6a 6f 69 6e 74 79 70  p->iTab].jointyp
36720 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20  e & JT_LEFT)==0 
36730 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
36740 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
36750 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
36760 49 4e 43 54 29 3d 3d 30 0a 20 20 20 20 20 20 20  INCT)==0.       
36770 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
36780 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
36790 57 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  W)==0.      ){. 
367a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
367b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
367c0 28 74 61 62 55 73 65 64 20 26 20 70 4c 6f 6f 70  (tabUsed & pLoop
367d0 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29  ->maskSelf)!=0 )
367e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 45   break;.      pE
367f0 6e 64 20 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61  nd = sWLB.pWC->a
36800 20 2b 20 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65   + sWLB.pWC->nTe
36810 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54  rm;.      for(pT
36820 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b  erm=sWLB.pWC->a;
36830 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65   pTerm<pEnd; pTe
36840 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
36850 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
36860 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  qAll & pLoop->ma
36870 73 6b 53 65 6c 66 29 21 3d 30 0a 20 20 20 20 20  skSelf)!=0.     
36880 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50      && !ExprHasP
36890 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
368a0 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
368b0 6e 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  n).        ){.  
368c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
368d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
368e0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
368f0 3c 70 45 6e 64 20 29 20 62 72 65 61 6b 3b 0a 20  <pEnd ) break;. 
36900 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
36910 30 78 66 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f  0xffff, ("-> dro
36920 70 20 6c 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73  p loop %c not us
36930 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49  ed\n", pLoop->cI
36940 64 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  d));.      pWInf
36950 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20  o->nLevel--;.   
36960 20 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20     nTabList--;. 
36970 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45     }.  }.  WHERE
36980 54 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a  TRACE(0xffff,("*
36990 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e  ** Optimizer Fin
369a0 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  ished ***\n"));.
369b0 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65    pWInfo->pParse
369c0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20  ->nQueryLoop += 
369d0 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b  pWInfo->nRowOut;
369e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
369f0 6c 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54  ller is an UPDAT
36a00 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
36a10 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65  ement that is re
36a20 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f  questing.  ** to
36a30 20 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20   use a one-pass 
36a40 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72  algorithm, deter
36a50 6d 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20  mine if this is 
36a60 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a  appropriate..  *
36a70 2a 20 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61  * The one-pass a
36a80 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f  lgorithm only wo
36a90 72 6b 73 20 69 66 20 74 68 65 20 57 48 45 52 45  rks if the WHERE
36aa0 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
36ab0 6e 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74  ns.  ** the stat
36ac0 65 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20  ement to update 
36ad0 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20  a single row..  
36ae0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  */.  assert( (wc
36af0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
36b00 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
36b10 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e  )==0 || pWInfo->
36b20 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69  nLevel==1 );.  i
36b30 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
36b40 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
36b50 45 53 49 52 45 44 29 21 3d 30 20 0a 20 20 20 26  ESIRED)!=0 .   &
36b60 26 20 28 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  & (pWInfo->a[0].
36b70 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  pWLoop->wsFlags 
36b80 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21  & WHERE_ONEROW)!
36b90 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f  =0 ){.    pWInfo
36ba0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b  ->okOnePass = 1;
36bb0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  .    pWInfo->a[0
36bc0 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ].pWLoop->wsFlag
36bd0 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f  s &= ~WHERE_IDX_
36be0 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ONLY;.  }..  /* 
36bf0 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20  Open all tables 
36c00 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20  in the pTabList 
36c10 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20  and any indices 
36c20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a  selected for.  *
36c30 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73  * searching thos
36c40 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
36c50 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
36c60 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
36c70 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
36c80 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69  fo->a; ii<nTabLi
36c90 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c  st; ii++, pLevel
36ca0 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
36cb0 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62  pTab;     /* Tab
36cc0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
36cd0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
36ce0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64     /* Index of d
36cf0 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
36d00 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a  ng table/index *
36d10 2f 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  /.    struct Src
36d20 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
36d30 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74  tem;..    pTabIt
36d40 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
36d50 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
36d60 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61  ;.    pTab = pTa
36d70 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
36d80 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
36d90 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
36da0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
36db0 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
36dc0 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
36dd0 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
36de0 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
36df0 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e  al)!=0 || pTab->
36e00 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
36e10 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
36e20 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e  /.    }else.#ifn
36e30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
36e40 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
36e50 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
36e60 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
36e70 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
36e80 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
36e90 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73  r *pVTab = (cons
36ea0 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
36eb0 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54  GetVTable(db, pT
36ec0 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab);.      int i
36ed0 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
36ee0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73  iCursor;.      s
36ef0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
36f00 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43  (v, OP_VOpen, iC
36f10 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c  ur, 0, 0, pVTab,
36f20 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d   P4_VTAB);.    }
36f30 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75  else if( IsVirtu
36f40 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
36f50 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20    /* noop */.   
36f60 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
36f70 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
36f80 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
36f90 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20  X_ONLY)==0.     
36fa0 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
36fb0 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f  gs & WHERE_OMIT_
36fc0 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29  OPEN_CLOSE)==0 )
36fd0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d  {.      int op =
36fe0 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61   pWInfo->okOnePa
36ff0 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69 74  ss ? OP_OpenWrit
37000 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b  e : OP_OpenRead;
37010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
37020 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
37030 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
37040 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70  r, iDb, pTab, op
37050 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
37060 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  e( !pWInfo->okOn
37070 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e  ePass && pTab->n
37080 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
37090 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 70      testcase( !p
370a0 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
370b0 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d   && pTab->nCol==
370c0 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28  BMS );.      if(
370d0 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
370e0 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  ass && pTab->nCo
370f0 6c 3c 42 4d 53 20 26 26 20 48 61 73 52 6f 77 69  l<BMS && HasRowi
37100 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
37110 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70     Bitmask b = p
37120 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
37130 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  ;.        int n 
37140 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
37150 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b  (; b; b=b>>1, n+
37160 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c  +){}.        sql
37170 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
37180 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
37190 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
371a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
371b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
371c0 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
371d0 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  n), P4_INT32);. 
371e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
371f0 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  <=pTab->nCol );.
37200 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
37210 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
37220 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
37230 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
37240 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
37250 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
37260 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
37270 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
37280 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   ){.      Index 
37290 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  *pIx = pLoop->u.
372a0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
372b0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
372c0 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  y = sqlite3Index
372d0 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20  Keyinfo(pParse, 
372e0 70 49 78 29 3b 0a 20 20 20 20 20 20 2f 2a 20 46  pIx);.      /* F
372f0 49 58 4d 45 3a 20 20 41 73 20 61 6e 20 6f 70 74  IXME:  As an opt
37300 69 6d 69 7a 61 74 69 6f 6e 20 75 73 65 20 70 54  imization use pT
37310 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  abItem->iCursor 
37320 69 66 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  if WHERE_IDX_ONL
37330 59 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  Y */.      int i
37340 49 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76 65  IndexCur = pLeve
37350 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49 64  l->iIdxCur = iId
37360 78 43 75 72 20 3f 20 69 49 64 78 43 75 72 20 3a  xCur ? iIdxCur :
37370 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
37380 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
37390 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  Ix->pSchema==pTa
373a0 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
373b0 20 20 20 20 61 73 73 65 72 74 28 20 69 49 6e 64      assert( iInd
373c0 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20  exCur>=0 );.    
373d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
373e0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Op4(v, OP_OpenRe
373f0 61 64 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70  ad, iIndexCur, p
37400 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20  Ix->tnum, iDb,. 
37410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37420 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
37430 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  ey, P4_KEYINFO_H
37440 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 56  ANDOFF);.      V
37450 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
37460 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29  %s", pIx->zName)
37470 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
37480 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
37490 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
374a0 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20  );.    notReady 
374b0 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49  &= ~getMask(&pWI
374c0 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
374d0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
374e0 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d  );.  }.  pWInfo-
374f0 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  >iTop = sqlite3V
37500 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
37510 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
37520 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
37530 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
37540 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
37550 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20   the code to do 
37560 74 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63  the search.  Eac
37570 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  h iteration of t
37580 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70  he for.  ** loop
37590 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73   below generates
375a0 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67   code for a sing
375b0 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f  le nested loop o
375c0 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72  f the VM.  ** pr
375d0 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f  ogram..  */.  no
375e0 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
375f0 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30  sk)0;.  for(ii=0
37600 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  ; ii<nTabList; i
37610 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  i++){.    pLevel
37620 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69   = &pWInfo->a[ii
37630 5d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ];.#ifndef SQLIT
37640 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
37650 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28  _INDEX.    if( (
37660 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e  pLevel->pWLoop->
37670 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
37680 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29  AUTO_INDEX)!=0 )
37690 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63  {.      construc
376a0 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
376b0 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d  pParse, &pWInfo-
376c0 3e 73 57 43 2c 0a 20 20 20 20 20 20 20 20 20 20  >sWC,.          
376d0 20 20 20 20 20 20 26 70 54 61 62 4c 69 73 74 2d        &pTabList-
376e0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
376f0 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65  ], notReady, pLe
37700 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  vel);.      if( 
37710 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
37720 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
37730 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23  inError;.    }.#
37740 65 6e 64 69 66 0a 20 20 20 20 65 78 70 6c 61 69  endif.    explai
37750 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72 73 65 2c  nOneScan(pParse,
37760 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65   pTabList, pLeve
37770 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69  l, ii, pLevel->i
37780 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73  From, wctrlFlags
37790 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  );.    pLevel->a
377a0 64 64 72 42 6f 64 79 20 3d 20 73 71 6c 69 74 65  ddrBody = sqlite
377b0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
377c0 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64  (v);.    notRead
377d0 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53  y = codeOneLoopS
377e0 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c  tart(pWInfo, ii,
377f0 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20   notReady);.    
37800 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
37810 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  e = pLevel->addr
37820 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Cont;.  }..  /* 
37830 44 6f 6e 65 2e 20 2a 2f 0a 20 20 72 65 74 75 72  Done. */.  retur
37840 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20  n pWInfo;..  /* 
37850 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c  Jump here if mal
37860 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65  loc fails */.whe
37870 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20  reBeginError:.  
37880 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20  if( pWInfo ){.  
37890 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
378a0 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
378b0 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
378c0 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65      whereInfoFre
378d0 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
378e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
378f0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
37900 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
37910 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65  WHERE loop.  See
37920 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a   comments on .**
37930 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
37940 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  in() for additio
37950 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
37960 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
37970 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e  WhereEnd(WhereIn
37980 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50  fo *pWInfo){.  P
37990 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
379a0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
379b0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
379c0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
379d0 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  i;.  WhereLevel 
379e0 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65  *pLevel;.  Where
379f0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53  Loop *pLoop;.  S
37a00 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
37a10 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
37a20 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist;.  sqlite3 *
37a30 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
37a40 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
37a50 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e  loop termination
37a60 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71   code..  */.  sq
37a70 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
37a80 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66  ear(pParse);.  f
37a90 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65  or(i=pWInfo->nLe
37aa0 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  vel-1; i>=0; i--
37ab0 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  ){.    pLevel = 
37ac0 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20  &pWInfo->a[i];. 
37ad0 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
37ae0 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 73  l->pWLoop;.    s
37af0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
37b00 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
37b10 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20  ->addrCont);.   
37b20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21   if( pLevel->op!
37b30 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
37b40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
37b50 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  Op2(v, pLevel->o
37b60 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70  p, pLevel->p1, p
37b70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20  Level->p2);.    
37b80 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
37b90 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d  ngeP5(v, pLevel-
37ba0 3e 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >p5);.    }.    
37bb0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
37bc0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42  gs & WHERE_IN_AB
37bd0 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e  LE && pLevel->u.
37be0 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20  in.nIn>0 ){.    
37bf0 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20    struct InLoop 
37c00 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20  *pIn;.      int 
37c10 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  j;.      sqlite3
37c20 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
37c30 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
37c40 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Nxt);.      for(
37c50 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  j=pLevel->u.in.n
37c60 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d  In, pIn=&pLevel-
37c70 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d  >u.in.aInLoop[j-
37c80 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49  1]; j>0; j--, pI
37c90 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71  n--){.        sq
37ca0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
37cb0 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  e(v, pIn->addrIn
37cc0 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  Top+1);.        
37cd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
37ce0 32 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f  2(v, pIn->eEndLo
37cf0 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c  opOp, pIn->iCur,
37d00 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29   pIn->addrInTop)
37d10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
37d20 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
37d30 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d   pIn->addrInTop-
37d40 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
37d50 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
37d60 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  db, pLevel->u.in
37d70 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d  .aInLoop);.    }
37d80 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
37d90 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
37da0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
37db0 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
37dc0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  ->iLeftJoin ){. 
37dd0 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
37de0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
37df0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
37e00 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65   OP_IfPos, pLeve
37e10 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
37e20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
37e30 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
37e40 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
37e50 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
37e60 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
37e70 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
37e80 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
37e90 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
37ea0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
37eb0 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
37ec0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
37ed0 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
37ee0 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
37ef0 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .iCursor);.     
37f00 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f   }.      if( pLo
37f10 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
37f20 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
37f30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
37f40 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
37f50 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e  ullRow, pLevel->
37f60 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
37f70 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  }.      if( pLev
37f80 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72  el->op==OP_Retur
37f90 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  n ){.        sql
37fa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
37fb0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76  , OP_Gosub, pLev
37fc0 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e  el->p1, pLevel->
37fd0 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
37fe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
37ff0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
38000 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
38010 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69  , pLevel->addrFi
38020 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rst);.      }.  
38030 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
38040 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
38050 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
38060 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f  * The "break" po
38070 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73  int is here, jus
38080 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  t past the end o
38090 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70  f the outer loop
380a0 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20  ..  ** Set it.. 
380b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
380c0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
380d0 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29   pWInfo->iBreak)
380e0 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
380f0 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73  l of the cursors
38100 20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65   that were opene
38110 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  d by sqlite3Wher
38120 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 61  eBegin..  */.  a
38130 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e  ssert( pWInfo->n
38140 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74 2d  Level<=pTabList-
38150 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69  >nSrc );.  for(i
38160 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
38170 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e  o->a; i<pWInfo->
38180 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65  nLevel; i++, pLe
38190 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65  vel++){.    Inde
381a0 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20  x *pIdx = 0;.   
381b0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
381c0 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d  item *