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

Artifact 32b6e99b4343958f5ca641e3d62fe3da072f7128:


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 0a 20  n==nKeyCol );.. 
13b40 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 61   /* Create the a
13b50 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a  utomatic index *
13b60 2f 0a 20 20 70 4b 65 79 69 6e 66 6f 20 3d 20 73  /.  pKeyinfo = s
13b70 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
13b80 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
13b90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 76  ;.  assert( pLev
13ba0 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29  el->iIdxCur>=0 )
13bb0 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ;.  pLevel->iIdx
13bc0 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Cur = pParse->nT
13bd0 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56  ab++;.  sqlite3V
13be0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
13bf0 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70  OpenAutoindex, p
13c00 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20  Level->iIdxCur, 
13c10 6e 4b 65 79 43 6f 6c 2b 31 2c 20 30 2c 0a 20 20  nKeyCol+1, 0,.  
13c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c30 20 20 28 63 68 61 72 2a 29 70 4b 65 79 69 6e 66    (char*)pKeyinf
13c40 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
13c50 4e 44 4f 46 46 29 3b 0a 20 20 56 64 62 65 43 6f  NDOFF);.  VdbeCo
13c60 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72 20 25  mment((v, "for %
13c70 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  s", pTable->zNam
13c80 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  e));..  /* Fill 
13c90 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
13ca0 64 65 78 20 77 69 74 68 20 63 6f 6e 74 65 6e 74  dex with content
13cb0 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20   */.  addrTop = 
13cc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13cd0 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
13ce0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29  pLevel->iTabCur)
13cf0 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20  ;.  regRecord = 
13d00 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
13d10 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
13d20 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
13d30 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 64  xKey(pParse, pId
13d40 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  x, pLevel->iTabC
13d50 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 31  ur, regRecord, 1
13d60 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
13d70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13d80 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65  IdxInsert, pLeve
13d90 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52  l->iIdxCur, regR
13da0 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
13db0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
13dc0 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
13dd0 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65  ESULT);.  sqlite
13de0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13df0 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e  P_Next, pLevel->
13e00 69 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70  iTabCur, addrTop
13e10 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  +1);.  sqlite3Vd
13e20 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
13e30 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
13e40 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71  AUTOINDEX);.  sq
13e50 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
13e60 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  e(v, addrTop);. 
13e70 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
13e80 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
13e90 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20  egRecord);.  .  
13ea0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65  /* Jump here whe
13eb0 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  n skipping the i
13ec0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f  nitialization */
13ed0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
13ee0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e  mpHere(v, addrIn
13ef0 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  it);.}.#endif /*
13f00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13f10 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
13f20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13f30 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
13f40 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  E./*.** Allocate
13f50 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e   and populate an
13f60 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
13f70 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49  nfo structure. I
13f80 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
13f90 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
13fa0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
13fb0 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20  ntually release 
13fc0 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  the structure.**
13fd0 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20   by passing the 
13fe0 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
13ff0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
14000 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65  n to sqlite3_fre
14010 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  e()..*/.static s
14020 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
14030 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78  o *allocateIndex
14040 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70  Info(.  Parse *p
14050 50 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c  Parse,.  WhereCl
14060 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 73 74 72  ause *pWC,.  str
14070 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
14080 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69   *pSrc,.  ExprLi
14090 73 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a  st *pOrderBy.){.
140a0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
140b0 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63  t nTerm;.  struc
140c0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
140d0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78  constraint *pIdx
140e0 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
140f0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
14100 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42  erby *pIdxOrderB
14110 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  y;.  struct sqli
14120 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
14130 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
14140 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ge;.  WhereTerm 
14150 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f  *pTerm;.  int nO
14160 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65  rderBy;.  sqlite
14170 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
14180 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f  dxInfo;..  /* Co
14190 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
141a0 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45  f possible WHERE
141b0 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
141c0 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20  nts referring.  
141d0 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74 75  ** to this virtu
141e0 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f  al table */.  fo
141f0 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65  r(i=nTerm=0, pTe
14200 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
14210 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
14220 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
14230 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
14240 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  r != pSrc->iCurs
14250 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  or ) continue;. 
14260 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77     assert( IsPow
14270 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65  erOfTwo(pTerm->e
14280 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45  Operator & ~WO_E
14290 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73  QUIV) );.    tes
142a0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
142b0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
142c0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
142d0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
142e0 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
142f0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
14300 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
14310 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e  ISNULL) ) contin
14320 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
14330 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
14340 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
14350 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b  ue;.    nTerm++;
14360 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
14370 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
14380 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
14390 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63  columns in the c
143a0 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72  urrent .  ** vir
143b0 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20  tual table then 
143c0 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
143d0 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79 20  or the aOrderBy 
143e0 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65  part of.  ** the
143f0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
14400 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20  nfo structure.. 
14410 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   */.  nOrderBy =
14420 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72   0;.  if( pOrder
14430 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  By ){.    int n 
14440 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
14450 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  r;.    for(i=0; 
14460 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
14470 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
14480 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
14490 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
144a0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
144b0 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  UMN || pExpr->iT
144c0 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72  able!=pSrc->iCur
144d0 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
144e0 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 29   }.    if( i==n)
144f0 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79  {.      nOrderBy
14500 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = n;.    }.  }.
14510 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  /* Allocate t
14520 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
14530 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  _info structure.
14540 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20    */.  pIdxInfo 
14550 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
14560 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
14570 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e  , sizeof(*pIdxIn
14580 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo).            
14590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
145a0 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f   (sizeof(*pIdxCo
145b0 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55  ns) + sizeof(*pU
145c0 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20  sage))*nTerm.   
145d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145e0 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66          + sizeof
145f0 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e  (*pIdxOrderBy)*n
14600 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66 28  OrderBy );.  if(
14610 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a   pIdxInfo==0 ){.
14620 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14630 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74  Msg(pParse, "out
14640 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20   of memory");.  
14650 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
14660 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
14670 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20   the structure. 
14680 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
14690 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
146a0 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20  e contains.  ** 
146b0 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74  many fields that
146c0 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22 63   are declared "c
146d0 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74  onst" to prevent
146e0 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d   xBestIndex from
146f0 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74  .  ** changing t
14700 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f  hem.  We have to
14710 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63   do some funky c
14720 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20  asting in order 
14730 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  to.  ** initiali
14740 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e  ze those fields.
14750 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73  .  */.  pIdxCons
14760 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
14770 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
14780 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31  int*)&pIdxInfo[1
14790 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79  ];.  pIdxOrderBy
147a0 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
147b0 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
147c0 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72  *)&pIdxCons[nTer
147d0 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28  m];.  pUsage = (
147e0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
147f0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
14800 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65  usage*)&pIdxOrde
14810 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20  rBy[nOrderBy];. 
14820 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66   *(int*)&pIdxInf
14830 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->nConstraint =
14840 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a   nTerm;.  *(int*
14850 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64  )&pIdxInfo->nOrd
14860 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b  erBy = nOrderBy;
14870 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
14880 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
14890 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
148a0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  ->aConstraint = 
148b0 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74  pIdxCons;.  *(st
148c0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
148d0 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49  ex_orderby**)&pI
148e0 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79  dxInfo->aOrderBy
148f0 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a   = pIdxOrderBy;.
14900 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
14910 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
14920 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64  int_usage**)&pId
14930 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
14940 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20  ntUsage =.      
14950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14980 20 20 20 20 20 20 20 20 20 20 20 20 20 70 55 73               pUs
14990 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d  age;..  for(i=j=
149a0 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
149b0 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
149c0 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
149d0 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 69 66 28    u8 op;.    if(
149e0 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
149f0 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72  or != pSrc->iCur
14a00 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  sor ) continue;.
14a10 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f      assert( IsPo
14a20 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e  werOfTwo(pTerm->
14a30 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f  eOperator & ~WO_
14a40 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65  EQUIV) );.    te
14a50 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
14a60 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
14a70 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
14a80 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
14a90 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
14aa0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
14ab0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
14ac0 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69  _ISNULL) ) conti
14ad0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
14ae0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
14af0 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  RM_VNULL ) conti
14b00 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  nue;.    pIdxCon
14b10 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  s[j].iColumn = p
14b20 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
14b30 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  mn;.    pIdxCons
14b40 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20  [j].iTermOffset 
14b50 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75  = i;.    op = (u
14b60 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  8)pTerm->eOperat
14b70 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20  or & WO_ALL;.   
14b80 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29   if( op==WO_IN )
14b90 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20   op = WO_EQ;.   
14ba0 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20   pIdxCons[j].op 
14bb0 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65  = op;.    /* The
14bc0 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65   direct assignme
14bd0 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  nt in the previo
14be0 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69  us line is possi
14bf0 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65  ble only because
14c00 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20  .    ** the WO_ 
14c10 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  and SQLITE_INDEX
14c20 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64  _CONSTRAINT_ cod
14c30 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  es are identical
14c40 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f  .  The.    ** fo
14c50 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
14c60 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74  verify this fact
14c70 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
14c80 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49   WO_EQ==SQLITE_I
14c90 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
14ca0 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
14cb0 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_LT==SQLITE_
14cc0 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
14cd0 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LT );.    asser
14ce0 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45  t( WO_LE==SQLITE
14cf0 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
14d00 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65  T_LE );.    asse
14d10 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54  rt( WO_GT==SQLIT
14d20 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
14d30 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73  NT_GT );.    ass
14d40 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49  ert( WO_GE==SQLI
14d50 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
14d60 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73  INT_GE );.    as
14d70 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d  sert( WO_MATCH==
14d80 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
14d90 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b  STRAINT_MATCH );
14da0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
14db0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
14dc0 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f  (WO_IN|WO_EQ|WO_
14dd0 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
14de0 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29  O_GE|WO_MATCH) )
14df0 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    j++;.  }. 
14e00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
14e10 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
14e20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
14e30 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
14e40 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  pr;.    pIdxOrde
14e50 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  rBy[i].iColumn =
14e60 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
14e70 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
14e80 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65  [i].desc = pOrde
14e90 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
14ea0 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
14eb0 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a  rn pIdxInfo;.}..
14ec0 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  /*.** The table 
14ed0 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65  object reference
14ee0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
14ef0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
14f00 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  o this function.
14f10 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e  ** must represen
14f20 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
14f30 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
14f40 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65   invokes the xBe
14f50 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74  stIndex().** met
14f60 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
14f70 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  al table with th
14f80 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
14f90 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  info object that
14fa0 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20  .** comes in as 
14fb0 74 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74  the 3rd argument
14fc0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
14fd0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  n..**.** If an e
14fe0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61  rror occurs, pPa
14ff0 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64  rse is populated
15000 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d   with an error m
15010 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20  essage and a.** 
15020 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
15030 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
15040 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
15050 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74  rned and the out
15060 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74  put.** part of t
15070 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
15080 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
15090 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65  is left populate
150a0 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  d..**.** Whether
150b0 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   or not an error
150c0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
150d0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
150e0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
150f0 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
15100 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64  ually free p->id
15110 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54  xStr if p->needT
15120 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69  oFreeIdxStr indi
15130 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68  cates.** that th
15140 69 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  is is required..
15150 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74  */.static int vt
15160 61 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73  abBestIndex(Pars
15170 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
15180 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f   *pTab, sqlite3_
15190 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
151a0 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
151b0 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47  pVtab = sqlite3G
151c0 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d  etVTable(pParse-
151d0 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61  >db, pTab)->pVta
151e0 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
151f0 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49  t rc;..  TRACE_I
15200 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20  DX_INPUTS(p);.  
15210 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  rc = pVtab->pMod
15220 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28  ule->xBestIndex(
15230 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41  pVtab, p);.  TRA
15240 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70  CE_IDX_OUTPUTS(p
15250 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
15260 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
15270 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
15280 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MEM ){.      pPa
15290 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
152a0 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  ailed = 1;.    }
152b0 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d  else if( !pVtab-
152c0 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
152d0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
152e0 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
152f0 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
15300 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
15310 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
15320 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
15330 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ", pVtab->zErrMs
15340 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
15350 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
15360 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
15370 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
15380 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
15390 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
153a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
153b0 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  !p->aConstraint[
153c0 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e  i].usable && p->
153d0 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
153e0 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
153f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15400 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15410 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62   .          "tab
15420 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65  le %s: xBestInde
15430 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e  x returned an in
15440 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61  valid plan", pTa
15450 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
15460 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
15470 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23  Parse->nErr;.}.#
15480 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
15490 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
154a0 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
154b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
154c0 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
154d0 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT4./*.** Estim
154e0 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e  ate the location
154f0 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72   of a particular
15500 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b   key among all k
15510 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64  eys in an.** ind
15520 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72  ex.  Store the r
15530 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20  esults in aStat 
15540 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
15550 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20  *    aStat[0]   
15560 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f     Est. number o
15570 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e  f rows less than
15580 20 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61   pVal.**    aSta
15590 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[1]      Est. n
155a0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71  umber of rows eq
155b0 75 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a  ual to pVal.**.*
155c0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
155d0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  OK on success..*
155e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
155f0 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50  ereKeyStats(.  P
15600 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
15610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
15620 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
15630 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
15640 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
15650 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63     /* Index to c
15660 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f  onsider domain o
15670 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  f */.  UnpackedR
15680 65 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20  ecord *pRec,    
15690 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20     /* Vector of 
156a0 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64  values to consid
156b0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e  er */.  int roun
156c0 64 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  dUp,            
156d0 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20      /* Round up 
156e0 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20  if true.  Round 
156f0 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f  down if false */
15700 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61  .  tRowcnt *aSta
15710 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
15720 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69  * OUT: stats wri
15730 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tten here */.){.
15740 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61    IndexSample *a
15750 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61  Sample = pIdx->a
15760 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43  Sample;.  int iC
15770 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
15780 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
15790 66 20 72 65 71 75 69 72 65 64 20 73 74 61 74 73  f required stats
157a0 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20   in anEq[] etc. 
157b0 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20  */.  int iMin = 
157c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
157d0 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d   /* Smallest sam
157e0 70 6c 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74  ple not yet test
157f0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  ed */.  int i = 
15800 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 20  pIdx->nSample;  
15810 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20      /* Smallest 
15820 73 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68  sample larger th
15830 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70  an or equal to p
15840 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  Rec */.  int iTe
15850 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
15860 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d       /* Next sam
15870 70 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20  ple to test */. 
15880 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20   int res;       
15890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
158a0 52 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  Result of compar
158b0 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  ison operation *
158c0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
158d0 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44  E_DEBUG.  UNUSED
158e0 5f 50 41 52 41 4d 45 54 45 52 28 20 70 50 61 72  _PARAMETER( pPar
158f0 73 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  se );.#endif.  a
15900 73 73 65 72 74 28 20 70 52 65 63 21 3d 30 20 7c  ssert( pRec!=0 |
15910 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
15920 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
15930 69 66 28 20 70 52 65 63 3d 3d 30 20 29 20 72 65  if( pRec==0 ) re
15940 74 75 72 6e 3b 0a 20 20 69 43 6f 6c 20 3d 20 70  turn;.  iCol = p
15950 52 65 63 2d 3e 6e 46 69 65 6c 64 20 2d 20 31 3b  Rec->nField - 1;
15960 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d  .  assert( pIdx-
15970 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20  >nSample>0 );.  
15980 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e 6e 46  assert( pRec->nF
15990 69 65 6c 64 3e 30 20 26 26 20 69 43 6f 6c 3c 70  ield>0 && iCol<p
159a0 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20  Idx->nSampleCol 
159b0 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 54 65  );.  do{.    iTe
159c0 73 74 20 3d 20 28 69 4d 69 6e 2b 69 29 2f 32 3b  st = (iMin+i)/2;
159d0 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74  .    res = sqlit
159e0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
159f0 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 54 65 73  are(aSample[iTes
15a00 74 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 54  t].n, aSample[iT
15a10 65 73 74 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20  est].p, pRec);. 
15a20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
15a30 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65        iMin = iTe
15a40 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  st+1;.    }else{
15a50 0a 20 20 20 20 20 20 69 20 3d 20 69 54 65 73 74  .      i = iTest
15a60 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
15a70 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 20  ( res && iMin<i 
15a80 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
15a90 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
15aa0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
15ab0 74 20 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65  t statements che
15ac0 63 6b 20 74 68 61 74 20 74 68 65 20 62 69 6e 61  ck that the bina
15ad0 72 79 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20  ry search code. 
15ae0 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20   ** above found 
15af0 74 68 65 20 72 69 67 68 74 20 61 6e 73 77 65 72  the right answer
15b00 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72  . This block ser
15b10 76 65 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f  ves no purpose o
15b20 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74  ther.  ** than t
15b30 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73  o invoke the ass
15b40 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20  erts.  */.  if( 
15b50 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  res==0 ){.    /*
15b60 20 49 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20   If (res==0) is 
15b70 74 72 75 65 2c 20 74 68 65 6e 20 73 61 6d 70 6c  true, then sampl
15b80 65 20 24 69 20 6d 75 73 74 20 62 65 20 65 71 75  e $i must be equ
15b90 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20  al to pRec */.  
15ba0 20 20 61 73 73 65 72 74 28 20 69 3c 70 49 64 78    assert( i<pIdx
15bb0 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20  ->nSample );.   
15bc0 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69   assert( 0==sqli
15bd0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
15be0 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e  pare(aSample[i].
15bf0 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c  n, aSample[i].p,
15c00 20 70 52 65 63 29 0a 20 20 20 20 20 20 20 20 20   pRec).         
15c10 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
15c20 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
15c30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
15c40 74 68 65 72 77 69 73 65 2c 20 70 52 65 63 20 6d  therwise, pRec m
15c50 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20 74  ust be smaller t
15c60 68 61 6e 20 73 61 6d 70 6c 65 20 24 69 20 61 6e  han sample $i an
15c70 64 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20 20  d larger than.  
15c80 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24 69 2d    ** sample ($i-
15c90 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  1).  */.    asse
15ca0 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61  rt( i==pIdx->nSa
15cb0 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 7c  mple .         |
15cc0 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  | sqlite3VdbeRec
15cd0 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
15ce0 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  le[i].n, aSample
15cf0 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20  [i].p, pRec)>0. 
15d00 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
15d10 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
15d20 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72  led );.    asser
15d30 74 28 20 69 3d 3d 30 0a 20 20 20 20 20 20 20 20  t( i==0.        
15d40 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52   || sqlite3VdbeR
15d50 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
15d60 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61  mple[i-1].n, aSa
15d70 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52 65  mple[i-1].p, pRe
15d80 63 29 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  c)<0.         ||
15d90 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
15da0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7d  locFailed );.  }
15db0 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66  .#endif /* ifdef
15dc0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
15dd0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
15de0 6f 69 6e 74 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  oint, aSample[i]
15df0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73 61   is the first sa
15e00 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67 72 65  mple that is gre
15e10 61 74 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 6f  ater than.  ** o
15e20 72 20 65 71 75 61 6c 20 74 6f 20 70 56 61 6c 2e  r equal to pVal.
15e30 20 20 4f 72 20 69 66 20 69 3d 3d 70 49 64 78 2d    Or if i==pIdx-
15e40 3e 6e 53 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61  >nSample, then a
15e50 6c 6c 20 73 61 6d 70 6c 65 73 20 61 72 65 20 6c  ll samples are l
15e60 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 70 56  ess.  ** than pV
15e70 61 6c 2e 20 20 49 66 20 61 53 61 6d 70 6c 65 5b  al.  If aSample[
15e80 69 5d 3d 3d 70 56 61 6c 2c 20 74 68 65 6e 20 72  i]==pVal, then r
15e90 65 73 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  es==0..  */.  if
15ea0 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
15eb0 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70  aStat[0] = aSamp
15ec0 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d  le[i].anLt[iCol]
15ed0 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d  ;.    aStat[1] =
15ee0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71   aSample[i].anEq
15ef0 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b  [iCol];.  }else{
15f00 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f  .    tRowcnt iLo
15f10 77 65 72 2c 20 69 55 70 70 65 72 2c 20 69 47 61  wer, iUpper, iGa
15f20 70 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20  p;.    if( i==0 
15f30 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20  ){.      iLower 
15f40 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70 70 65  = 0;.      iUppe
15f50 72 20 3d 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 61  r = aSample[0].a
15f60 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d  nLt[iCol];.    }
15f70 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70 70  else{.      iUpp
15f80 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e 53  er = i>=pIdx->nS
15f90 61 6d 70 6c 65 20 3f 20 70 49 64 78 2d 3e 61 69  ample ? pIdx->ai
15fa0 52 6f 77 45 73 74 5b 30 5d 20 3a 20 61 53 61 6d  RowEst[0] : aSam
15fb0 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c  ple[i].anLt[iCol
15fc0 5d 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20  ];.      iLower 
15fd0 3d 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 61  = aSample[i-1].a
15fe0 6e 45 71 5b 69 43 6f 6c 5d 20 2b 20 61 53 61 6d  nEq[iCol] + aSam
15ff0 70 6c 65 5b 69 2d 31 5d 2e 61 6e 4c 74 5b 69 43  ple[i-1].anLt[iC
16000 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ol];.    }.    a
16010 53 74 61 74 5b 31 5d 20 3d 20 28 70 49 64 78 2d  Stat[1] = (pIdx-
16020 3e 6e 4b 65 79 43 6f 6c 3e 69 43 6f 6c 20 3f 20  >nKeyCol>iCol ? 
16030 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f  pIdx->aAvgEq[iCo
16040 6c 5d 20 3a 20 31 29 3b 0a 20 20 20 20 69 66 28  l] : 1);.    if(
16050 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20   iLower>=iUpper 
16060 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  ){.      iGap = 
16070 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
16080 20 20 20 20 69 47 61 70 20 3d 20 69 55 70 70 65      iGap = iUppe
16090 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20  r - iLower;.    
160a0 7d 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55  }.    if( roundU
160b0 70 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20  p ){.      iGap 
160c0 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20  = (iGap*2)/3;.  
160d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
160e0 47 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20  Gap = iGap/3;.  
160f0 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d    }.    aStat[0]
16100 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70   = iLower + iGap
16110 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
16120 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
16130 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a  STAT3_OR_STAT4 *
16140 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
16150 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
16160 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e  o estimate the n
16170 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
16180 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74  at will be visit
16190 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e  ed.** by scannin
161a0 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61  g an index for a
161b0 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73   range of values
161c0 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20  . The range may 
161d0 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a  have an upper.**
161e0 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20   bound, a lower 
161f0 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20  bound, or both. 
16200 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
16210 20 74 65 72 6d 73 20 74 68 61 74 20 73 65 74 20   terms that set 
16220 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64  the upper.** and
16230 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72   lower bounds ar
16240 65 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79  e represented by
16250 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
16260 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  er respectively.
16270 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c   For.** example,
16280 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69   assuming that i
16290 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28  ndex p is on t1(
162a0 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  a):.**.**   ... 
162b0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
162c0 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e  > ? AND a < ? ..
162d0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
162e0 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20          |_____| 
162f0 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20    |_____|.**    
16300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16310 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a     |         |.*
16320 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16330 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20        pLower    
16340 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20  pUpper.**.** If 
16350 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 75 70  either of the up
16360 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75  per or lower bou
16370 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  nd is not presen
16380 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20  t, then NULL is 
16390 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61  passed in.** pla
163a0 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73  ce of the corres
163b0 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72  ponding WhereTer
163c0 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  m..**.** The val
163d0 75 65 20 69 6e 20 28 70 42 75 69 6c 64 65 72 2d  ue in (pBuilder-
163e0 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  >pNew->u.btree.n
163f0 45 71 29 20 69 73 20 74 68 65 20 69 6e 64 65 78  Eq) is the index
16400 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a   of the index.**
16410 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20   column subject 
16420 74 6f 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e  to the range con
16430 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75  straint. Or, equ
16440 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e  ivalently, the n
16450 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 71 75 61  umber of.** equa
16460 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
16470 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68   optimized by th
16480 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78  e proposed index
16490 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70   scan. For examp
164a0 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20  le,.** assuming 
164b0 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31  index p is on t1
164c0 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20  (a, b), and the 
164d0 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a  SQL query is:.**
164e0 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
164f0 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e  1 WHERE a = ? AN
16500 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20  D b > ? AND b < 
16510 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ? ....**.** then
16520 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20 31   nEq is set to 1
16530 20 28 61 73 20 74 68 65 20 72 61 6e 67 65 20 72   (as the range r
16540 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e  estricted column
16550 2c 20 62 2c 20 69 73 20 74 68 65 20 73 65 63 6f  , b, is the seco
16560 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74  nd .** left-most
16570 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
16580 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68  ndex). Or, if th
16590 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a  e query is:.**.*
165a0 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
165b0 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20  WHERE a > ? AND 
165c0 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  a < ? ....**.** 
165d0 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20  then nEq is set 
165e0 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  to 0..**.** When
165f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
16600 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74  s called, *pnOut
16610 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
16620 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 29 20 6f  qlite3LogEst() o
16630 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  f the.** number 
16640 6f 66 20 72 6f 77 73 20 74 68 61 74 20 74 68 65  of rows that the
16650 20 69 6e 64 65 78 20 73 63 61 6e 20 69 73 20 65   index scan is e
16660 78 70 65 63 74 65 64 20 74 6f 20 76 69 73 69 74  xpected to visit
16670 20 77 69 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e   without .** con
16680 73 69 64 65 72 69 6e 67 20 74 68 65 20 72 61 6e  sidering the ran
16690 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ge constraints. 
166a0 49 66 20 6e 45 71 20 69 73 20 30 2c 20 74 68 69  If nEq is 0, thi
166b0 73 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  s is the number 
166c0 6f 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74  of .** rows in t
166d0 68 65 20 69 6e 64 65 78 2e 20 41 73 73 75 6d 69  he index. Assumi
166e0 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ng no error occu
166f0 72 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20 61 64  rs, *pnOut is ad
16700 6a 75 73 74 65 64 20 28 72 65 64 75 63 65 64 29  justed (reduced)
16710 0a 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  .** to account f
16720 6f 72 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e  or the range con
16730 74 72 61 69 6e 74 73 20 70 4c 6f 77 65 72 20 61  traints pLower a
16740 6e 64 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a  nd pUpper..** .*
16750 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65  * In the absence
16760 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 34   of sqlite_stat4
16770 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f   ANALYZE data, o
16780 72 20 69 66 20 73 75 63 68 20 64 61 74 61 20 63  r if such data c
16790 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64  annot be.** used
167a0 2c 20 65 61 63 68 20 72 61 6e 67 65 20 69 6e 65  , each range ine
167b0 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73 20  quality reduces 
167c0 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
167d0 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20   by a factor of 
167e0 34 2e 20 0a 2a 2a 20 48 65 6e 63 65 20 61 20 70  4. .** Hence a p
167f0 61 69 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  air of constrain
16800 74 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29  ts (x>? AND x<?)
16810 20 72 65 64 75 63 65 73 20 74 68 65 20 65 78 70   reduces the exp
16820 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a  ected number of.
16830 2a 2a 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  ** rows visited 
16840 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 31  by a factor of 1
16850 36 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  6..*/.static int
16860 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45   whereRangeScanE
16870 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
16880 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
16890 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
168a0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
168b0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
168c0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
168d0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c  .  WhereTerm *pL
168e0 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72  ower,   /* Lower
168f0 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
16900 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22  nge. ex: "x>123"
16910 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
16920 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
16930 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65  Upper,   /* Uppe
16940 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72  r bound on the r
16950 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35  ange. ex: "x<455
16960 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  " Might be NULL 
16970 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
16980 70 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64  pLoop     /* Mod
16990 69 66 79 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e  ify the .nOut an
169a0 64 20 6d 61 79 62 65 20 2e 72 52 75 6e 20 66 69  d maybe .rRun fi
169b0 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  elds */.){.  int
169c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
169d0 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c  .  int nOut = pL
169e0 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67  oop->nOut;.  Log
169f0 45 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65  Est nNew;..#ifde
16a00 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
16a10 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
16a20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f   Index *p = pLoo
16a30 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
16a40 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
16a50 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
16a60 71 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61  q;..  if( p->nSa
16a70 6d 70 6c 65 3e 30 0a 20 20 20 26 26 20 6e 45 71  mple>0.   && nEq
16a80 3d 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  ==pBuilder->nRec
16a90 56 61 6c 69 64 0a 20 20 20 26 26 20 6e 45 71 3c  Valid.   && nEq<
16aa0 70 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20  p->nSampleCol.  
16ab0 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
16ac0 45 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e  Enabled(pParse->
16ad0 64 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74 33  db, SQLITE_Stat3
16ae0 29 20 0a 20 20 29 7b 0a 20 20 20 20 55 6e 70 61  ) .  ){.    Unpa
16af0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63  ckedRecord *pRec
16b00 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65   = pBuilder->pRe
16b10 63 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 61  c;.    tRowcnt a
16b20 5b 32 5d 3b 0a 20 20 20 20 75 38 20 61 66 66 3b  [2];.    u8 aff;
16b30 0a 0a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c  ..    /* Variabl
16b40 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62 65  e iLower will be
16b50 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69   set to the esti
16b60 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
16b70 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a 20  er of rows in . 
16b80 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20     ** the index 
16b90 74 68 61 74 20 61 72 65 20 6c 65 73 73 20 74 68  that are less th
16ba0 61 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75  an the lower bou
16bb0 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20  nd of the range 
16bc0 71 75 65 72 79 2e 20 54 68 65 0a 20 20 20 20 2a  query. The.    *
16bd0 2a 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62 65  * lower bound be
16be0 69 6e 67 20 74 68 65 20 63 6f 6e 63 61 74 65 6e  ing the concaten
16bf0 61 74 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64 20  ation of $P and 
16c00 24 4c 2c 20 77 68 65 72 65 20 24 50 20 69 73 20  $L, where $P is 
16c10 74 68 65 0a 20 20 20 20 2a 2a 20 6b 65 79 2d 70  the.    ** key-p
16c20 72 65 66 69 78 20 66 6f 72 6d 65 64 20 62 79 20  refix formed by 
16c30 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20 6d  the nEq values m
16c40 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 74  atched against t
16c50 68 65 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73 74  he nEq left-most
16c60 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  .    ** columns 
16c70 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e  of the index, an
16c80 64 20 24 4c 20 69 73 20 74 68 65 20 76 61 6c 75  d $L is the valu
16c90 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a 20 20 20  e in pLower..   
16ca0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 72 2c 20 69   **.    ** Or, i
16cb0 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c  f pLower is NULL
16cc0 20 6f 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65   or $L cannot be
16cd0 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
16ce0 69 74 20 28 62 65 63 61 75 73 65 20 69 74 0a 20  it (because it. 
16cf0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73     ** is not a s
16d00 69 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f  imple variable o
16d10 72 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29  r literal value)
16d20 2c 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e  , the lower boun
16d30 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
16d40 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44 75 65  range is $P. Due
16d50 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e 20 74   to a quirk in t
16d60 68 65 20 77 61 79 20 77 68 65 72 65 4b 65 79 53  he way whereKeyS
16d70 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20 65 76  tats() works, ev
16d80 65 6e 0a 20 20 20 20 2a 2a 20 69 66 20 24 4c 20  en.    ** if $L 
16d90 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 77 68  is available, wh
16da0 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 69 73  ereKeyStats() is
16db0 20 63 61 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68   called for both
16dc0 20 28 24 50 29 20 61 6e 64 20 0a 20 20 20 20 2a   ($P) and .    *
16dd0 2a 20 28 24 50 3a 24 4c 29 20 61 6e 64 20 74 68  * ($P:$L) and th
16de0 65 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20  e larger of the 
16df0 74 77 6f 20 72 65 74 75 72 6e 65 64 20 76 61 6c  two returned val
16e00 75 65 73 20 75 73 65 64 2e 0a 20 20 20 20 2a 2a  ues used..    **
16e10 0a 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c  .    ** Similarl
16e20 79 2c 20 69 55 70 70 65 72 20 69 73 20 74 6f 20  y, iUpper is to 
16e30 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73  be set to the es
16e40 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
16e50 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20  mber of rows.   
16e60 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68   ** less than th
16e70 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66  e upper bound of
16e80 20 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79   the range query
16e90 2e 20 57 68 65 72 65 20 74 68 65 20 75 70 70 65  . Where the uppe
16ea0 72 20 62 6f 75 6e 64 0a 20 20 20 20 2a 2a 20 69  r bound.    ** i
16eb0 73 20 65 69 74 68 65 72 20 28 24 50 29 20 6f 72  s either ($P) or
16ec0 20 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c   ($P:$U). Again,
16ed0 20 65 76 65 6e 20 69 66 20 24 55 20 69 73 20 61   even if $U is a
16ee0 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76  vailable, both v
16ef0 61 6c 75 65 73 0a 20 20 20 20 2a 2a 20 6f 66 20  alues.    ** of 
16f00 69 55 70 70 65 72 20 61 72 65 20 72 65 71 75 65  iUpper are reque
16f10 73 74 65 64 20 6f 66 20 77 68 65 72 65 4b 65 79  sted of whereKey
16f20 53 74 61 74 73 28 29 20 61 6e 64 20 74 68 65 20  Stats() and the 
16f30 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20 20  smaller used..  
16f40 20 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74    */.    tRowcnt
16f50 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 74 52 6f   iLower;.    tRo
16f60 77 63 6e 74 20 69 55 70 70 65 72 3b 0a 0a 20 20  wcnt iUpper;..  
16f70 20 20 69 66 28 20 6e 45 71 3d 3d 70 2d 3e 6e 4b    if( nEq==p->nK
16f80 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 61  eyCol ){.      a
16f90 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
16fa0 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 7d 65 6c  INTEGER;.    }el
16fb0 73 65 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20  se{.      aff = 
16fc0 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  p->pTable->aCol[
16fd0 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d  p->aiColumn[nEq]
16fe0 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  ].affinity;.    
16ff0 7d 0a 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69  }.    /* Determi
17000 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64 20 69 55  ne iLower and iU
17010 70 70 65 72 20 75 73 69 6e 67 20 28 24 50 29 20  pper using ($P) 
17020 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  only. */.    if(
17030 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20 20 20 20   nEq==0 ){.     
17040 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20   iLower = 0;.   
17050 20 20 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 61     iUpper = p->a
17060 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20  iRowEst[0];.    
17070 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
17080 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c 20  Note: this call 
17090 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69 7a  could be optimiz
170a0 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65 20  ed away - since 
170b0 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73 20  the same values 
170c0 6d 75 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 68  must .      ** h
170d0 61 76 65 20 62 65 65 6e 20 72 65 71 75 65 73 74  ave been request
170e0 65 64 20 77 68 65 6e 20 74 65 73 74 69 6e 67 20  ed when testing 
170f0 6b 65 79 20 24 50 20 69 6e 20 77 68 65 72 65 45  key $P in whereE
17100 71 75 61 6c 53 63 61 6e 45 73 74 28 29 2e 20 20  qualScanEst().  
17110 2a 2f 0a 20 20 20 20 20 20 77 68 65 72 65 4b 65  */.      whereKe
17120 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
17130 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20  , pRec, 0, a);. 
17140 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b       iLower = a[
17150 30 5d 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72  0];.      iUpper
17160 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a   = a[0] + a[1];.
17170 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
17180 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f   possible, impro
17190 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72  ve on the iLower
171a0 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20   estimate using 
171b0 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20  ($P:$L). */.    
171c0 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20  if( pLower ){.  
171d0 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20      int bOk;    
171e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171f0 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65  /* True if value
17200 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
17210 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20  om pExpr */.    
17220 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
17230 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70  pLower->pExpr->p
17240 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73  Right;.      ass
17250 65 72 74 28 20 28 70 4c 6f 77 65 72 2d 3e 65 4f  ert( (pLower->eO
17260 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54  perator & (WO_GT
17270 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20  |WO_GE))!=0 );. 
17280 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17290 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
172a0 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26  lue(pParse, p, &
172b0 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66  pRec, pExpr, aff
172c0 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20  , nEq, &bOk);.  
172d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
172e0 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a  TE_OK && bOk ){.
172f0 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
17300 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 77 68  iNew;.        wh
17310 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
17320 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20  se, p, pRec, 0, 
17330 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 77  a);.        iNew
17340 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77   = a[0] + ((pLow
17350 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
17360 57 4f 5f 47 54 29 20 3f 20 61 5b 31 5d 20 3a 20  WO_GT) ? a[1] : 
17370 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
17380 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c  iNew>iLower ) iL
17390 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20  ower = iNew;.   
173a0 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20       nOut--;.   
173b0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
173c0 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  /* If possible, 
173d0 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69  improve on the i
173e0 55 70 70 65 72 20 65 73 74 69 6d 61 74 65 20 75  Upper estimate u
173f0 73 69 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a 2f  sing ($P:$U). */
17400 0a 20 20 20 20 69 66 28 20 70 55 70 70 65 72 20  .    if( pUpper 
17410 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  ){.      int bOk
17420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17430 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
17440 76 61 6c 75 65 20 69 73 20 65 78 74 72 61 63 74  value is extract
17450 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f  ed from pExpr */
17460 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
17470 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78  pr = pUpper->pEx
17480 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
17490 20 20 61 73 73 65 72 74 28 20 28 70 55 70 70 65    assert( (pUppe
174a0 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
174b0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30  WO_LT|WO_LE))!=0
174c0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
174d0 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
174e0 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  SetValue(pParse,
174f0 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72   p, &pRec, pExpr
17500 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f 6b  , aff, nEq, &bOk
17510 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
17520 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f  =SQLITE_OK && bO
17530 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 74 52 6f  k ){.        tRo
17540 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20  wcnt iNew;.     
17550 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73     whereKeyStats
17560 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
17570 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20 20  , 1, a);.       
17580 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28   iNew = a[0] + (
17590 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
175a0 6f 72 20 26 20 57 4f 5f 4c 45 29 20 3f 20 61 5b  or & WO_LE) ? a[
175b0 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20  1] : 0);.       
175c0 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70 65 72   if( iNew<iUpper
175d0 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e 65 77   ) iUpper = iNew
175e0 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d  ;.        nOut--
175f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17600 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70  .    pBuilder->p
17610 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20 20  Rec = pRec;.    
17620 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17630 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
17640 55 70 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b 0a  Upper>iLower ){.
17650 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 73          nNew = s
17660 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 69 55 70  qlite3LogEst(iUp
17670 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20  per - iLower);. 
17680 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17690 20 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20 20      nNew = 10;  
176a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31 30        assert( 10
176b0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
176c0 32 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  2) );.      }.  
176d0 20 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75      if( nNew<nOu
176e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 75  t ){.        nOu
176f0 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20  t = nNew;.      
17700 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e  }.      pLoop->n
17710 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f  Out = (LogEst)nO
17720 75 74 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  ut;.      WHERET
17730 52 41 43 45 28 30 78 31 30 30 2c 20 28 22 72 61  RACE(0x100, ("ra
17740 6e 67 65 20 73 63 61 6e 20 72 65 67 69 6f 6e 73  nge scan regions
17750 3a 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64  : %u..%u  est=%d
17760 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
17770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
17780 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29  32)iLower, (u32)
17790 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a  iUpper, nOut));.
177a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
177b0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
177c0 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  }.#else.  UNUSED
177d0 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 72 73  _PARAMETER(pPars
177e0 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e);.  UNUSED_PAR
177f0 41 4d 45 54 45 52 28 70 42 75 69 6c 64 65 72 29  AMETER(pBuilder)
17800 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
17810 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70  t( pLower || pUp
17820 70 65 72 20 29 3b 0a 20 20 2f 2a 20 54 55 4e 49  per );.  /* TUNI
17830 4e 47 3a 20 20 45 61 63 68 20 69 6e 65 71 75 61  NG:  Each inequa
17840 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
17850 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72  reduces the sear
17860 63 68 20 73 70 61 63 65 20 34 2d 66 6f 6c 64 2e  ch space 4-fold.
17870 0a 20 20 2a 2a 20 41 20 42 45 54 57 45 45 4e 20  .  ** A BETWEEN 
17880 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 72 65 66  operator, theref
17890 6f 72 65 2c 20 72 65 64 75 63 65 73 20 74 68 65  ore, reduces the
178a0 20 73 65 61 72 63 68 20 73 70 61 63 65 20 31 36   search space 16
178b0 2d 66 6f 6c 64 20 2a 2f 0a 20 20 6e 4e 65 77 20  -fold */.  nNew 
178c0 3d 20 6e 4f 75 74 3b 0a 20 20 69 66 28 20 70 4c  = nOut;.  if( pL
178d0 6f 77 65 72 20 26 26 20 28 70 4c 6f 77 65 72 2d  ower && (pLower-
178e0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
178f0 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VNULL)==0 ){.   
17900 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20 20 20 20   nNew -= 20;    
17910 20 20 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d      assert( 20==
17920 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29  sqlite3LogEst(4)
17930 20 29 3b 0a 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a   );.    nOut--;.
17940 20 20 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72    }.  if( pUpper
17950 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20   ){.    nNew -= 
17960 32 30 3b 20 20 20 20 20 20 20 20 61 73 73 65 72  20;        asser
17970 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 20==sqlite3Lo
17980 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20 6e  gEst(4) );.    n
17990 4f 75 74 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28  Out--;.  }.  if(
179a0 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e 65 77 20   nNew<10 ) nNew 
179b0 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 4e 65 77  = 10;.  if( nNew
179c0 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20 3d 20 6e  <nOut ) nOut = n
179d0 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  New;.  pLoop->nO
179e0 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75  ut = (LogEst)nOu
179f0 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
17a00 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
17a10 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
17a20 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT4./*.** Est
17a30 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
17a40 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
17a50 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
17a60 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71  ased on.** an eq
17a70 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
17a80 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68  t x=VALUE and wh
17a90 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f  ere that VALUE o
17aa0 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ccurs in.** the 
17ab0 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20  histogram data. 
17ac0 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73   This only works
17ad0 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c   when x is the l
17ae0 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75  eft-most.** colu
17af0 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61  mn of an index a
17b00 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  nd sqlite_stat3 
17b10 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69  histogram data i
17b20 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66  s available.** f
17b30 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20  or that index.  
17b40 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c  When pExpr==NULL
17b50 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
17b60 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a  constraint is.**
17b70 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73   "x IS NULL" ins
17b80 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45  tead of "x=VALUE
17b90 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  "..**.** Write t
17ba0 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77  he estimated row
17bb0 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52   count into *pnR
17bc0 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ow and return SQ
17bd0 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20  LITE_OK. .** If 
17be0 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61  unable to make a
17bf0 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76  n estimate, leav
17c00 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67  e *pnRow unchang
17c10 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ed and return.**
17c20 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
17c30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
17c40 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20  n fail if it is 
17c50 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61  unable to load a
17c60 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
17c70 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20  nce.** required 
17c80 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  for string compa
17c90 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61  rison, or if una
17ca0 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
17cb0 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20  memory.** for a 
17cc0 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72  UTF conversion r
17cd0 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70  equired for comp
17ce0 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72  arison.  The err
17cf0 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20  or is stored.** 
17d00 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
17d10 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
17d20 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61  ic int whereEqua
17d30 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  lScanEst(.  Pars
17d40 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
17d50 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
17d60 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
17d70 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
17d80 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
17d90 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a 70  ilder,.  Expr *p
17da0 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  Expr,         /*
17db0 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   Expression for 
17dc0 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56  VALUE in the x=V
17dd0 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  ALUE constraint 
17de0 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e  */.  tRowcnt *pn
17df0 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69  Row       /* Wri
17e00 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
17e10 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
17e20 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
17e30 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
17e40 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
17e50 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  ex;.  int nEq = 
17e60 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
17e70 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55  u.btree.nEq;.  U
17e80 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
17e90 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  Rec = pBuilder->
17ea0 70 52 65 63 3b 0a 20 20 75 38 20 61 66 66 3b 20  pRec;.  u8 aff; 
17eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ec0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69    /* Column affi
17ed0 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nity */.  int rc
17ee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17ef0 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69      /* Subfuncti
17f00 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  on return code *
17f10 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d  /.  tRowcnt a[2]
17f20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
17f30 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20   Statistics */. 
17f40 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73   int bOk;..  ass
17f50 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20  ert( nEq>=1 );. 
17f60 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 28 70   assert( nEq<=(p
17f70 2d 3e 6e 4b 65 79 43 6f 6c 2b 31 29 20 29 3b 0a  ->nKeyCol+1) );.
17f80 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
17f90 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  mple!=0 );.  ass
17fa0 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e  ert( p->nSample>
17fb0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
17fc0 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
17fd0 69 64 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20  id<nEq );..  /* 
17fe0 49 66 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f  If values are no
17ff0 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  t available for 
18000 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68  all fields of th
18010 65 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c  e index to the l
18020 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73  eft.  ** of this
18030 20 6f 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74   one, no estimat
18040 65 20 63 61 6e 20 62 65 20 6d 61 64 65 2e 20 52  e can be made. R
18050 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
18060 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20  FOUND. */.  if( 
18070 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
18080 6c 69 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20  lid<(nEq-1) ){. 
18090 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
180a0 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a  _NOTFOUND;.  }..
180b0 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20    /* This is an 
180c0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c  optimization onl
180d0 79 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  y. The call to s
180e0 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
180f0 53 65 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20  SetValue().  ** 
18100 62 65 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74 75  below would retu
18110 72 6e 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  rn the same valu
18120 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71  e.  */.  if( nEq
18130 3e 70 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20  >p->nKeyCol ){. 
18140 20 20 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20     *pnRow = 1;. 
18150 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18160 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 20  _OK;.  }..  aff 
18170 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  = p->pTable->aCo
18180 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45  l[p->aiColumn[nE
18190 71 2d 31 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  q-1]].affinity;.
181a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
181b0 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
181c0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
181d0 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e  c, pExpr, aff, n
181e0 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20 20 70  Eq-1, &bOk);.  p
181f0 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20  Builder->pRec = 
18200 70 52 65 63 3b 0a 20 20 69 66 28 20 72 63 21 3d  pRec;.  if( rc!=
18210 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
18220 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 62 4f 6b  rn rc;.  if( bOk
18230 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
18240 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
18250 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
18260 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20 77 68  lid = nEq;..  wh
18270 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
18280 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20  se, p, pRec, 0, 
18290 61 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  a);.  WHERETRACE
182a0 28 30 78 31 30 30 2c 28 22 65 71 75 61 6c 69 74  (0x100,("equalit
182b0 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20  y scan regions: 
182c0 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61 5b 31 5d  %d\n", (int)a[1]
182d0 29 29 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 61  ));.  *pnRow = a
182e0 5b 31 5d 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e  [1];.  .  return
182f0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
18300 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
18310 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
18320 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
18330 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
18340 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT4./*.** Esti
18350 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
18360 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
18370 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61  l be returned ba
18380 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20  sed on.** an IN 
18390 63 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72 65  constraint where
183a0 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
183b0 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f  side of the IN o
183c0 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20  perator.** is a 
183d0 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e 20  list of values. 
183e0 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   Example:.**.** 
183f0 20 20 20 20 20 20 20 57 48 45 52 45 20 78 20 49         WHERE x I
18400 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a  N (1,2,3,4).**.*
18410 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69  * Write the esti
18420 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20  mated row count 
18430 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20  into *pnRow and 
18440 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18450 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20  . .** If unable 
18460 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d  to make an estim
18470 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f  ate, leave *pnRo
18480 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  w unchanged and 
18490 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
184a0 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ro..**.** This r
184b0 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20  outine can fail 
184c0 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20  if it is unable 
184d0 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74  to load a collat
184e0 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ing sequence.** 
184f0 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72  required for str
18500 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ing comparison, 
18510 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  or if unable to 
18520 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a  allocate memory.
18530 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e  ** for a UTF con
18540 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64  version required
18550 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   for comparison.
18560 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73    The error is s
18570 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  tored.** in the 
18580 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
18590 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
185a0 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 0a  whereInScanEst(.
185b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
185c0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
185d0 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
185e0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
185f0 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
18600 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45  r *pBuilder,.  E
18610 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
18620 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65      /* The value
18630 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48 53   list on the RHS
18640 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76 32   of "x IN (v1,v2
18650 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74  ,v3,...)" */.  t
18660 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20  Rowcnt *pnRow   
18670 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
18680 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74   revised row est
18690 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b  imate here */.){
186a0 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42  .  Index *p = pB
186b0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
186c0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
186d0 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20  int nRecValid = 
186e0 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
186f0 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  lid;.  int rc = 
18700 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
18710 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
18720 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74  turn code */.  t
18730 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20  Rowcnt nEst;    
18740 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18750 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73   of rows for a s
18760 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20  ingle term */.  
18770 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20  tRowcnt nRowEst 
18780 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65  = 0;    /* New e
18790 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
187a0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f  umber of rows */
187b0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
187c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
187d0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
187e0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d   assert( p->aSam
187f0 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ple!=0 );.  for(
18800 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
18810 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e  OK && i<pList->n
18820 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
18830 6e 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45  nEst = p->aiRowE
18840 73 74 5b 30 5d 3b 0a 20 20 20 20 72 63 20 3d 20  st[0];.    rc = 
18850 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
18860 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
18870 65 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  er, pList->a[i].
18880 70 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20  pExpr, &nEst);. 
18890 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45     nRowEst += nE
188a0 73 74 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72  st;.    pBuilder
188b0 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52  ->nRecValid = nR
188c0 65 63 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20  ecValid;.  }..  
188d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
188e0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f  K ){.    if( nRo
188f0 77 45 73 74 20 3e 20 70 2d 3e 61 69 52 6f 77 45  wEst > p->aiRowE
18900 73 74 5b 30 5d 20 29 20 6e 52 6f 77 45 73 74 20  st[0] ) nRowEst 
18910 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  = p->aiRowEst[0]
18920 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e  ;.    *pnRow = n
18930 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48 45 52  RowEst;.    WHER
18940 45 54 52 41 43 45 28 30 78 31 30 30 2c 28 22 49  ETRACE(0x100,("I
18950 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a 20  N row estimate: 
18960 65 73 74 3d 25 67 5c 6e 22 2c 20 6e 52 6f 77 45  est=%g\n", nRowE
18970 73 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  st));.  }.  asse
18980 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  rt( pBuilder->nR
18990 65 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56 61 6c  ecValid==nRecVal
189a0 69 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  id );.  return r
189b0 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
189c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
189d0 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a  T3_OR_STAT4 */..
189e0 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20  /*.** Disable a 
189f0 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
18a00 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70  E clause.  Excep
18a10 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c  t, do not disabl
18a20 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66  e the term.** if
18a30 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c   it controls a L
18a40 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61  EFT OUTER JOIN a
18a50 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72  nd it did not or
18a60 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f  iginate in the O
18a70 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c  N.** or USING cl
18a80 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69  ause of that joi
18a90 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65  n..**.** Conside
18aa0 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d  r the term t2.z=
18ab0 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c  'ok' in the foll
18ac0 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a  owing queries:.*
18ad0 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45  *.**   (1)  SELE
18ae0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
18af0 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
18b00 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e  a=t2.x WHERE t2.
18b10 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20  z='ok'.**   (2) 
18b20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
18b30 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
18b40 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20  N t1.a=t2.x AND 
18b50 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28  t2.z='ok'.**   (
18b60 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  3)  SELECT * FRO
18b70 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20 74  M t1, t2 WHERE t
18b80 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
18b90 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65  z='ok'.**.** The
18ba0 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69   t2.z='ok' is di
18bb0 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e  sabled in the in
18bc0 20 28 32 29 20 62 65 63 61 75 73 65 20 69 74 20   (2) because it 
18bd0 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e  originates.** in
18be0 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20   the ON clause. 
18bf0 20 54 68 65 20 74 65 72 6d 20 69 73 20 64 69 73   The term is dis
18c00 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63  abled in (3) bec
18c10 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  ause it is not p
18c20 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54  art.** of a LEFT
18c30 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e   OUTER JOIN.  In
18c40 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69   (1), the term i
18c50 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a  s not disabled..
18c60 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20  **.** Disabling 
18c70 61 20 74 65 72 6d 20 63 61 75 73 65 73 20 74 68  a term causes th
18c80 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62  at term to not b
18c90 65 20 74 65 73 74 65 64 20 69 6e 20 74 68 65 20  e tested in the 
18ca0 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
18cb0 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61   the join.  Disa
18cc0 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69  bling is an opti
18cd0 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20  mization.  When 
18ce0 74 65 72 6d 73 20 61 72 65 20 73 61 74 69 73 66  terms are satisf
18cf0 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65  ied.** by indice
18d00 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74 68  s, we disable th
18d10 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65  em to prevent re
18d20 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69 6e  dundant tests in
18d30 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f   the inner.** lo
18d40 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65  op.  We would ge
18d50 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65  t the correct re
18d60 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67  sults if nothing
18d70 20 77 65 72 65 20 65 76 65 72 20 64 69 73 61 62   were ever disab
18d80 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e  led,.** but join
18d90 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69  s might run a li
18da0 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54 68  ttle slower.  Th
18db0 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69  e trick is to di
18dc0 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a  sable as much.**
18dd0 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f   as we can witho
18de0 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f  ut disabling too
18df0 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64 69   much.  If we di
18e00 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77  sabled in (1), w
18e10 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20 77  e'd get.** the w
18e20 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53 65  rong answer.  Se
18e30 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a  e ticket #813..*
18e40 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
18e50 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c  sableTerm(WhereL
18e60 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68  evel *pLevel, Wh
18e70 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b  ereTerm *pTerm){
18e80 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20 20 20  .  if( pTerm.   
18e90 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74     && (pTerm->wt
18ea0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
18eb0 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20  ED)==0.      && 
18ec0 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f  (pLevel->iLeftJo
18ed0 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73  in==0 || ExprHas
18ee0 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
18ef0 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
18f00 69 6e 29 29 0a 20 20 20 20 20 20 26 26 20 28 70  in)).      && (p
18f10 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20  Level->notReady 
18f20 26 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  & pTerm->prereqA
18f30 6c 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  ll)==0.  ){.    
18f40 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
18f50 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
18f60 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61    if( pTerm->iPa
18f70 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  rent>=0 ){.     
18f80 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68   WhereTerm *pOth
18f90 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43  er = &pTerm->pWC
18fa0 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65  ->a[pTerm->iPare
18fb0 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nt];.      if( (
18fc0 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64  --pOther->nChild
18fd0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
18fe0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
18ff0 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20 20  el, pOther);.   
19000 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
19010 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
19020 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f  OP_Affinity opco
19030 64 65 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20  de to apply the 
19040 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  column affinity 
19050 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20 74  string zAff.** t
19060 6f 20 74 68 65 20 6e 20 72 65 67 69 73 74 65 72  o the n register
19070 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 61  s starting at ba
19080 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e  se. .**.** As an
19090 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 53   optimization, S
190a0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65  QLITE_AFF_NONE e
190b0 6e 74 72 69 65 73 20 28 77 68 69 63 68 20 61 72  ntries (which ar
190c0 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68 65  e no-ops) at the
190d0 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e  .** beginning an
190e0 64 20 65 6e 64 20 6f 66 20 7a 41 66 66 20 61 72  d end of zAff ar
190f0 65 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 61  e ignored.  If a
19100 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 7a 41  ll entries in zA
19110 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54 45  ff are.** SQLITE
19120 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20  _AFF_NONE, then 
19130 6e 6f 20 63 6f 64 65 20 67 65 74 73 20 67 65 6e  no code gets gen
19140 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  erated..**.** Th
19150 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73  is routine makes
19160 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66   its own copy of
19170 20 7a 41 66 66 20 73 6f 20 74 68 61 74 20 74 68   zAff so that th
19180 65 20 63 61 6c 6c 65 72 20 69 73 20 66 72 65 65  e caller is free
19190 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a 41  .** to modify zA
191a0 66 66 20 61 66 74 65 72 20 74 68 69 73 20 72 6f  ff after this ro
191b0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a  utine returns..*
191c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
191d0 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
191e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
191f0 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20  nt base, int n, 
19200 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20 56  char *zAff){.  V
19210 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
19220 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 7a 41  >pVdbe;.  if( zA
19230 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ff==0 ){.    ass
19240 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
19250 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
19260 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
19270 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
19280 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74 20  );..  /* Adjust 
19290 62 61 73 65 20 61 6e 64 20 6e 20 74 6f 20 73 6b  base and n to sk
192a0 69 70 20 6f 76 65 72 20 53 51 4c 49 54 45 5f 41  ip over SQLITE_A
192b0 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20  FF_NONE entries 
192c0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
192d0 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f 66  .  ** and end of
192e0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
192f0 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  ring..  */.  whi
19300 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41 66 66 5b  le( n>0 && zAff[
19310 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  0]==SQLITE_AFF_N
19320 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a  ONE ){.    n--;.
19330 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20 20      base++;.    
19340 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68  zAff++;.  }.  wh
19350 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 41 66 66  ile( n>1 && zAff
19360 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41 46  [n-1]==SQLITE_AF
19370 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d  F_NONE ){.    n-
19380 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64  -;.  }..  /* Cod
19390 65 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74  e the OP_Affinit
193a0 79 20 6f 70 63 6f 64 65 20 69 66 20 74 68 65 72  y opcode if ther
193b0 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6c 65  e is anything le
193c0 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69  ft to do. */.  i
193d0 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71  f( n>0 ){.    sq
193e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
193f0 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20  v, OP_Affinity, 
19400 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71  base, n);.    sq
19410 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
19420 34 28 76 2c 20 2d 31 2c 20 7a 41 66 66 2c 20 6e  4(v, -1, zAff, n
19430 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
19440 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
19450 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62 61  hange(pParse, ba
19460 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  se, n);.  }.}...
19470 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
19480 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ode for a single
19490 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f   equality term o
194a0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
194b0 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79  se.  An equality
194c0 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20  .** term can be 
194d0 65 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72  either X=expr or
194e0 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70   X IN (...).   p
194f0 54 65 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d  Term is the term
19500 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64   to be .** coded
19510 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72  ..**.** The curr
19520 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ent value for th
19530 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  e constraint is 
19540 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72  left in register
19550 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   iReg..**.** For
19560 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66   a constraint of
19570 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72   the form X=expr
19580 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  , the expression
19590 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e   is evaluated an
195a0 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20  d its.** result 
195b0 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73  is left on the s
195c0 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74  tack.  For const
195d0 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  raints of the fo
195e0 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a  rm X IN (...).**
195f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   this routine se
19600 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61  ts up a loop tha
19610 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f  t will iterate o
19620 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ver all values o
19630 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  f X..*/.static i
19640 6e 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54  nt codeEqualityT
19650 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
19660 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  arse,      /* Th
19670 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
19680 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  t */.  WhereTerm
19690 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68   *pTerm,   /* Th
196a0 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
196b0 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
196c0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72   coded */.  Wher
196d0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
196e0 2f 2a 20 54 68 65 20 6c 65 76 65 6c 20 6f 66 20  /* The level of 
196f0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
19700 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
19710 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 45 71 2c 20  n */.  int iEq, 
19720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
19730 64 65 78 20 6f 66 20 74 68 65 20 65 71 75 61 6c  dex of the equal
19740 69 74 79 20 74 65 72 6d 20 77 69 74 68 69 6e 20  ity term within 
19750 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  this level */.  
19760 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20  int bRev,       
19770 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
19780 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20 49 4e  reverse-order IN
19790 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20   operations */. 
197a0 20 69 6e 74 20 69 54 61 72 67 65 74 20 20 20 20   int iTarget    
197b0 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20       /* Attempt 
197c0 74 6f 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73  to leave results
197d0 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
197e0 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  r */.){.  Expr *
197f0 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
19800 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  r;.  Vdbe *v = p
19810 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
19820 69 6e 74 20 69 52 65 67 3b 20 20 20 20 20 20 20  int iReg;       
19830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
19840 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
19850 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73  esults */..  ass
19860 65 72 74 28 20 69 54 61 72 67 65 74 3e 30 20 29  ert( iTarget>0 )
19870 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d  ;.  if( pX->op==
19880 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69 52 65  TK_EQ ){.    iRe
19890 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
198a0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
198b0 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69 54  , pX->pRight, iT
198c0 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20  arget);.  }else 
198d0 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  if( pX->op==TK_I
198e0 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65  SNULL ){.    iRe
198f0 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20  g = iTarget;.   
19900 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19910 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
19920 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65 66  , iReg);.#ifndef
19930 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
19940 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20  QUERY.  }else{. 
19950 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20     int eType;.  
19960 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20    int iTab;.    
19970 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70  struct InLoop *p
19980 49 6e 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f  In;.    WhereLoo
19990 70 20 2a 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  p *pLoop = pLeve
199a0 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20  l->pWLoop;..    
199b0 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
199c0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
199d0 55 41 4c 54 41 42 4c 45 29 3d 3d 30 0a 20 20 20  UALTABLE)==0.   
199e0 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62     && pLoop->u.b
199f0 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 0a 20  tree.pIndex!=0. 
19a00 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75       && pLoop->u
19a10 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 61  .btree.pIndex->a
19a20 53 6f 72 74 4f 72 64 65 72 5b 69 45 71 5d 0a 20  SortOrder[iEq]. 
19a30 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74     ){.      test
19a40 63 61 73 65 28 20 69 45 71 3d 3d 30 20 29 3b 0a  case( iEq==0 );.
19a50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19a60 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52  bRev );.      bR
19a70 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20  ev = !bRev;.    
19a80 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58  }.    assert( pX
19a90 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
19aa0 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65     iReg = iTarge
19ab0 74 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 73  t;.    eType = s
19ac0 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
19ad0 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20 30 29  x(pParse, pX, 0)
19ae0 3b 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  ;.    if( eType=
19af0 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
19b00 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 74 65  DESC ){.      te
19b10 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a  stcase( bRev );.
19b20 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62 52        bRev = !bR
19b30 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 54  ev;.    }.    iT
19b40 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b  ab = pX->iTable;
19b50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19b60 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f  AddOp2(v, bRev ?
19b70 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65   OP_Last : OP_Re
19b80 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a  wind, iTab, 0);.
19b90 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f      assert( (pLo
19ba0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
19bb0 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30  ERE_MULTI_OR)==0
19bc0 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77   );.    pLoop->w
19bd0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
19be0 49 4e 5f 41 42 4c 45 3b 0a 20 20 20 20 69 66 28  IN_ABLE;.    if(
19bf0 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
19c00 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  n==0 ){.      pL
19c10 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20  evel->addrNxt = 
19c20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
19c30 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20  abel(v);.    }. 
19c40 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
19c50 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65  nIn++;.    pLeve
19c60 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20  l->u.in.aInLoop 
19c70 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  =.       sqlite3
19c80 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
19c90 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76  pParse->db, pLev
19ca0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
19cb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cd0 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75  sizeof(pLevel->u
19ce0 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a  .in.aInLoop[0])*
19cf0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
19d00 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65  );.    pIn = pLe
19d10 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
19d20 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29  p;.    if( pIn )
19d30 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70  {.      pIn += p
19d40 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20  Level->u.in.nIn 
19d50 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e  - 1;.      pIn->
19d60 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20  iCur = iTab;.   
19d70 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e     if( eType==IN
19d80 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a  _INDEX_ROWID ){.
19d90 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64          pIn->add
19da0 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  rInTop = sqlite3
19db0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19dc0 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 52  _Rowid, iTab, iR
19dd0 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
19de0 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61  {.        pIn->a
19df0 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74  ddrInTop = sqlit
19e00 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
19e10 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  OP_Column, iTab,
19e20 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20   0, iReg);.     
19e30 20 7d 0a 20 20 20 20 20 20 70 49 6e 2d 3e 65 45   }.      pIn->eE
19e40 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62 52 65 76 20  ndLoopOp = bRev 
19e50 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e  ? OP_Prev : OP_N
19e60 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
19e70 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
19e80 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29  OP_IsNull, iReg)
19e90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19ea0 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
19eb0 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  nIn = 0;.    }.#
19ec0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61  endif.  }.  disa
19ed0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
19ee0 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e  pTerm);.  return
19ef0 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iReg;.}../*.** 
19f00 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
19f10 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
19f20 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63   all == and IN c
19f30 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61  onstraints for a
19f40 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  n.** index..**.*
19f50 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63  * For example, c
19f60 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74 31  onsider table t1
19f70 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69  (a,b,c,d,e,f) wi
19f80 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c  th index i1(a,b,
19f90 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  c)..** Suppose t
19fa0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
19fb0 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41  is this:  a==5 A
19fc0 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20  ND b IN (1,2,3) 
19fd0 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30  AND c>5 AND c<10
19fe0 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61  .** The index ha
19ff0 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72  s as many as thr
1a000 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  ee equality cons
1a010 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20  traints, but in 
1a020 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c  this.** example,
1a030 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20 76   the third "c" v
1a040 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75  alue is an inequ
1a050 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20  ality.  So only 
1a060 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  two .** constrai
1a070 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20  nts are coded.  
1a080 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
1a090 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  l generate code 
1a0a0 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61  to evaluate.** a
1a0b0 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c  ==5 and b IN (1,
1a0c0 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72 65  2,3).  The curre
1a0d0 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20  nt values for a 
1a0e0 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74  and b will be st
1a0f0 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65  ored.** in conse
1a100 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73  cutive registers
1a110 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f   and the index o
1a120 66 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  f the first regi
1a130 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  ster is returned
1a140 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65  ..**.** In the e
1a150 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71  xample above nEq
1a160 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20 73  ==2.  But this s
1a170 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  ubroutine works 
1a180 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a  for any value.**
1a190 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e   of nEq includin
1a1a0 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c  g 0.  If nEq==0,
1a1b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1a1c0 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e   nearly a no-op.
1a1d0 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  .** The only thi
1a1e0 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c  ng it does is al
1a1f0 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76 65  locate the pLeve
1a200 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63  l->iMem memory c
1a210 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75  ell and.** compu
1a220 74 65 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  te the affinity 
1a230 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  string..**.** Th
1a240 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79  is routine alway
1a250 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c  s allocates at l
1a260 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20  east one memory 
1a270 63 65 6c 6c 20 61 6e 64 20 72 65 74 75 72 6e 73  cell and returns
1a280 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66  .** the index of
1a290 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c   that memory cel
1a2a0 6c 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  l. The code that
1a2b0 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72  .** calls this r
1a2c0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20  outine will use 
1a2d0 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  that memory cell
1a2e0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 74 65   to store the te
1a2f0 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79  rmination.** key
1a300 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f   value of the lo
1a310 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d  op.  If one or m
1a320 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  ore IN operators
1a330 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a   appear, then.**
1a340 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   this routine al
1a350 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69 74  locates an addit
1a360 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79  ional nEq memory
1a370 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72   cells for inter
1a380 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a  nal.** use..**.*
1a390 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * Before returni
1a3a0 6e 67 2c 20 2a 70 7a 41 66 66 20 69 73 20 73 65  ng, *pzAff is se
1a3b0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
1a3c0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
1a3d0 67 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74  g a.** copy of t
1a3e0 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  he column affini
1a3f0 74 79 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65  ty string of the
1a400 20 69 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65 64   index allocated
1a410 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
1a420 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63  3DbMalloc(). Exc
1a430 65 70 74 2c 20 65 6e 74 72 69 65 73 20 69 6e 20  ept, entries in 
1a440 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20  the copy of the 
1a450 73 74 72 69 6e 67 20 61 73 73 6f 63 69 61 74 65  string associate
1a460 64 0a 2a 2a 20 77 69 74 68 20 65 71 75 61 6c 69  d.** with equali
1a470 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ty constraints t
1a480 68 61 74 20 75 73 65 20 4e 4f 4e 45 20 61 66 66  hat use NONE aff
1a490 69 6e 69 74 79 20 61 72 65 20 73 65 74 20 74 6f  inity are set to
1a4a0 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  .** SQLITE_AFF_N
1a4b0 4f 4e 45 2e 20 54 68 69 73 20 69 73 20 74 6f 20  ONE. This is to 
1a4c0 64 65 61 6c 20 77 69 74 68 20 53 51 4c 20 73 75  deal with SQL su
1a4d0 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ch as the follow
1a4e0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45  ing:.**.**   CRE
1a4f0 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 54  ATE TABLE t1(a T
1a500 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  EXT PRIMARY KEY,
1a510 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54   b);.**   SELECT
1a520 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53 20   ... FROM t1 AS 
1a530 74 32 2c 20 74 31 20 57 48 45 52 45 20 74 31 2e  t2, t1 WHERE t1.
1a540 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20  a = t2.b;.**.** 
1a550 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61  In the example a
1a560 62 6f 76 65 2c 20 74 68 65 20 69 6e 64 65 78 20  bove, the index 
1a570 6f 6e 20 74 31 28 61 29 20 68 61 73 20 54 45 58  on t1(a) has TEX
1a580 54 20 61 66 66 69 6e 69 74 79 2e 20 42 75 74 20  T affinity. But 
1a590 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69 67  since.** the rig
1a5a0 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht hand side of 
1a5b0 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  the equality con
1a5c0 73 74 72 61 69 6e 74 20 28 74 32 2e 62 29 20 68  straint (t2.b) h
1a5d0 61 73 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79  as NONE affinity
1a5e0 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69  ,.** no conversi
1a5f0 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 61 74 74  on should be att
1a600 65 6d 70 74 65 64 20 62 65 66 6f 72 65 20 75 73  empted before us
1a610 69 6e 67 20 61 20 74 32 2e 62 20 76 61 6c 75 65  ing a t2.b value
1a620 20 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61   as part of.** a
1a630 20 6b 65 79 20 74 6f 20 73 65 61 72 63 68 20 74   key to search t
1a640 68 65 20 69 6e 64 65 78 2e 20 48 65 6e 63 65 20  he index. Hence 
1a650 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 69  the first byte i
1a660 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61  n the returned a
1a670 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e  ffinity.** strin
1a680 67 20 69 6e 20 74 68 69 73 20 65 78 61 6d 70 6c  g in this exampl
1a690 65 20 77 6f 75 6c 64 20 62 65 20 73 65 74 20 74  e would be set t
1a6a0 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  o SQLITE_AFF_NON
1a6b0 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
1a6c0 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79   codeAllEquality
1a6d0 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a  Terms(.  Parse *
1a6e0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
1a6f0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1a700 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  t */.  WhereLeve
1a710 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20  l *pLevel,   /* 
1a720 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f  Which nested loo
1a730 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65  p of the FROM we
1a740 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20   are coding */. 
1a750 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20   int bRev,      
1a760 20 20 20 20 20 20 20 2f 2a 20 52 65 76 65 72 73         /* Revers
1a770 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49  e the order of I
1a780 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  N operators */. 
1a790 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 2c 20   int nExtraReg, 
1a7a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1a7b0 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74   of extra regist
1a7c0 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ers to allocate 
1a7d0 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41 66  */.  char **pzAf
1a7e0 66 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  f          /* OU
1a7f0 54 3a 20 53 65 74 20 74 6f 20 70 6f 69 6e 74 20  T: Set to point 
1a800 74 6f 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  to affinity stri
1a810 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ng */.){.  int n
1a820 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
1a830 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1a840 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20  number of == or 
1a850 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  IN constraints t
1a860 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62 65  o code */.  Vdbe
1a870 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1a880 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  dbe;      /* The
1a890 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72   vm under constr
1a8a0 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65  uction */.  Inde
1a8b0 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
1a8c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a8d0 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65   index being use
1a8e0 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20  d for this loop 
1a8f0 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
1a900 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
1a910 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63     /* A single c
1a920 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a  onstraint term *
1a930 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
1a940 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
1a950 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
1a960 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  op object */.  i
1a970 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
1a980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a990 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1a9a0 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20    int regBase;  
1a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9c0 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72  /* Base register
1a9d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20   */.  int nReg; 
1a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1aa00 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   registers to al
1aa10 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72  locate */.  char
1aa20 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20 20 20   *zAff;         
1aa30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
1aa40 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f 20  inity string to 
1aa50 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  return */..  /* 
1aa60 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 6f  This module is o
1aa70 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71 75  nly called on qu
1aa80 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20 75  ery plans that u
1aa90 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a  se an index. */.
1aaa0 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
1aab0 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61 73 73 65  ->pWLoop;.  asse
1aac0 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
1aad0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
1aae0 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a  UALTABLE)==0 );.
1aaf0 20 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75    nEq = pLoop->u
1ab00 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 70 49  .btree.nEq;.  pI
1ab10 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  dx = pLoop->u.bt
1ab20 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 61 73  ree.pIndex;.  as
1ab30 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b  sert( pIdx!=0 );
1ab40 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1ab50 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72  t how many memor
1ab60 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20  y cells we will 
1ab70 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61  need then alloca
1ab80 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20  te them..  */.  
1ab90 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73 65  regBase = pParse
1aba0 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52  ->nMem + 1;.  nR
1abb0 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  eg = pLoop->u.bt
1abc0 72 65 65 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61  ree.nEq + nExtra
1abd0 52 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  Reg;.  pParse->n
1abe0 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20  Mem += nReg;..  
1abf0 7a 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62  zAff = sqlite3Db
1ac00 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  StrDup(pParse->d
1ac10 62 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41  b, sqlite3IndexA
1ac20 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49  ffinityStr(v, pI
1ac30 64 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41 66  dx));.  if( !zAf
1ac40 66 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  f ){.    pParse-
1ac50 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1ac60 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  d = 1;.  }..  /*
1ac70 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 71   Evaluate the eq
1ac80 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1ac90 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ts.  */.  assert
1aca0 28 20 7a 41 66 66 3d 3d 30 20 7c 7c 20 28 69 6e  ( zAff==0 || (in
1acb0 74 29 73 74 72 6c 65 6e 28 7a 41 66 66 29 3e 3d  t)strlen(zAff)>=
1acc0 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30  nEq );.  for(j=0
1acd0 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20  ; j<nEq; j++){. 
1ace0 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 70     int r1;.    p
1acf0 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  Term = pLoop->aL
1ad00 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61 73 73  Term[j];.    ass
1ad10 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
1ad20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
1ad30 6f 77 69 6e 67 20 74 72 75 65 20 66 6f 72 20 69  owing true for i
1ad40 6e 64 69 63 65 73 20 77 69 74 68 20 72 65 64 75  ndices with redu
1ad50 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a  ndant columns. .
1ad60 20 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54      ** Ex: CREAT
1ad70 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
1ad80 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20  (a,b,a); SELECT 
1ad90 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
1ada0 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a  a=0 AND b=0; */.
1adb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
1adc0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1add0 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29  TERM_CODED)!=0 )
1ade0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1adf0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1ae00 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1ae10 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71  .    r1 = codeEq
1ae20 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
1ae30 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
1ae40 2c 20 6a 2c 20 62 52 65 76 2c 20 72 65 67 42 61  , j, bRev, regBa
1ae50 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72  se+j);.    if( r
1ae60 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a  1!=regBase+j ){.
1ae70 20 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d        if( nReg==
1ae80 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
1ae90 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1aea0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  eg(pParse, regBa
1aeb0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67  se);.        reg
1aec0 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20  Base = r1;.     
1aed0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1aee0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1aef0 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
1af00 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  1, regBase+j);. 
1af10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1af20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
1af30 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1af40 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
1af50 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
1af60 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
1af70 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  N );.    if( (pT
1af80 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1af90 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49   (WO_ISNULL|WO_I
1afa0 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  N))==0 ){.      
1afb0 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
1afc0 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
1afd0 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
1afe0 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c  e3ExprCodeIsNull
1aff0 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20  Jump(v, pRight, 
1b000 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65  regBase+j, pLeve
1b010 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  l->addrBrk);.   
1b020 20 20 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20     if( zAff ){. 
1b030 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1b040 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
1b050 79 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a  y(pRight, zAff[j
1b060 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ])==SQLITE_AFF_N
1b070 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
1b080 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54   zAff[j] = SQLIT
1b090 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
1b0a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1b0b0 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
1b0c0 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
1b0d0 67 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b  ge(pRight, zAff[
1b0e0 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  j]) ){.         
1b0f0 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54   zAff[j] = SQLIT
1b100 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
1b110 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1b120 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66    }.  }.  *pzAff
1b130 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72   = zAff;.  retur
1b140 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69  n regBase;.}..#i
1b150 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b160 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
1b170 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1b180 61 20 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70  a helper for exp
1b190 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29  lainIndexRange()
1b1a0 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74   below.**.** pSt
1b1b0 72 20 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74  r holds the text
1b1c0 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
1b1d0 6e 20 74 68 61 74 20 77 65 20 61 72 65 20 62 75  n that we are bu
1b1e0 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65  ilding up one te
1b1f0 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e  rm.** at a time.
1b200 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
1b210 64 64 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74  dds a new term t
1b220 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1b230 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
1b240 54 65 72 6d 73 20 61 72 65 20 73 65 70 61 72 61  Terms are separa
1b250 74 65 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64  ted by AND so ad
1b260 64 20 74 68 65 20 22 41 4e 44 22 20 74 65 78 74  d the "AND" text
1b270 20 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20   for second and 
1b280 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65  subsequent.** te
1b290 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61  rms only..*/.sta
1b2a0 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
1b2b0 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74  AppendTerm(.  St
1b2c0 72 41 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20  rAccum *pStr,   
1b2d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b2e0 20 74 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e   text expression
1b2f0 20 62 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a   being built */.
1b300 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20    int iTerm,    
1b310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b320 20 49 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74   Index of this t
1b330 65 72 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a  erm.  First is z
1b340 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ero */.  const c
1b350 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20  har *zColumn,   
1b360 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1b370 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  the column */.  
1b380 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20  const char *zOp 
1b390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b3a0 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  ame of the opera
1b3b0 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  tor */.){.  if( 
1b3c0 69 54 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53  iTerm ) sqlite3S
1b3d0 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
1b3e0 74 72 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b  tr, " AND ", 5);
1b3f0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
1b400 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a  umAppend(pStr, z
1b410 43 6f 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20 73  Column, -1);.  s
1b420 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
1b430 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20  pend(pStr, zOp, 
1b440 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  1);.  sqlite3Str
1b450 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
1b460 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  , "?", 1);.}../*
1b470 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65  .** Argument pLe
1b480 76 65 6c 20 64 65 73 63 72 69 62 65 73 20 61 20  vel describes a 
1b490 73 74 72 61 74 65 67 79 20 66 6f 72 20 73 63 61  strategy for sca
1b4a0 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62  nning table pTab
1b4b0 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
1b4c0 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
1b4d0 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
1b4e0 67 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  g buffer contain
1b4f0 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69 6f  ing a descriptio
1b500 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 73  n.** of the subs
1b510 65 74 20 6f 66 20 74 61 62 6c 65 20 72 6f 77 73  et of table rows
1b520 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68 65 20   scanned by the 
1b530 73 74 72 61 74 65 67 79 20 69 6e 20 74 68 65 20  strategy in the 
1b540 66 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51  form of an.** SQ
1b550 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72  L expression. Or
1b560 2c 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72  , if all rows ar
1b570 65 20 73 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20  e scanned, NULL 
1b580 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
1b590 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1b5a0 69 66 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a  if the query:.**
1b5b0 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
1b5c0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31  ROM t1 WHERE a=1
1b5d0 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20   AND b>2;.**.** 
1b5e0 69 73 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65  is run and there
1b5f0 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20   is an index on 
1b600 28 61 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69  (a, b), then thi
1b610 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1b620 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73  ns a.** string s
1b630 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a  imilar to:.**.**
1b640 20 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22     "a=? AND b>?"
1b650 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
1b660 6e 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  ned pointer poin
1b670 74 73 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74  ts to memory obt
1b680 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
1b690 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  e3DbMalloc()..**
1b6a0 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
1b6b0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
1b6c0 20 63 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20   caller to free 
1b6d0 74 68 65 20 62 75 66 66 65 72 20 77 68 65 6e 20  the buffer when 
1b6e0 69 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67  it is.** no long
1b6f0 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  er required..*/.
1b700 73 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70  static char *exp
1b710 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 73  lainIndexRange(s
1b720 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
1b730 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 54 61  eLoop *pLoop, Ta
1b740 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e  ble *pTab){.  In
1b750 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 4c  dex *pIndex = pL
1b760 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
1b770 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  dex;.  int nEq =
1b780 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1b790 6e 45 71 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  nEq;.  int i, j;
1b7a0 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20  .  Column *aCol 
1b7b0 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  = pTab->aCol;.  
1b7c0 69 31 36 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20  i16 *aiColumn = 
1b7d0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1b7e0 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 74 78 74  ;.  StrAccum txt
1b7f0 3b 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20  ;..  if( nEq==0 
1b800 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
1b810 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f  gs & (WHERE_BTM_
1b820 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
1b830 4c 49 4d 49 54 29 29 3d 3d 30 20 29 7b 0a 20 20  LIMIT))==0 ){.  
1b840 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1b850 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
1b860 6d 49 6e 69 74 28 26 74 78 74 2c 20 30 2c 20 30  mInit(&txt, 0, 0
1b870 2c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  , SQLITE_MAX_LEN
1b880 47 54 48 29 3b 0a 20 20 74 78 74 2e 64 62 20 3d  GTH);.  txt.db =
1b890 20 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 53 74   db;.  sqlite3St
1b8a0 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78  rAccumAppend(&tx
1b8b0 74 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20 20 66  t, " (", 2);.  f
1b8c0 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69  or(i=0; i<nEq; i
1b8d0 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
1b8e0 20 3d 20 28 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e   = (i==pIndex->n
1b8f0 4b 65 79 43 6f 6c 20 29 20 3f 20 22 72 6f 77 69  KeyCol ) ? "rowi
1b900 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75  d" : aCol[aiColu
1b910 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  mn[i]].zName;.  
1b920 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54    explainAppendT
1b930 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20  erm(&txt, i, z, 
1b940 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a 20 3d  "=");.  }..  j =
1b950 20 69 3b 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d   i;.  if( pLoop-
1b960 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 42  >wsFlags&WHERE_B
1b970 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
1b980 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49  char *z = (j==pI
1b990 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20  ndex->nKeyCol ) 
1b9a0 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c  ? "rowid" : aCol
1b9b0 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  [aiColumn[j]].zN
1b9c0 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e  ame;.    explain
1b9d0 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c  AppendTerm(&txt,
1b9e0 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a 20   i++, z, ">");. 
1b9f0 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e   }.  if( pLoop->
1ba00 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 54 4f  wsFlags&WHERE_TO
1ba10 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 63  P_LIMIT ){.    c
1ba20 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e  har *z = (j==pIn
1ba30 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 3f  dex->nKeyCol ) ?
1ba40 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b   "rowid" : aCol[
1ba50 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61  aiColumn[j]].zNa
1ba60 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41  me;.    explainA
1ba70 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20  ppendTerm(&txt, 
1ba80 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a  i, z, "<");.  }.
1ba90 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
1baa0 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 29  mAppend(&txt, ")
1bab0 22 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  ", 1);.  return 
1bac0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
1bad0 69 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d 0a 0a  inish(&txt);.}..
1bae0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1baf0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75  ion is a no-op u
1bb00 6e 6c 65 73 73 20 63 75 72 72 65 6e 74 6c 79 20  nless currently 
1bb10 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20 45 58  processing an EX
1bb20 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
1bb30 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49 66 20  .** command. If 
1bb40 74 68 65 20 71 75 65 72 79 20 62 65 69 6e 67 20  the query being 
1bb50 63 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e 20 45  compiled is an E
1bb60 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
1bb70 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72  N, a single.** r
1bb80 65 63 6f 72 64 20 69 73 20 61 64 64 65 64 20 74  ecord is added t
1bb90 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74 6f 20  o the output to 
1bba0 64 65 73 63 72 69 62 65 20 74 68 65 20 74 61 62  describe the tab
1bbb0 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65 67 79  le scan strategy
1bbc0 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e 0a   in .** pLevel..
1bbd0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
1bbe0 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20  xplainOneScan(. 
1bbf0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc10 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
1bc20 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
1bc30 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
1bc40 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1bc50 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20 72  list this loop r
1bc60 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68  efers to */.  Wh
1bc70 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
1bc80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1bc90 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20 4f   Scan to write O
1bca0 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65  P_Explain opcode
1bcb0 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c   for */.  int iL
1bcc0 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
1bcd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1bce0 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 63  ue for "level" c
1bcf0 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20  olumn of output 
1bd00 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
1bd30 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20  r "from" column 
1bd40 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75  of output */.  u
1bd50 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20  16 wctrlFlags   
1bd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bd70 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
1bd80 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
1bd90 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69 66  gin() */.){.  if
1bda0 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
1bdb0 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 73 74 72 75  n==2 ){.    stru
1bdc0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1bdd0 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
1bde0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
1bdf0 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a  rom];.    Vdbe *
1be00 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1be10 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65  e;      /* VM be
1be20 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
1be30 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  */.    sqlite3 *
1be40 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1be50 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1be60 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 63   handle */.    c
1be70 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20 20  har *zMsg;      
1be80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1be90 54 65 78 74 20 74 6f 20 61 64 64 20 74 6f 20 45  Text to add to E
1bea0 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20  QP output */.   
1beb0 20 69 6e 74 20 69 49 64 20 3d 20 70 50 61 72 73   int iId = pPars
1bec0 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20 20 2f  e->iSelectId;  /
1bed0 2a 20 53 65 6c 65 63 74 20 69 64 20 28 6c 65 66  * Select id (lef
1bee0 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20 63 6f  t-most output co
1bef0 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  lumn) */.    int
1bf00 20 69 73 53 65 61 72 63 68 3b 20 20 20 20 20 20   isSearch;      
1bf10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1bf20 75 65 20 66 6f 72 20 61 20 53 45 41 52 43 48 2e  ue for a SEARCH.
1bf30 20 46 61 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e   False for SCAN.
1bf40 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f   */.    WhereLoo
1bf50 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
1bf60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
1bf70 74 72 6f 6c 6c 69 6e 67 20 57 68 65 72 65 4c 6f  trolling WhereLo
1bf80 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  op object */.   
1bf90 20 75 33 32 20 66 6c 61 67 73 3b 20 20 20 20 20   u32 flags;     
1bfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bfb0 2a 20 46 6c 61 67 73 20 74 68 61 74 20 64 65 73  * Flags that des
1bfc0 63 72 69 62 65 20 74 68 69 73 20 6c 6f 6f 70 20  cribe this loop 
1bfd0 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  */..    pLoop = 
1bfe0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
1bff0 20 20 20 20 66 6c 61 67 73 20 3d 20 70 4c 6f 6f      flags = pLoo
1c000 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  p->wsFlags;.    
1c010 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45  if( (flags&WHERE
1c020 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77  _MULTI_OR) || (w
1c030 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
1c040 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 29  ONETABLE_ONLY) )
1c050 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 73   return;..    is
1c060 53 65 61 72 63 68 20 3d 20 28 66 6c 61 67 73 26  Search = (flags&
1c070 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  (WHERE_BTM_LIMIT
1c080 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
1c090 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ))!=0.          
1c0a0 20 20 7c 7c 20 28 28 66 6c 61 67 73 26 57 48 45    || ((flags&WHE
1c0b0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
1c0c0 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 75  ==0 && (pLoop->u
1c0d0 2e 62 74 72 65 65 2e 6e 45 71 3e 30 29 29 0a 20  .btree.nEq>0)). 
1c0e0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 77             || (w
1c0f0 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45  ctrlFlags&(WHERE
1c100 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45  _ORDERBY_MIN|WHE
1c110 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 29  RE_ORDERBY_MAX))
1c120 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  ;..    zMsg = sq
1c130 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1c140 20 22 25 73 22 2c 20 69 73 53 65 61 72 63 68 3f   "%s", isSearch?
1c150 22 53 45 41 52 43 48 22 3a 22 53 43 41 4e 22 29  "SEARCH":"SCAN")
1c160 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ;.    if( pItem-
1c170 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
1c180 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1c190 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1c1a0 67 2c 20 22 25 73 20 53 55 42 51 55 45 52 59 20  g, "%s SUBQUERY 
1c1b0 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74 65 6d 2d  %d", zMsg,pItem-
1c1c0 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  >iSelectId);.   
1c1d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4d   }else{.      zM
1c1e0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1c1f0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1c200 25 73 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 4d  %s TABLE %s", zM
1c210 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  sg, pItem->zName
1c220 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
1c230 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
1c240 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
1c250 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1c260 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41 53  db, zMsg, "%s AS
1c270 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65   %s", zMsg, pIte
1c280 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
1c290 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  }.    if( (flags
1c2a0 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48   & (WHERE_IPK|WH
1c2b0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
1c2c0 29 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 41 4c  ))==0.     && AL
1c2d0 57 41 59 53 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74  WAYS(pLoop->u.bt
1c2e0 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 29 0a 20  ree.pIndex!=0). 
1c2f0 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72     ){.      char
1c300 20 2a 7a 57 68 65 72 65 20 3d 20 65 78 70 6c 61   *zWhere = expla
1c310 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 64 62 2c  inIndexRange(db,
1c320 20 70 4c 6f 6f 70 2c 20 70 49 74 65 6d 2d 3e 70   pLoop, pItem->p
1c330 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d 73 67  Tab);.      zMsg
1c340 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1c350 64 66 28 64 62 2c 20 7a 4d 73 67 2c 0a 20 20 20  df(db, zMsg,.   
1c360 20 20 20 20 20 20 20 20 20 20 20 20 28 28 66 6c              ((fl
1c370 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
1c380 5f 49 4e 44 45 58 29 20 3f 20 0a 20 20 20 20 20  _INDEX) ? .     
1c390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25                "%
1c3a0 73 20 55 53 49 4e 47 20 41 55 54 4f 4d 41 54 49  s USING AUTOMATI
1c3b0 43 20 25 73 49 4e 44 45 58 25 2e 30 73 25 73 22  C %sINDEX%.0s%s"
1c3c0 20 3a 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 25 73 49 4e 44 45 58 20 25 73 25 73 22 29 2c 20  %sINDEX %s%s"), 
1c3f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c400 7a 4d 73 67 2c 20 28 28 66 6c 61 67 73 20 26 20  zMsg, ((flags & 
1c410 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20  WHERE_IDX_ONLY) 
1c420 3f 20 22 43 4f 56 45 52 49 4e 47 20 22 20 3a 20  ? "COVERING " : 
1c430 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ""),.           
1c440 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
1c450 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ee.pIndex->zName
1c460 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 20  , zWhere);.     
1c470 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1c480 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20  b, zWhere);.    
1c490 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73  }else if( (flags
1c4a0 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30   & WHERE_IPK)!=0
1c4b0 20 26 26 20 28 66 6c 61 67 73 20 26 20 57 48 45   && (flags & WHE
1c4c0 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d  RE_CONSTRAINT)!=
1c4d0 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20  0 ){.      zMsg 
1c4e0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1c4f0 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
1c500 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52  USING INTEGER PR
1c510 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67  IMARY KEY", zMsg
1c520 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 66 6c  );..      if( fl
1c530 61 67 73 26 28 57 48 45 52 45 5f 43 4f 4c 55 4d  ags&(WHERE_COLUM
1c540 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  N_EQ|WHERE_COLUM
1c550 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20 20 20  N_IN) ){.       
1c560 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1c570 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1c580 2c 20 22 25 73 20 28 72 6f 77 69 64 3d 3f 29 22  , "%s (rowid=?)"
1c590 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
1c5a0 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 26  else if( (flags&
1c5b0 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54  WHERE_BOTH_LIMIT
1c5c0 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49  )==WHERE_BOTH_LI
1c5d0 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  MIT ){.        z
1c5e0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1c5f0 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1c600 22 25 73 20 28 72 6f 77 69 64 3e 3f 20 41 4e 44  "%s (rowid>? AND
1c610 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67   rowid<?)", zMsg
1c620 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1c630 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42  f( flags&WHERE_B
1c640 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
1c650 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1c660 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1c670 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e  Msg, "%s (rowid>
1c680 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  ?)", zMsg);.    
1c690 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
1c6a0 59 53 28 66 6c 61 67 73 26 57 48 45 52 45 5f 54  YS(flags&WHERE_T
1c6b0 4f 50 5f 4c 49 4d 49 54 29 20 29 7b 0a 20 20 20  OP_LIMIT) ){.   
1c6c0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1c6d0 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1c6e0 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64  zMsg, "%s (rowid
1c6f0 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  <?)", zMsg);.   
1c700 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
1c710 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1c720 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
1c730 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20  else if( (flags 
1c740 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
1c750 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
1c760 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1c770 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1c780 67 2c 20 22 25 73 20 56 49 52 54 55 41 4c 20 54  g, "%s VIRTUAL T
1c790 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73  ABLE INDEX %d:%s
1c7a0 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20  ", zMsg,.       
1c7b0 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
1c7c0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c  ->u.vtab.idxNum,
1c7d0 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69   pLoop->u.vtab.i
1c7e0 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65  dxStr);.    }.#e
1c7f0 6e 64 69 66 0a 20 20 20 20 7a 4d 73 67 20 3d 20  ndif.    zMsg = 
1c800 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1c810 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 22 2c 20  db, zMsg, "%s", 
1c820 7a 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  zMsg);.    sqlit
1c830 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1c840 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64 2c  OP_Explain, iId,
1c850 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c 20   iLevel, iFrom, 
1c860 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
1c870 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
1c880 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 4f   define explainO
1c890 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c 79  neScan(u,v,w,x,y
1c8a0 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ,z).#endif /* SQ
1c8b0 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
1c8c0 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  N */.../*.** Gen
1c8d0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
1c8e0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1c8f0 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69  iLevel-th loop i
1c900 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
1c910 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  se.** implementa
1c920 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62  tion described b
1c930 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61  y pWInfo..*/.sta
1c940 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65  tic Bitmask code
1c950 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20  OneLoopStart(.  
1c960 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1c970 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65  o,   /* Complete
1c980 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
1c990 75 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ut the WHERE cla
1c9a0 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  use */.  int iLe
1c9b0 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  vel,          /*
1c9c0 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20   Which level of 
1c9d0 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75  pWInfo->a[] shou
1c9e0 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  ld be coded */. 
1c9f0 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
1ca00 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74  y     /* Which t
1ca10 61 62 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e  ables are curren
1ca20 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  tly available */
1ca30 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20  .){.  int j, k; 
1ca40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1ca50 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
1ca60 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
1ca70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
1ca80 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
1ca90 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
1caa0 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20  addrNxt;        
1cab0 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d   /* Where to jum
1cac0 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  p to continue wi
1cad0 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63  th the next IN c
1cae0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69  ase */.  int omi
1caf0 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a  tTable;       /*
1cb00 20 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20   True if we use 
1cb10 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a  the index only *
1cb20 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20  /.  int bRev;   
1cb30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1cb40 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73   if we need to s
1cb50 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  can in reverse o
1cb60 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c  rder */.  WhereL
1cb70 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f  evel *pLevel;  /
1cb80 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65 76 65  * The where leve
1cb90 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  l to be coded */
1cba0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
1cbb0 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 57  oop;    /* The W
1cbc0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
1cbd0 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
1cbe0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
1cbf0 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f  C;    /* Decompo
1cc00 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e  sition of the en
1cc10 74 69 72 65 20 57 48 45 52 45 20 63 6c 61 75 73  tire WHERE claus
1cc20 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
1cc30 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
1cc40 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52         /* A WHER
1cc50 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f  E clause term */
1cc60 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1cc70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cc80 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1cc90 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
1cca0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
1ccb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1ccc0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1ccd0 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  n */.  Vdbe *v; 
1cce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccf0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
1cd00 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65  epared stmt unde
1cd10 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20  r constructions 
1cd20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
1cd30 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
1cd40 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61  em;  /* FROM cla
1cd50 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63  use term being c
1cd60 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  oded */.  int ad
1cd70 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20  drBrk;          
1cd80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
1cd90 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
1cda0 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
1cdb0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
1cdc0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1cdd0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
1cde0 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  e to continue wi
1cdf0 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f  th next cycle */
1ce00 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65 67  .  int iRowidReg
1ce10 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
1ce20 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64 20  Rowid is stored 
1ce30 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
1ce40 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f  , if not zero */
1ce50 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65 52  .  int iReleaseR
1ce60 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  eg = 0;      /* 
1ce70 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f  Temp register to
1ce80 20 66 72 65 65 20 62 65 66 6f 72 65 20 72 65 74   free before ret
1ce90 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61  urning */..  pPa
1cea0 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
1ceb0 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72  arse;.  v = pPar
1cec0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43  se->pVdbe;.  pWC
1ced0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b   = &pWInfo->sWC;
1cee0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
1cef0 64 62 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26  db;.  pLevel = &
1cf00 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c  pWInfo->a[iLevel
1cf10 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  ];.  pLoop = pLe
1cf20 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70  vel->pWLoop;.  p
1cf30 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66  TabItem = &pWInf
1cf40 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
1cf50 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
1cf60 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
1cf70 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 4c 65  ->iCursor;.  pLe
1cf80 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 3d 20  vel->notReady = 
1cf90 6e 6f 74 52 65 61 64 79 20 26 20 7e 67 65 74 4d  notReady & ~getM
1cfa0 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
1cfb0 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20  skSet, iCur);.  
1cfc0 62 52 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e  bRev = (pWInfo->
1cfd0 72 65 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29  revMask>>iLevel)
1cfe0 26 31 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20  &1;.  omitTable 
1cff0 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  = (pLoop->wsFlag
1d000 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
1d010 4c 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  LY)!=0 .        
1d020 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
1d030 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1d040 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d  E_FORCE_TABLE)==
1d050 30 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  0;.  VdbeNoopCom
1d060 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20  ment((v, "Begin 
1d070 4a 6f 69 6e 20 4c 6f 6f 70 20 25 64 22 2c 20 69  Join Loop %d", i
1d080 4c 65 76 65 6c 29 29 3b 0a 0a 20 20 2f 2a 20 43  Level));..  /* C
1d090 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72  reate labels for
1d0a0 20 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64   the "break" and
1d0b0 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74   "continue" inst
1d0c0 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f  ructions.  ** fo
1d0d0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  r the current lo
1d0e0 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64 64  op.  Jump to add
1d0f0 72 42 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75  rBrk to break ou
1d100 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a  t of a loop..  *
1d110 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74  * Jump to cont t
1d120 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79  o go immediately
1d130 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65   to the next ite
1d140 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  ration of the.  
1d150 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20  ** loop..  **.  
1d160 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69 73  ** When there is
1d170 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c   an IN operator,
1d180 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61 20   we also have a 
1d190 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 20  "addrNxt" label 
1d1a0 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20  that.  ** means 
1d1b0 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
1d1c0 20 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61 6c   the next IN val
1d1d0 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20  ue combination. 
1d1e0 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65   When.  ** there
1d1f0 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61   are no IN opera
1d200 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e 73  tors in the cons
1d210 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22 61 64  traints, the "ad
1d220 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a  drNxt" label.  *
1d230 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  * is the same as
1d240 20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f   "addrBrk"..  */
1d250 0a 20 20 61 64 64 72 42 72 6b 20 3d 20 70 4c 65  .  addrBrk = pLe
1d260 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70  vel->addrBrk = p
1d270 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d  Level->addrNxt =
1d280 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1d290 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64 72  Label(v);.  addr
1d2a0 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  Cont = pLevel->a
1d2b0 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65  ddrCont = sqlite
1d2c0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1d2d0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1d2e0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61   is the right ta
1d2f0 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  ble of a LEFT OU
1d300 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61  TER JOIN, alloca
1d310 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74  te and.  ** init
1d320 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20  ialize a memory 
1d330 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64  cell that record
1d340 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20  s if this table 
1d350 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a  matches any.  **
1d360 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74   row of the left
1d370 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
1d380 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  in..  */.  if( p
1d390 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26  Level->iFrom>0 &
1d3a0 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a  & (pTabItem[0].j
1d3b0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
1d3c0 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65  T)!=0 ){.    pLe
1d3d0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d  vel->iLeftJoin =
1d3e0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1d3f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d400 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1d410 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  eger, 0, pLevel-
1d420 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
1d430 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1d440 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e   "init LEFT JOIN
1d450 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22 29   no-match flag")
1d460 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65  );.  }..  /* Spe
1d470 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 46  cial case of a F
1d480 52 4f 4d 20 63 6c 61 75 73 65 20 73 75 62 71 75  ROM clause subqu
1d490 65 72 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  ery implemented 
1d4a0 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  as a co-routine 
1d4b0 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 49 74 65  */.  if( pTabIte
1d4c0 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  m->viaCoroutine 
1d4d0 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59 69  ){.    int regYi
1d4e0 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  eld = pTabItem->
1d4f0 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 73  regReturn;.    s
1d500 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d510 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1d520 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46 69  pTabItem->addrFi
1d530 6c 6c 53 75 62 2d 31 2c 20 72 65 67 59 69 65 6c  llSub-1, regYiel
1d540 64 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  d);.    pLevel->
1d550 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64 62  p2 =  sqlite3Vdb
1d560 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
1d570 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a  eld, regYield);.
1d580 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1d590 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66  (v, "next row of
1d5a0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 25 73 22 2c   co-routine %s",
1d5b0 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d   pTabItem->pTab-
1d5c0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73 71  >zName));.    sq
1d5d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d5e0 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 59 69 65  v, OP_If, regYie
1d5f0 6c 64 2b 31 2c 20 61 64 64 72 42 72 6b 29 3b 0a  ld+1, addrBrk);.
1d600 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1d610 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73   OP_Goto;.  }els
1d620 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e..#ifndef SQLIT
1d630 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1d640 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 6f 6f  BLE.  if(  (pLoo
1d650 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1d660 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
1d670 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  !=0 ){.    /* Ca
1d680 73 65 20 31 3a 20 20 54 68 65 20 74 61 62 6c 65  se 1:  The table
1d690 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61   is a virtual-ta
1d6a0 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56 46  ble.  Use the VF
1d6b0 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a  ilter and VNext.
1d6c0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1d6d0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
1d6e0 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ta..    */.    i
1d6f0 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33  nt iReg;   /* P3
1d700 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46   Value for OP_VF
1d710 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ilter */.    int
1d720 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20   addrNotFound;. 
1d730 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69     int nConstrai
1d740 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  nt = pLoop->nLTe
1d750 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  rm;..    sqlite3
1d760 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
1d770 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67 20  arse);.    iReg 
1d780 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1d790 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
1d7a0 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20  onstraint+2);.  
1d7b0 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d    addrNotFound =
1d7c0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
1d7d0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
1d7e0 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b  <nConstraint; j+
1d7f0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54  +){.      int iT
1d800 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a 2b 32  arget = iReg+j+2
1d810 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
1d820 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
1d830 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
1d840 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  m==0 ) continue;
1d850 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
1d860 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1d870 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  _IN ){.        c
1d880 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
1d890 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
1d8a0 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20  Level, j, bRev, 
1d8b0 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20  iTarget);.      
1d8c0 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d    addrNotFound =
1d8d0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
1d8e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1d8f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1d900 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1d910 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
1d920 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  ght, iTarget);. 
1d930 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1d940 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d950 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1d960 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  , pLoop->u.vtab.
1d970 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20  idxNum, iReg);. 
1d980 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d990 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1d9a0 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c  er, nConstraint,
1d9b0 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71   iReg+1);.    sq
1d9c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1d9d0 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69  v, OP_VFilter, i
1d9e0 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e  Cur, addrNotFoun
1d9f0 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20 20 20  d, iReg,.       
1da00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1da10 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
1da20 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Str,.           
1da30 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
1da40 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
1da50 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a  e ? P4_MPRINTF :
1da60 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
1da70 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e   pLoop->u.vtab.n
1da80 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  eedFree = 0;.   
1da90 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e   for(j=0; j<nCon
1daa0 73 74 72 61 69 6e 74 20 26 26 20 6a 3c 31 36 3b  straint && j<16;
1dab0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
1dac0 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e   (pLoop->u.vtab.
1dad0 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26 31 20 29  omitMask>>j)&1 )
1dae0 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c  {.        disabl
1daf0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4c  eTerm(pLevel, pL
1db00 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 29 3b  oop->aLTerm[j]);
1db10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1db20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1db30 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c  OP_VNext;.    pL
1db40 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
1db50 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1db60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1db70 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
1db80 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1db90 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1dba0 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69   iReg, nConstrai
1dbb0 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  nt+2);.    sqlit
1dbc0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
1dbd0 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65 6c  Parse, 1);.  }el
1dbe0 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
1dbf0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1dc00 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20  TABLE */..  if( 
1dc10 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1dc20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a  & WHERE_IPK)!=0.
1dc30 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
1dc40 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43  Flags & (WHERE_C
1dc50 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43  OLUMN_IN|WHERE_C
1dc60 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20 20  OLUMN_EQ))!=0.  
1dc70 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32  ){.    /* Case 2
1dc80 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74  :  We can direct
1dc90 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73  ly reference a s
1dca0 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20  ingle row using 
1dcb0 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  an.    **       
1dcc0 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70     equality comp
1dcd0 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
1dce0 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20  he ROWID field. 
1dcf0 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   Or.    **      
1dd00 20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63 65      we reference
1dd10 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75   multiple rows u
1dd20 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e  sing a "rowid IN
1dd30 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20   (...)".    **  
1dd40 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63          construc
1dd50 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
1dd60 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62  sert( pLoop->u.b
1dd70 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20  tree.nEq==1 );. 
1dd80 20 20 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d     iReleaseReg =
1dd90 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1dda0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
1ddb0 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61  pTerm = pLoop->a
1ddc0 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73  LTerm[0];.    as
1ddd0 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
1dde0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
1ddf0 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b  erm->pExpr!=0 );
1de00 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69  .    assert( omi
1de10 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  tTable==0 );.   
1de20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
1de30 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1de40 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
1de50 69 52 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65  iRowidReg = code
1de60 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
1de70 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
1de80 65 6c 2c 20 30 2c 20 62 52 65 76 2c 20 69 52 65  el, 0, bRev, iRe
1de90 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20 61  leaseReg);.    a
1dea0 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d  ddrNxt = pLevel-
1deb0 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71  >addrNxt;.    sq
1dec0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ded0 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
1dee0 20 69 52 6f 77 69 64 52 65 67 2c 20 61 64 64 72   iRowidReg, addr
1def0 4e 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Nxt);.    sqlite
1df00 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1df10 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75  P_NotExists, iCu
1df20 72 2c 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77  r, addrNxt, iRow
1df30 69 64 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69  idReg);.    sqli
1df40 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
1df50 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
1df60 65 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 31 29  e, iRowidReg, 1)
1df70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1df80 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
1df90 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
1dfa0 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64  owidReg);.    Vd
1dfb0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70  beComment((v, "p
1dfc0 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  k"));.    pLevel
1dfd0 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
1dfe0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 6f    }else if( (pLo
1dff0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1e000 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 20  ERE_IPK)!=0.    
1e010 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e       && (pLoop->
1e020 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1e030 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29 21 3d 30  COLUMN_RANGE)!=0
1e040 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  .  ){.    /* Cas
1e050 65 20 33 3a 20 20 57 65 20 68 61 76 65 20 61 6e  e 3:  We have an
1e060 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70   inequality comp
1e070 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
1e080 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a  he ROWID field..
1e090 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74      */.    int t
1e0a0 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  estOp = OP_Noop;
1e0b0 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a  .    int start;.
1e0c0 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61      int memEndVa
1e0d0 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65  lue = 0;.    Whe
1e0e0 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20  reTerm *pStart, 
1e0f0 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65  *pEnd;..    asse
1e100 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
1e110 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20   );.    j = 0;. 
1e120 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64     pStart = pEnd
1e130 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c   = 0;.    if( pL
1e140 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1e150 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
1e160 20 70 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d   pStart = pLoop-
1e170 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
1e180 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
1e190 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
1e1a0 5f 4c 49 4d 49 54 20 29 20 70 45 6e 64 20 3d 20  _LIMIT ) pEnd = 
1e1b0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b  pLoop->aLTerm[j+
1e1c0 2b 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +];.    assert( 
1e1d0 70 53 74 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e  pStart!=0 || pEn
1e1e0 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  d!=0 );.    if( 
1e1f0 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54  bRev ){.      pT
1e200 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20  erm = pStart;.  
1e210 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e      pStart = pEn
1e220 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  d;.      pEnd = 
1e230 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  pTerm;.    }.   
1e240 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
1e250 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
1e260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e270 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
1e280 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 74  t defines the st
1e290 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  art bound */.   
1e2a0 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70     int r1, rTemp
1e2b0 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  ;        /* Regi
1e2c0 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e  sters for holdin
1e2d0 67 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e  g the start boun
1e2e0 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  dary */..      /
1e2f0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1e300 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b  constant maps TK
1e310 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63  _xx codes into c
1e320 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20  orresponding .  
1e330 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f      ** seek opco
1e340 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73  des.  It depends
1e350 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
1e360 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f   ordering of TK_
1e370 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  xx.      */.    
1e380 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65    const u8 aMove
1e390 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  Op[] = {.       
1e3a0 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20      /* TK_GT */ 
1e3b0 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20   OP_SeekGt,.    
1e3c0 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20         /* TK_LE 
1e3d0 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20  */  OP_SeekLe,. 
1e3e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
1e3f0 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74  LT */  OP_SeekLt
1e400 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
1e410 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_GE */  OP_See
1e420 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  kGe.      };.   
1e430 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
1e440 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20  ==TK_GT+1 );    
1e450 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
1e460 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f  he ordering.. */
1e470 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1e480 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
1e490 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66        /*  ... of
1e4a0 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65   the TK_xx value
1e4b0 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  s... */.      as
1e4c0 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f  sert( TK_GE==TK_
1e4d0 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+3 );      /* 
1e4e0 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74   ... is correcct
1e4f0 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65  . */..      asse
1e500 72 74 28 20 28 70 53 74 61 72 74 2d 3e 77 74 46  rt( (pStart->wtF
1e510 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
1e520 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  L)==0 );.      t
1e530 65 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d  estcase( pStart-
1e540 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1e550 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
1e560 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45   pX = pStart->pE
1e570 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
1e580 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20  t( pX!=0 );.    
1e590 20 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61    testcase( pSta
1e5a0 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rt->leftCursor!=
1e5b0 69 43 75 72 20 29 3b 20 2f 2a 20 74 72 61 6e 73  iCur ); /* trans
1e5c0 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74  itive constraint
1e5d0 73 20 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20  s */.      r1 = 
1e5e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1e5f0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  emp(pParse, pX->
1e600 70 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b  pRight, &rTemp);
1e610 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e620 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76  beAddOp3(v, aMov
1e630 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54  eOp[pX->op-TK_GT
1e640 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  ], iCur, addrBrk
1e650 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
1e660 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b  eComment((v, "pk
1e670 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
1e680 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
1e690 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
1e6a0 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
1e6b0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1e6c0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 54  mpReg(pParse, rT
1e6d0 65 6d 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61  emp);.      disa
1e6e0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1e6f0 70 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c  pStart);.    }el
1e700 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1e710 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62  3VdbeAddOp2(v, b
1e720 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
1e730 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c  OP_Rewind, iCur,
1e740 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d   addrBrk);.    }
1e750 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b  .    if( pEnd ){
1e760 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
1e770 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64  .      pX = pEnd
1e780 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
1e790 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a  ssert( pX!=0 );.
1e7a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1e7b0 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
1e7c0 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b  ERM_VNULL)==0 );
1e7d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e7e0 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f   pEnd->leftCurso
1e7f0 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54 72  r!=iCur ); /* Tr
1e800 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61  ansitive constra
1e810 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65  ints */.      te
1e820 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74  stcase( pEnd->wt
1e830 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1e840 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65  TUAL );.      me
1e850 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50  mEndValue = ++pP
1e860 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1e870 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1e880 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  e(pParse, pX->pR
1e890 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75  ight, memEndValu
1e8a0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  e);.      if( pX
1e8b0 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70  ->op==TK_LT || p
1e8c0 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a  X->op==TK_GT ){.
1e8d0 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
1e8e0 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20   bRev ? OP_Le : 
1e8f0 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c  OP_Ge;.      }el
1e900 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
1e910 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c  Op = bRev ? OP_L
1e920 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20  t : OP_Gt;.     
1e930 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65   }.      disable
1e940 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e  Term(pLevel, pEn
1e950 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  d);.    }.    st
1e960 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
1e970 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1e980 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1e990 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
1e9a0 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
1e9b0 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
1e9c0 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
1e9d0 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61  2 = start;.    a
1e9e0 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70  ssert( pLevel->p
1e9f0 35 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  5==0 );.    if( 
1ea00 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  testOp!=OP_Noop 
1ea10 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52  ){.      iRowidR
1ea20 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67  eg = iReleaseReg
1ea30 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1ea40 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
1ea50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ea60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
1ea70 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52  d, iCur, iRowidR
1ea80 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
1ea90 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
1eaa0 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d  (pParse, iCur, -
1eab0 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  1, iRowidReg);. 
1eac0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ead0 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70  AddOp3(v, testOp
1eae0 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61  , memEndValue, a
1eaf0 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65  ddrBrk, iRowidRe
1eb00 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1eb10 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1eb20 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
1eb30 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d  RIC | SQLITE_JUM
1eb40 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a  PIFNULL);.    }.
1eb50 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f    }else if( pLoo
1eb60 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1eb70 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20  RE_INDEXED ){.  
1eb80 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 41 20 73    /* Case 4: A s
1eb90 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64  can using an ind
1eba0 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ex..    **.    *
1ebb0 2a 20 20 20 20 20 20 20 20 20 54 68 65 20 57 48  *         The WH
1ebc0 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63  ERE clause may c
1ebd0 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d  ontain zero or m
1ebe0 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20  ore equality .  
1ebf0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72    **         ter
1ec00 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22  ms ("==" or "IN"
1ec10 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68 61 74   operators) that
1ec20 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a   refer to the N.
1ec30 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c      **         l
1ec40 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73  eft-most columns
1ec50 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49   of the index. I
1ec60 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61  t may also conta
1ec70 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  in.    **       
1ec80 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e    inequality con
1ec90 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20  straints (>, <, 
1eca0 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65  >= or <=) on the
1ecb0 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a 20   indexed.    ** 
1ecc0 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74          column t
1ecd0 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  hat immediately 
1ece0 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65 71  follows the N eq
1ecf0 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a  ualities. Only .
1ed00 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
1ed10 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f  he right-most co
1ed20 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69  lumn can be an i
1ed30 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20  nequality - the 
1ed40 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a  rest must.    **
1ed50 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68 65           use the
1ed60 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f   "==" and "IN" o
1ed70 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78  perators. For ex
1ed80 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20  ample, if the . 
1ed90 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e     **         in
1eda0 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a  dex is on (x,y,z
1edb0 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c  ), then the foll
1edc0 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20 61 72  owing clauses ar
1edd0 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20  e all .    **   
1ede0 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a        optimized:
1edf0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1ee00 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a 20 20            x=5.  
1ee10 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1ee20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20 20 20  x=5 AND y=10.   
1ee30 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
1ee40 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20  =5 AND y<10.    
1ee50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
1ee60 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c  5 AND y>5 AND y<
1ee70 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
1ee80 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35       x=5 AND y=5
1ee90 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a   AND z<=10.    *
1eea0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1eeb0 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f   The z<10 term o
1eec0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1eed0 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20  cannot be used, 
1eee0 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 20  only.    **     
1eef0 20 20 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d      the x=5 term
1ef00 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1ef10 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1ef20 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20  ND z<10.    **. 
1ef30 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20     **         N 
1ef40 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74  may be zero if t
1ef50 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c  here are inequal
1ef60 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ity constraints.
1ef70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ef80 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
1ef90 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1efa0 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69  raints, then N i
1efb0 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  s at.    **     
1efc0 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20      least one.. 
1efd0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1efe0 20 20 20 20 20 54 68 69 73 20 63 61 73 65 20 69       This case i
1eff0 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e  s also used when
1f000 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48   there are no WH
1f010 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 2a  ERE clause.    *
1f020 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72  *         constr
1f030 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64  aints but an ind
1f040 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20 61  ex is selected a
1f050 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a  nyway, in order.
1f060 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
1f070 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70  o force the outp
1f080 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66  ut order to conf
1f090 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20  orm to an ORDER 
1f0a0 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20  BY..    */  .   
1f0b0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
1f0c0 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a   aStartOp[] = {.
1f0d0 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30        0,.      0
1f0e0 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e  ,.      OP_Rewin
1f0f0 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
1f100 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74  2: (!start_const
1f110 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45  raints && startE
1f120 71 20 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a  q &&  !bRev) */.
1f130 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20        OP_Last,  
1f140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a             /* 3:
1f150 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61   (!start_constra
1f160 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20  ints && startEq 
1f170 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20  &&   bRev) */.  
1f180 20 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20      OP_SeekGt,  
1f190 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28           /* 4: (
1f1a0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1f1b0 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26  s  && !startEq &
1f1c0 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  & !bRev) */.    
1f1d0 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20    OP_SeekLt,    
1f1e0 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74         /* 5: (st
1f1f0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1f200 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20   && !startEq && 
1f210 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20   bRev) */.      
1f220 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20 20 20 20  OP_SeekGe,      
1f230 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72       /* 6: (star
1f240 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
1f250 26 20 20 73 74 61 72 74 45 71 20 26 26 20 21 62  &  startEq && !b
1f260 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
1f270 5f 53 65 65 6b 4c 65 20 20 20 20 20 20 20 20 20  _SeekLe         
1f280 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f     /* 7: (start_
1f290 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
1f2a0 20 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65   startEq &&  bRe
1f2b0 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20  v) */.    };.   
1f2c0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
1f2d0 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20   aEndOp[] = {.  
1f2e0 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20      OP_Noop,    
1f2f0 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 28           /* 0: (
1f300 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  !end_constraints
1f310 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64  ) */.      OP_Id
1f320 78 47 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  xGE,            
1f330 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 1: (end_const
1f340 72 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 29  raints && !bRev)
1f350 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78   */.      OP_Idx
1f360 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  LT             /
1f370 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72  * 2: (end_constr
1f380 61 69 6e 74 73 20 26 26 20 62 52 65 76 29 20 2a  aints && bRev) *
1f390 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  /.    };.    int
1f3a0 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e   nEq = pLoop->u.
1f3b0 62 74 72 65 65 2e 6e 45 71 3b 20 20 2f 2a 20 4e  btree.nEq;  /* N
1f3c0 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
1f3d0 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69  N terms */.    i
1f3e0 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20  nt isMinQuery = 
1f3f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
1f400 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f   If this is an o
1f410 70 74 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20  ptimized SELECT 
1f420 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20  min(x).. */.    
1f430 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
1f440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f450 42 61 73 65 20 72 65 67 69 73 74 65 72 20 68 6f  Base register ho
1f460 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74  lding constraint
1f470 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69   values */.    i
1f480 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20 20 20  nt r1;          
1f490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f4a0 65 6d 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  emp register */.
1f4b0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1f4c0 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20  RangeStart = 0; 
1f4d0 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63   /* Inequality c
1f4e0 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e  onstraint at ran
1f4f0 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20  ge start */.    
1f500 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67  WhereTerm *pRang
1f510 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20  eEnd = 0;    /* 
1f520 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  Inequality const
1f530 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65  raint at range e
1f540 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74  nd */.    int st
1f550 61 72 74 45 71 3b 20 20 20 20 20 20 20 20 20 20  artEq;          
1f560 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1f570 66 20 72 61 6e 67 65 20 73 74 61 72 74 20 75 73  f range start us
1f580 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20  es ==, >= or <= 
1f590 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71  */.    int endEq
1f5a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f5b0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
1f5c0 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d  ange end uses ==
1f5d0 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20  , >= or <= */.  
1f5e0 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73    int start_cons
1f5f0 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f  traints;       /
1f600 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65  * Start of range
1f610 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20   is constrained 
1f620 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73  */.    int nCons
1f630 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20  traint;         
1f640 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f650 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
1f660 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  s */.    Index *
1f670 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
1f680 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
1f690 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  ex we will be us
1f6a0 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ing */.    int i
1f6b0 49 64 78 43 75 72 3b 20 20 20 20 20 20 20 20 20  IdxCur;         
1f6c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
1f6d0 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
1f6e0 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  he index */.    
1f6f0 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20  int nExtraReg = 
1f700 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1f710 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
1f720 72 65 67 69 73 74 65 72 73 20 6e 65 65 64 65 64  registers needed
1f730 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20   */.    int op; 
1f740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f750 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74       /* Instruct
1f760 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
1f770 20 20 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66    char *zStartAf
1f780 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
1f790 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73  * Affinity for s
1f7a0 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f  tart of range co
1f7b0 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
1f7c0 63 68 61 72 20 2a 7a 45 6e 64 41 66 66 3b 20 20  char *zEndAff;  
1f7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f7e0 41 66 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64  Affinity for end
1f7f0 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72   of range constr
1f800 61 69 6e 74 20 2a 2f 0a 0a 20 20 20 20 70 49 64  aint */..    pId
1f810 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
1f820 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  ee.pIndex;.    i
1f830 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  IdxCur = pLevel-
1f840 3e 69 49 64 78 43 75 72 3b 0a 0a 20 20 20 20 2f  >iIdxCur;..    /
1f850 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73  * If this loop s
1f860 61 74 69 73 66 69 65 73 20 61 20 73 6f 72 74 20  atisfies a sort 
1f870 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42 79 29  order (pOrderBy)
1f880 20 72 65 71 75 65 73 74 20 74 68 61 74 20 0a 20   request that . 
1f890 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64     ** was passed
1f8a0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1f8b0 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  n to implement a
1f8c0 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20   "SELECT min(x) 
1f8d0 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65  ..." .    ** que
1f8e0 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ry, then the cal
1f8f0 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c  ler will only al
1f900 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20  low the loop to 
1f910 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61  run for.    ** a
1f920 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f   single iteratio
1f930 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  n. This means th
1f940 61 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  at the first row
1f950 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a   returned.    **
1f960 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65   should not have
1f970 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74   a NULL value st
1f980 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20  ored in 'x'. If 
1f990 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20  column 'x' is.  
1f9a0 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f    ** the first o
1f9b0 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e 45 71  ne after the nEq
1f9c0 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
1f9d0 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64  aints in the ind
1f9e0 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ex,.    ** this 
1f9f0 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70  requires some sp
1fa00 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a  ecial handling..
1fa10 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1fa20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
1fa30 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59  gs&WHERE_ORDERBY
1fa40 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20 26 26  _MIN)!=0.     &&
1fa50 20 28 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74   (pWInfo->bOBSat
1fa60 21 3d 30 29 0a 20 20 20 20 20 26 26 20 28 70 49  !=0).     && (pI
1fa70 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 71 29  dx->nKeyCol>nEq)
1fa80 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
1fa90 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
1faa0 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 20 2a  y->nExpr==1 ); *
1fab0 2f 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  /.      /* asser
1fac0 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30  t( pOrderBy->a[0
1fad0 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
1fae0 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
1faf0 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20 20 20 20  [nEq] ); */.    
1fb00 20 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31    isMinQuery = 1
1fb10 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
1fb20 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  g = 1;.    }..  
1fb30 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e    /* Find any in
1fb40 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1fb50 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68  int terms for th
1fb60 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  e start and end 
1fb70 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72  .    ** of the r
1fb80 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ange. .    */.  
1fb90 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69    j = nEq;.    i
1fba0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1fbb0 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
1fbc0 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61  MIT ){.      pRa
1fbd0 6e 67 65 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70  ngeStart = pLoop
1fbe0 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20  ->aLTerm[j++];. 
1fbf0 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d       nExtraReg =
1fc00 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
1fc10 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1fc20 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
1fc30 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e  IT ){.      pRan
1fc40 67 65 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61  geEnd = pLoop->a
1fc50 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20  LTerm[j++];.    
1fc60 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b    nExtraReg = 1;
1fc70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
1fc80 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1fc90 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e  evaluate all con
1fca0 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73  straint terms us
1fcb0 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20  ing == or IN.   
1fcc0 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68   ** and store th
1fcd0 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73  e values of thos
1fce0 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72  e terms in an ar
1fcf0 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
1fd00 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
1fd10 20 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20   at regBase..   
1fd20 20 2a 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20   */.    regBase 
1fd30 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74  = codeAllEqualit
1fd40 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c 70 4c  yTerms(pParse,pL
1fd50 65 76 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72 61  evel,bRev,nExtra
1fd60 52 65 67 2c 26 7a 53 74 61 72 74 41 66 66 29 3b  Reg,&zStartAff);
1fd70 0a 20 20 20 20 7a 45 6e 64 41 66 66 20 3d 20 73  .    zEndAff = s
1fd80 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
1fd90 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  b, zStartAff);. 
1fda0 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65     addrNxt = pLe
1fdb0 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20  vel->addrNxt;.. 
1fdc0 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
1fdd0 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65 20  doing a reverse 
1fde0 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e  order scan on an
1fdf0 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78   ascending index
1fe00 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f  , or.    ** a fo
1fe10 72 77 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e  rward order scan
1fe20 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67   on a descending
1fe30 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61   index, intercha
1fe40 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nge the .    ** 
1fe50 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65  start and end te
1fe60 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72 74  rms (pRangeStart
1fe70 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e   and pRangeEnd).
1fe80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1fe90 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  (nEq<pIdx->nKeyC
1fea0 6f 6c 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64  ol && bRev==(pId
1feb0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45  x->aSortOrder[nE
1fec0 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  q]==SQLITE_SO_AS
1fed0 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65  C)).     || (bRe
1fee0 76 20 26 26 20 70 49 64 78 2d 3e 6e 4b 65 79 43  v && pIdx->nKeyC
1fef0 6f 6c 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a  ol==nEq).    ){.
1ff00 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65        SWAP(Where
1ff10 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e  Term *, pRangeEn
1ff20 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b  d, pRangeStart);
1ff30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74  .    }..    test
1ff40 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
1ff50 74 20 26 26 20 28 70 52 61 6e 67 65 53 74 61 72  t && (pRangeStar
1ff60 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
1ff70 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20  O_LE)!=0 );.    
1ff80 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
1ff90 53 74 61 72 74 20 26 26 20 28 70 52 61 6e 67 65  Start && (pRange
1ffa0 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72  Start->eOperator
1ffb0 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a   & WO_GE)!=0 );.
1ffc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
1ffd0 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e  angeEnd && (pRan
1ffe0 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
1fff0 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a   & WO_LE)!=0 );.
20000 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
20010 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e  angeEnd && (pRan
20020 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
20030 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a   & WO_GE)!=0 );.
20040 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 21 70      startEq = !p
20050 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52  RangeStart || pR
20060 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72  angeStart->eOper
20070 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f  ator & (WO_LE|WO
20080 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20  _GE);.    endEq 
20090 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c  =   !pRangeEnd |
200a0 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70  | pRangeEnd->eOp
200b0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c  erator & (WO_LE|
200c0 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72  WO_GE);.    star
200d0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20  t_constraints = 
200e0 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e  pRangeStart || n
200f0 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  Eq>0;..    /* Se
20100 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63 75 72  ek the index cur
20110 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  sor to the start
20120 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a   of the range. *
20130 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e  /.    nConstrain
20140 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28  t = nEq;.    if(
20150 20 70 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a   pRangeStart ){.
20160 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
20170 68 74 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74  ht = pRangeStart
20180 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
20190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
201a0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
201b0 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e  Right, regBase+n
201c0 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  Eq);.      if( (
201d0 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46  pRangeStart->wtF
201e0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
201f0 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  L)==0 ){.       
20200 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
20210 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52  IsNullJump(v, pR
20220 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
20230 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  q, addrNxt);.   
20240 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
20250 53 74 61 72 74 41 66 66 20 29 7b 0a 20 20 20 20  StartAff ){.    
20260 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
20270 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
20280 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66  Right, zStartAff
20290 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41  [nEq])==SQLITE_A
202a0 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20  FF_NONE){.      
202b0 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65      /* Since the
202c0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
202d0 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77  o be performed w
202e0 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f  ith no conversio
202f0 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ns.          ** 
20300 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f  applied to the o
20310 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65  perands, set the
20320 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70   affinity to app
20330 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20  ly to pRight to 
20340 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51  .          ** SQ
20350 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20  LITE_AFF_NONE.  
20360 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74  */.          zSt
20370 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51  artAff[nEq] = SQ
20380 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
20390 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
203a0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
203b0 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
203c0 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 53  hange(pRight, zS
203d0 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b  tartAff[nEq]) ){
203e0 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72  .          zStar
203f0 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49  tAff[nEq] = SQLI
20400 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
20410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20       }.      }  
20420 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
20430 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74  nt++;.      test
20440 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
20450 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
20460 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
20470 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4d 69 6e   }else if( isMin
20480 51 75 65 72 79 20 29 7b 0a 20 20 20 20 20 20 73  Query ){.      s
20490 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
204a0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
204b0 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
204c0 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
204d0 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45 71  +;.      startEq
204e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72   = 0;.      star
204f0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20  t_constraints = 
20500 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64  1;.    }.    cod
20510 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
20520 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
20530 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 7a 53 74  nConstraint, zSt
20540 61 72 74 41 66 66 29 3b 0a 20 20 20 20 6f 70 20  artAff);.    op 
20550 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72  = aStartOp[(star
20560 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32  t_constraints<<2
20570 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29  ) + (startEq<<1)
20580 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61 73   + bRev];.    as
20590 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20  sert( op!=0 );. 
205a0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
205b0 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20  =OP_Rewind );.  
205c0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
205d0 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20 74  OP_Last );.    t
205e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
205f0 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 74 65  SeekGt );.    te
20600 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
20610 65 65 6b 47 65 20 29 3b 0a 20 20 20 20 74 65 73  eekGe );.    tes
20620 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
20630 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65 73 74  ekLe );.    test
20640 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
20650 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  kLt );.    sqlit
20660 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
20670 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20  v, op, iIdxCur, 
20680 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65  addrNxt, regBase
20690 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  , nConstraint);.
206a0 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  .    /* Load the
206b0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69   value for the i
206c0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
206d0 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  aint at the end 
206e0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 61  of the.    ** ra
206f0 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20 20  nge (if any)..  
20700 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72    */.    nConstr
20710 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20  aint = nEq;.    
20720 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29 7b  if( pRangeEnd ){
20730 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
20740 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d  ght = pRangeEnd-
20750 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
20760 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20770 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
20780 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  rse, regBase+nEq
20790 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
207a0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
207b0 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  se, pRight, regB
207c0 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
207d0 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e  if( (pRangeEnd->
207e0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
207f0 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NULL)==0 ){.    
20800 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20810 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c  odeIsNullJump(v,
20820 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
20830 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a  +nEq, addrNxt);.
20840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
20850 28 20 7a 45 6e 64 41 66 66 20 29 7b 0a 20 20 20  ( zEndAff ){.   
20860 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
20870 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
20880 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b  pRight, zEndAff[
20890 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46  nEq])==SQLITE_AF
208a0 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20  F_NONE){.       
208b0 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20     /* Since the 
208c0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f  comparison is to
208d0 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69   be performed wi
208e0 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  th no conversion
208f0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
20900 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70  pplied to the op
20910 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20  erands, set the 
20920 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c  affinity to appl
20930 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a  y to pRight to .
20940 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c            ** SQL
20950 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a  ITE_AFF_NONE.  *
20960 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64  /.          zEnd
20970 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
20980 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
20990 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
209a0 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
209b0 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
209c0 67 65 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41  ge(pRight, zEndA
209d0 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20  ff[nEq]) ){.    
209e0 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45        zEndAff[nE
209f0 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  q] = SQLITE_AFF_
20a00 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
20a10 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20        }  .      
20a20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74  codeApplyAffinit
20a30 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  y(pParse, regBas
20a40 65 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e 64 41 66  e, nEq+1, zEndAf
20a50 66 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  f);.      nConst
20a60 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74  raint++;.      t
20a70 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
20a80 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
20a90 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
20aa0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
20ab0 62 46 72 65 65 28 64 62 2c 20 7a 53 74 61 72 74  bFree(db, zStart
20ac0 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Aff);.    sqlite
20ad0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 6e 64  3DbFree(db, zEnd
20ae0 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f  Aff);..    /* To
20af0 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f  p of the loop bo
20b00 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c  dy */.    pLevel
20b10 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
20b20 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
20b30 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
20b40 69 66 20 74 68 65 20 69 6e 64 65 78 20 63 75 72  if the index cur
20b50 73 6f 72 20 69 73 20 70 61 73 74 20 74 68 65 20  sor is past the 
20b60 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65  end of the range
20b70 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45  . */.    op = aE
20b80 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64 20  ndOp[(pRangeEnd 
20b90 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b 20 62  || nEq) * (1 + b
20ba0 52 65 76 29 5d 3b 0a 20 20 20 20 74 65 73 74 63  Rev)];.    testc
20bb0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70  ase( op==OP_Noop
20bc0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
20bd0 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29  ( op==OP_IdxGE )
20be0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
20bf0 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a  op==OP_IdxLT );.
20c00 20 20 20 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e      if( op!=OP_N
20c10 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  oop ){.      sql
20c20 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
20c30 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  t(v, op, iIdxCur
20c40 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61  , addrNxt, regBa
20c50 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29  se, nConstraint)
20c60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20c70 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 65  dbeChangeP5(v, e
20c80 6e 64 45 71 21 3d 62 52 65 76 20 3f 31 3a 30 29  ndEq!=bRev ?1:0)
20c90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
20ca0 49 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 65  If there are ine
20cb0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
20cc0 6e 74 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20  nts, check that 
20cd0 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  the value.    **
20ce0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f   of the table co
20cf0 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 69 6e  lumn that the in
20d00 65 71 75 61 6c 69 74 79 20 63 6f 6e 74 72 61 69  equality contrai
20d10 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a  ns is not NULL..
20d20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c      ** If it is,
20d30 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78   jump to the nex
20d40 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
20d50 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  he loop..    */.
20d60 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
20d70 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
20d80 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  e);.    testcase
20d90 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
20da0 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
20db0 49 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IT );.    testca
20dc0 73 65 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  se( pLoop->wsFla
20dd0 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
20de0 49 4d 49 54 20 29 3b 0a 20 20 20 20 69 66 28 20  IMIT );.    if( 
20df0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
20e00 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  & (WHERE_BTM_LIM
20e10 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  IT|WHERE_TOP_LIM
20e20 49 54 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  IT))!=0 ){.     
20e30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20e40 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
20e50 20 69 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72   iIdxCur, nEq, r
20e60 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
20e70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20e80 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64  P_IsNull, r1, ad
20e90 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  drCont);.    }. 
20ea0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
20eb0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
20ec0 20 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65   r1);..    /* Se
20ed0 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  ek the table cur
20ee0 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65 64  sor, if required
20ef0 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54   */.    disableT
20f00 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e  erm(pLevel, pRan
20f10 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69  geStart);.    di
20f20 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
20f30 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20  , pRangeEnd);.  
20f40 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65    if( !omitTable
20f50 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64   ){.      iRowid
20f60 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65  Reg = iReleaseRe
20f70 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
20f80 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
20f90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20fa0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
20fb0 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20  Rowid, iIdxCur, 
20fc0 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
20fd0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
20fe0 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
20ff0 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
21000 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
21010 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21020 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20   OP_Seek, iCur, 
21030 69 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20  iRowidReg);  /* 
21040 44 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f  Deferred seek */
21050 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
21060 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75  ecord the instru
21070 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65  ction used to te
21080 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
21090 2e 20 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a  . Disable .    *
210a0 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
210b0 65 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64  erms made redund
210c0 61 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65 78  ant by the index
210d0 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20   range scan..   
210e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f   */.    if( pLoo
210f0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
21100 52 45 5f 4f 4e 45 52 4f 57 20 29 7b 0a 20 20 20  RE_ONEROW ){.   
21110 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
21120 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c  OP_Noop;.    }el
21130 73 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20  se if( bRev ){. 
21140 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
21150 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d  = OP_Prev;.    }
21160 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
21170 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74  el->op = OP_Next
21180 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76  ;.    }.    pLev
21190 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72  el->p1 = iIdxCur
211a0 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  ;.    if( (pLoop
211b0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
211c0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 3d 3d 30  E_CONSTRAINT)==0
211d0 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
211e0 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54  ->p5 = SQLITE_ST
211f0 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
21200 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73  N_STEP;.    }els
21210 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
21220 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29   pLevel->p5==0 )
21230 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
21240 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21250 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
21260 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 6f 6f 70  TION.  if( pLoop
21270 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
21280 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20  E_MULTI_OR ){.  
21290 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 77    /* Case 5:  Tw
212a0 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
212b0 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65 72  tely indexed ter
212c0 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  ms connected by 
212d0 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  OR.    **.    **
212e0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
212f0 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
21300 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c   TABLE t1(a,b,c,
21310 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  d);.    **   CRE
21320 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
21330 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20  t1(a);.    **   
21340 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20  CREATE INDEX i2 
21350 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a  ON t1(b);.    **
21360 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
21370 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20  i3 ON t1(c);.   
21380 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c   **.    **   SEL
21390 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
213a0 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f  ERE a=5 OR b=7 O
213b0 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31 33  R (c=11 AND d=13
213c0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
213d0 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c 20  In the example, 
213e0 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  there are three 
213f0 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f  indexed terms co
21400 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a 20  nnected by OR.. 
21410 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66     ** The top of
21420 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20   the loop looks 
21430 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
21440 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
21450 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20    Null       1  
21460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
21470 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20  Zero the rowset 
21480 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a  in reg 1.    **.
21490 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72      ** Then, for
214a0 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74 65   each indexed te
214b0 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  rm, the followin
214c0 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73  g. The arguments
214d0 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65   to.    ** RowSe
214e0 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20 74  tTest are such t
214f0 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f 66  hat the rowid of
21500 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
21510 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20 20   is inserted.   
21520 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f 77   ** into the Row
21530 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61 6c  Set. If it is al
21540 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20 63  ready present, c
21550 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68 65  ontrol skips the
21560 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70  .    ** Gosub op
21570 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20 73  code and jumps s
21580 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20 63  traight to the c
21590 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
215a0 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20 20   WhereEnd()..   
215b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
215c0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65    sqlite3WhereBe
215d0 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20  gin(<term>).    
215e0 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77 53  **          RowS
215f0 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20 20  etTest          
21600 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72 74          # Insert
21610 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77 73   rowid into rows
21620 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  et.    **       
21630 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32 20     Gosub      2 
21640 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  A.    **        
21650 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
21660 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
21670 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61 62  Following the ab
21680 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65 72  ove, code to ter
21690 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
216a0 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74 61   Label A, the ta
216b0 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74  rget.    ** of t
216c0 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c 20  he Gosub above, 
216d0 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e 73  jumps to the ins
216e0 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20 61  truction right a
216f0 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20  fter the Goto.. 
21700 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
21710 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20        Null      
21720 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
21730 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77    # Zero the row
21740 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20  set in reg 1.   
21750 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 74   **          Got
21760 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20 20  o       B       
21770 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20 6c           # The l
21780 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64 2e  oop is finished.
21790 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
217a0 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f       A: <loop bo
217b0 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20 20  dy>             
217c0 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61 74      # Return dat
217d0 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20 20  a, whatever..   
217e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
217f0 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20 32      Return     2
21800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21810 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74  # Jump back to t
21820 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a  he Gosub.    **.
21830 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a 20      **       B: 
21840 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e  <after the loop>
21850 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20  .    **.    */. 
21860 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
21870 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68 65  pOrWc;    /* The
21880 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65   OR-clause broke
21890 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74 65  n out into subte
218a0 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69  rms */.    SrcLi
218b0 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20 20 20  st *pOrTab;     
218c0 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20 74    /* Shortened t
218d0 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d  able list or OR-
218e0 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74 69 6f  clause generatio
218f0 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  n */.    Index *
21900 70 43 6f 76 20 3d 20 30 3b 20 20 20 20 20 20 20  pCov = 0;       
21910 20 20 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69        /* Potenti
21920 61 6c 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  al covering inde
21930 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20  x (or NULL) */. 
21940 20 20 20 69 6e 74 20 69 43 6f 76 43 75 72 20 3d     int iCovCur =
21950 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
21960 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64    /* Cursor used
21970 20 66 6f 72 20 69 6e 64 65 78 20 73 63 61 6e 73   for index scans
21980 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20   (if any) */..  
21990 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 20    int regReturn 
219a0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
219b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
219c0 65 67 69 73 74 65 72 20 75 73 65 64 20 77 69 74  egister used wit
219d0 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20  h OP_Gosub */.  
219e0 20 20 69 6e 74 20 72 65 67 52 6f 77 73 65 74 20    int regRowset 
219f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
21a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
21a10 65 67 69 73 74 65 72 20 66 6f 72 20 52 6f 77 53  egister for RowS
21a20 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  et object */.   
21a30 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20   int regRowid = 
21a40 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
21a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
21a60 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
21a70 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  owid */.    int 
21a80 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69  iLoopBody = sqli
21a90 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
21aa0 28 76 29 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f  (v);  /* Start o
21ab0 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20  f loop body */. 
21ac0 20 20 20 69 6e 74 20 69 52 65 74 49 6e 69 74 3b     int iRetInit;
21ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21af0 41 64 64 72 65 73 73 20 6f 66 20 72 65 67 52 65  Address of regRe
21b00 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20  turn init */.   
21b10 20 69 6e 74 20 75 6e 74 65 73 74 65 64 54 65 72   int untestedTer
21b20 6d 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ms = 0;         
21b30 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d      /* Some term
21b40 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  s not completely
21b50 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 20 20 69   tested */.    i
21b60 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
21b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b80 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
21b90 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70  r */.    Expr *p
21ba0 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20 20 20  AndExpr = 0;    
21bb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
21bc0 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22  n ".. AND (...)"
21bd0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
21be0 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70    .    pTerm = p
21bf0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b  Loop->aLTerm[0];
21c00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
21c10 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  rm!=0 );.    ass
21c20 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
21c30 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b  rator & WO_OR );
21c40 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
21c50 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
21c60 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29  ERM_ORINFO)!=0 )
21c70 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70  ;.    pOrWc = &p
21c80 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
21c90 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  >wc;.    pLevel-
21ca0 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b  >op = OP_Return;
21cb0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
21cc0 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20  = regReturn;..  
21cd0 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65    /* Set up a ne
21ce0 77 20 53 72 63 4c 69 73 74 20 69 6e 20 70 4f 72  w SrcList in pOr
21cf0 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  Tab containing t
21d00 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73  he table being s
21d10 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79  canned.    ** by
21d20 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68   this loop in th
21d30 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20  e a[0] slot and 
21d40 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62  all notReady tab
21d50 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c  les in a[1..] sl
21d60 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73  ots..    ** This
21d70 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63   becomes the Src
21d80 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65 63 75  List in the recu
21d90 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71  rsive call to sq
21da0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
21db0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
21dc0 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
21dd0 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >1 ){.      int 
21de0 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20  nNotReady;      
21df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
21e00 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52  e number of notR
21e10 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20  eady tables */. 
21e20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
21e30 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72  ist_item *origSr
21e40 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  c;     /* Origin
21e50 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65  al list of table
21e60 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52  s */.      nNotR
21e70 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e  eady = pWInfo->n
21e80 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d  Level - iLevel -
21e90 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62   1;.      pOrTab
21ea0 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41   = sqlite3StackA
21eb0 6c 6c 6f 63 52 61 77 28 64 62 2c 0a 20 20 20 20  llocRaw(db,.    
21ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ed0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
21ee0 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61  pOrTab)+ nNotRea
21ef0 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61 62  dy*sizeof(pOrTab
21f00 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  ->a[0]));.      
21f10 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20 29 20  if( pOrTab==0 ) 
21f20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b  return notReady;
21f30 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e  .      pOrTab->n
21f40 41 6c 6c 6f 63 20 3d 20 28 75 38 29 28 6e 4e 6f  Alloc = (u8)(nNo
21f50 74 52 65 61 64 79 20 2b 20 31 29 3b 0a 20 20 20  tReady + 1);.   
21f60 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20     pOrTab->nSrc 
21f70 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63  = pOrTab->nAlloc
21f80 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
21f90 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61 62 49 74  OrTab->a, pTabIt
21fa0 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61 62  em, sizeof(*pTab
21fb0 49 74 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72  Item));.      or
21fc0 69 67 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e  igSrc = pWInfo->
21fd0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  pTabList->a;.   
21fe0 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e     for(k=1; k<=n
21ff0 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a  NotReady; k++){.
22000 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
22010 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f  pOrTab->a[k], &o
22020 72 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d  rigSrc[pLevel[k]
22030 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28  .iFrom], sizeof(
22040 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a  pOrTab->a[k]));.
22050 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
22060 65 7b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20  e{.      pOrTab 
22070 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
22080 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  st;.    }..    /
22090 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
220a0 20 72 6f 77 73 65 74 20 72 65 67 69 73 74 65 72   rowset register
220b0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c   to contain NULL
220c0 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73  . An SQL NULL is
220d0 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c   .    ** equival
220e0 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  ent to an empty 
220f0 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20  rowset..    **. 
22100 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69     ** Also initi
22110 61 6c 69 7a 65 20 72 65 67 52 65 74 75 72 6e 20  alize regReturn 
22120 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 61  to contain the a
22130 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e  ddress of the in
22140 73 74 72 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a  struction .    *
22150 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
22160 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f 52  llowing the OP_R
22170 65 74 75 72 6e 20 61 74 20 74 68 65 20 62 6f 74  eturn at the bot
22180 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  tom of the loop.
22190 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20   This.    ** is 
221a0 72 65 71 75 69 72 65 64 20 69 6e 20 61 20 66 65  required in a fe
221b0 77 20 6f 62 73 63 75 72 65 20 4c 45 46 54 20 4a  w obscure LEFT J
221c0 4f 49 4e 20 63 61 73 65 73 20 77 68 65 72 65 20  OIN cases where 
221d0 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20  control jumps.  
221e0 20 20 2a 2a 20 6f 76 65 72 20 74 68 65 20 74 6f    ** over the to
221f0 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e  p of the loop in
22200 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 69  to the body of i
22210 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
22220 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72  the .    ** corr
22230 65 63 74 20 72 65 73 70 6f 6e 73 65 20 66 6f 72  ect response for
22240 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70   the end-of-loop
22250 20 63 6f 64 65 20 28 74 68 65 20 4f 50 5f 52 65   code (the OP_Re
22260 74 75 72 6e 29 20 69 73 20 74 6f 20 0a 20 20 20  turn) is to .   
22270 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   ** fall through
22280 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73   to the next ins
22290 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61  truction, just a
222a0 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65  s an OP_Next doe
222b0 73 20 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s if.    ** call
222c0 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69  ed on an uniniti
222d0 61 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20  alized cursor.. 
222e0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
222f0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
22300 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43  s & WHERE_DUPLIC
22310 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  ATES_OK)==0 ){. 
22320 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d       regRowset =
22330 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
22340 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20  .      regRowid 
22350 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
22360 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22370 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
22380 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73  Null, 0, regRows
22390 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  et);.    }.    i
223a0 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  RetInit = sqlite
223b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
223c0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
223d0 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f  gReturn);..    /
223e0 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61  * If the origina
223f0 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  l WHERE clause i
22400 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  s z of the form:
22410 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e    (x1 OR x2 OR .
22420 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a  ..) AND y.    **
22430 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20   Then for every 
22440 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74  term xN, evaluat
22450 65 20 61 73 20 74 68 65 20 73 75 62 65 78 70 72  e as the subexpr
22460 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a  ession: xN AND z
22470 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79  .    ** That way
22480 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61  , terms in y tha
22490 74 20 61 72 65 20 66 61 63 74 6f 72 65 64 20 69  t are factored i
224a0 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74  nto the disjunct
224b0 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ion will.    ** 
224c0 62 65 20 70 69 63 6b 65 64 20 75 70 20 62 79 20  be picked up by 
224d0 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61  the recursive ca
224e0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68  lls to sqlite3Wh
224f0 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77  ereBegin() below
22500 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
22510 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73  Actually, each s
22520 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
22530 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e  converted to "xN
22540 20 41 4e 44 20 77 22 20 77 68 65 72 65 20 77 20   AND w" where w 
22550 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69  is.    ** the "i
22560 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d  nteresting" term
22570 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74  s of z - terms t
22580 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67  hat did not orig
22590 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20  inate in the.   
225a0 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20   ** ON or USING 
225b0 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54  clause of a LEFT
225c0 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73   JOIN, and terms
225d0 20 74 68 61 74 20 61 72 65 20 75 73 61 62 6c 65   that are usable
225e0 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69   as .    ** indi
225f0 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ces..    **.    
22600 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61  ** This optimiza
22610 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61  tion also only a
22620 70 70 6c 69 65 73 20 69 66 20 74 68 65 20 28 78  pplies if the (x
22630 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20  1 OR x2 OR ...) 
22640 74 65 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e  term.    ** is n
22650 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
22660 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  the ON clause of
22670 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20   a LEFT JOIN..  
22680 20 20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 20    ** See ticket 
22690 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74  http://www.sqlit
226a0 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66  e.org/src/info/f
226b0 32 33 36 39 33 30 34 65 34 0a 20 20 20 20 2a 2f  2369304e4.    */
226c0 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 6e 54  .    if( pWC->nT
226d0 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20 69  erm>1 ){.      i
226e0 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20  nt iTerm;.      
226f0 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65  for(iTerm=0; iTe
22700 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69  rm<pWC->nTerm; i
22710 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
22720 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
22730 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78  WC->a[iTerm].pEx
22740 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
22750 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d  &pWC->a[iTerm] =
22760 3d 20 70 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e  = pTerm ) contin
22770 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
22780 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
22790 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
227a0 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  in) ) continue;.
227b0 20 20 20 20 20 20 20 20 69 66 28 20 70 57 43 2d          if( pWC-
227c0 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67  >a[iTerm].wtFlag
227d0 73 20 26 20 28 54 45 52 4d 5f 4f 52 49 4e 46 4f  s & (TERM_ORINFO
227e0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
227f0 20 20 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e        if( (pWC->
22800 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74  a[iTerm].eOperat
22810 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20  or & WO_ALL)==0 
22820 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22830 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
22840 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
22850 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
22860 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c    pAndExpr = sql
22870 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
22880 70 41 6e 64 45 78 70 72 2c 20 70 45 78 70 72 29  pAndExpr, pExpr)
22890 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
228a0 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a  if( pAndExpr ){.
228b0 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72          pAndExpr
228c0 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
228d0 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20  pParse, TK_AND, 
228e0 30 2c 20 70 41 6e 64 45 78 70 72 2c 20 30 29 3b  0, pAndExpr, 0);
228f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
22900 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
22910 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69  <pOrWc->nTerm; i
22920 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72  i++){.      Wher
22930 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d  eTerm *pOrTerm =
22940 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a   &pOrWc->a[ii];.
22950 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
22960 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
22970 43 75 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d 2d  Cur || (pOrTerm-
22980 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
22990 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  AND)!=0 ){.     
229a0 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53     WhereInfo *pS
229b0 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  ubWInfo;        
229c0 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69    /* Info for si
229d0 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61  ngle OR-term sca
229e0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70  n */.        Exp
229f0 72 20 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f 72  r *pOrExpr = pOr
22a00 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
22a10 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70       if( pAndExp
22a20 72 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  r && !ExprHasPro
22a30 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c 20 45  perty(pOrExpr, E
22a40 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
22a50 20 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70           pAndExp
22a60 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45 78  r->pLeft = pOrEx
22a70 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  pr;.          pO
22a80 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78 70 72  rExpr = pAndExpr
22a90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22aa0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
22ab0 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65  ugh table entrie
22ac0 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72  s that match ter
22ad0 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20  m pOrTerm. */.  
22ae0 20 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20        pSubWInfo 
22af0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
22b00 67 69 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54  gin(pParse, pOrT
22b10 61 62 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c 20  ab, pOrExpr, 0, 
22b20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
22b30 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
22b40 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45  _OMIT_OPEN_CLOSE
22b50 20 7c 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c   | WHERE_AND_ONL
22b60 59 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Y |.            
22b70 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
22b80 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20  E_FORCE_TABLE | 
22b90 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
22ba0 4e 4c 59 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20  NLY, iCovCur);. 
22bb0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
22bc0 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72  SubWInfo || pPar
22bd0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
22be0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
22bf0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
22c00 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  WInfo ){.       
22c10 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 53     WhereLoop *pS
22c20 75 62 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  ubLoop;.        
22c30 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e    explainOneScan
22c40 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
22c50 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20  pParse, pOrTab, 
22c60 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d  &pSubWInfo->a[0]
22c70 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c  , iLevel, pLevel
22c80 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20  ->iFrom, 0.     
22c90 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
22ca0 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
22cb0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
22cc0 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
22cd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
22ce0 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28     int iSet = ((
22cf0 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  ii==pOrWc->nTerm
22d00 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20  -1)?-1:ii);.    
22d10 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20          int r;. 
22d20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73             r = s
22d30 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
22d40 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
22d50 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20  pTabItem->pTab, 
22d60 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20 20 20 20  -1, iCur, .     
22d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d90 20 20 20 20 72 65 67 52 6f 77 69 64 2c 20 30 29      regRowid, 0)
22da0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
22db0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
22dc0 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54  nt(v, OP_RowSetT
22dd0 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a  est, regRowset,.
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e00 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
22e10 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 2c  entAddr(v)+2, r,
22e20 20 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20   iSet);.        
22e30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
22e40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22e50 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
22e60 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64  Return, iLoopBod
22e70 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  y);..          /
22e80 2a 20 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d  * The pSubWInfo-
22e90 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66  >untestedTerms f
22ea0 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74  lag means that t
22eb0 68 69 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20  his OR term.    
22ec0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
22ed0 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41  ed one or more A
22ee0 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e  ND term from a n
22ef0 6f 74 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20  otReady table.  
22f00 54 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  The.          **
22f10 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
22f20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 20 63  notReady table c
22f30 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74  ould not be test
22f40 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20  ed and will.    
22f50 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f        ** need to
22f60 20 62 65 20 74 65 73 74 65 64 20 6c 61 74 65 72   be tested later
22f70 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
22f80 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
22f90 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  bWInfo->untested
22fa0 54 65 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64  Terms ) untested
22fb0 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20  Terms = 1;..    
22fc0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
22fd0 6f 66 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63  of the OR-connec
22fe0 74 65 64 20 74 65 72 6d 73 20 61 72 65 20 6f 70  ted terms are op
22ff0 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68  timized using th
23000 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20  e same.         
23010 20 2a 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20 74   ** index, and t
23020 68 65 20 69 6e 64 65 78 20 69 73 20 6f 70 65 6e  he index is open
23030 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
23040 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a  e cursor number.
23050 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20            ** by 
23060 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c  each call to sql
23070 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
23080 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 6c 6f   made by this lo
23090 6f 70 2c 20 69 74 20 6d 61 79 0a 20 20 20 20 20  op, it may.     
230a0 20 20 20 20 20 2a 2a 20 62 65 20 70 6f 73 73 69       ** be possi
230b0 62 6c 65 20 74 6f 20 75 73 65 20 74 68 61 74 20  ble to use that 
230c0 69 6e 64 65 78 20 61 73 20 61 20 63 6f 76 65 72  index as a cover
230d0 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  ing index..     
230e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
230f0 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    ** If the call
23100 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
23110 42 65 67 69 6e 28 29 20 61 62 6f 76 65 20 72 65  Begin() above re
23120 73 75 6c 74 65 64 20 69 6e 20 61 20 73 63 61 6e  sulted in a scan
23130 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
23140 2a 2a 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  ** uses an index
23150 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 65 69  , and this is ei
23160 74 68 65 72 20 74 68 65 20 66 69 72 73 74 20 4f  ther the first O
23170 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d  R-connected term
23180 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
23190 6f 63 65 73 73 65 64 20 6f 72 20 74 68 65 20 69  ocessed or the i
231a0 6e 64 65 78 20 69 73 20 74 68 65 20 73 61 6d 65  ndex is the same
231b0 20 61 73 20 74 68 61 74 20 75 73 65 64 20 62 79   as that used by
231c0 20 61 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20 20   all previous.  
231d0 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73          ** terms
231e0 2c 20 73 65 74 20 70 43 6f 76 20 74 6f 20 74 68  , set pCov to th
231f0 65 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65  e candidate cove
23200 72 69 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68 65  ring index. Othe
23210 72 77 69 73 65 2c 20 73 65 74 20 0a 20 20 20 20  rwise, set .    
23220 20 20 20 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f        ** pCov to
23230 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74   NULL to indicat
23240 65 20 74 68 61 74 20 6e 6f 20 63 61 6e 64 69 64  e that no candid
23250 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ate covering ind
23260 65 78 20 77 69 6c 6c 20 0a 20 20 20 20 20 20 20  ex will .       
23270 20 20 20 2a 2a 20 62 65 20 61 76 61 69 6c 61 62     ** be availab
23280 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  le..          */
23290 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62 4c  .          pSubL
232a0 6f 6f 70 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d  oop = pSubWInfo-
232b0 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20  >a[0].pWLoop;.  
232c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
232d0 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61  (pSubLoop->wsFla
232e0 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
232f0 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 20  INDEX)==0 );.   
23300 20 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62         if( (pSub
23310 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
23320 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
23330 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
23340 28 69 69 3d 3d 30 20 7c 7c 20 70 53 75 62 4c 6f  (ii==0 || pSubLo
23350 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
23360 65 78 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20 20  ex==pCov).      
23370 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
23380 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 57     assert( pSubW
23390 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78 43  Info->a[0].iIdxC
233a0 75 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20  ur==iCovCur );. 
233b0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76 20             pCov 
233c0 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74  = pSubLoop->u.bt
233d0 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
233e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
233f0 20 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20           pCov = 
23400 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  0;.          }..
23410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
23420 69 73 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72  ish the loop thr
23430 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69  ough table entri
23440 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65  es that match te
23450 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20  rm pOrTerm. */. 
23460 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23470 57 68 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e  WhereEnd(pSubWIn
23480 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fo);.        }. 
23490 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
234a0 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69   pLevel->u.pCovi
234b0 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69  dx = pCov;.    i
234c0 66 28 20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c  f( pCov ) pLevel
234d0 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76  ->iIdxCur = iCov
234e0 43 75 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e  Cur;.    if( pAn
234f0 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70  dExpr ){.      p
23500 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d  AndExpr->pLeft =
23510 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
23520 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
23530 70 41 6e 64 45 78 70 72 29 3b 0a 20 20 20 20 7d  pAndExpr);.    }
23540 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
23550 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74  ChangeP1(v, iRet
23560 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62  Init, sqlite3Vdb
23570 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
23580 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
23590 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
235a0 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61  to, 0, pLevel->a
235b0 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c  ddrBrk);.    sql
235c0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
235d0 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64  abel(v, iLoopBod
235e0 79 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 49  y);..    if( pWI
235f0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20  nfo->nLevel>1 ) 
23600 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65  sqlite3StackFree
23610 28 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20  (db, pOrTab);.  
23620 20 20 69 66 28 20 21 75 6e 74 65 73 74 65 64 54    if( !untestedT
23630 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65  erms ) disableTe
23640 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
23650 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
23660 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
23670 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
23680 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20   */..  {.    /* 
23690 43 61 73 65 20 36 3a 20 20 54 68 65 72 65 20 69  Case 6:  There i
236a0 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65  s no usable inde
236b0 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61  x.  We must do a
236c0 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a   complete.    **
236d0 20 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f            scan o
236e0 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62  f the entire tab
236f0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  le..    */.    s
23700 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
23710 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65  Step[] = { OP_Ne
23720 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20  xt, OP_Prev };. 
23730 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
23740 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20  u8 aStart[] = { 
23750 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61  OP_Rewind, OP_La
23760 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74  st };.    assert
23770 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65  ( bRev==0 || bRe
23780 76 3d 3d 31 20 29 3b 0a 20 20 20 20 70 4c 65 76  v==1 );.    pLev
23790 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62  el->op = aStep[b
237a0 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Rev];.    pLevel
237b0 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
237c0 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20   pLevel->p2 = 1 
237d0 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
237e0 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52  Op2(v, aStart[bR
237f0 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ev], iCur, addrB
23800 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  rk);.    pLevel-
23810 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d  >p5 = SQLITE_STM
23820 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
23830 5f 53 54 45 50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _STEP;.  }..  /*
23840 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20   Insert code to 
23850 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65 78  test every subex
23860 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61  pression that ca
23870 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a  n be completely.
23880 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73    ** computed us
23890 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
238a0 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20  set of tables.. 
238b0 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   */.  for(pTerm=
238c0 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e  pWC->a, j=pWC->n
238d0 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
238e0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
238f0 70 72 20 2a 70 45 3b 0a 20 20 20 20 74 65 73 74  pr *pE;.    test
23900 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
23910 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
23920 55 41 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  UAL );.    testc
23930 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
23940 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
23950 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72   );.    if( pTer
23960 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
23970 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
23980 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
23990 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  e;.    if( (pTer
239a0 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70  m->prereqAll & p
239b0 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29  Level->notReady)
239c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73  !=0 ){.      tes
239d0 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 75  tcase( pWInfo->u
239e0 6e 74 65 73 74 65 64 54 65 72 6d 73 3d 3d 30 0a  ntestedTerms==0.
239f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
23a00 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
23a10 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
23a20 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20  ETABLE_ONLY)!=0 
23a30 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  );.      pWInfo-
23a40 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d  >untestedTerms =
23a50 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   1;.      contin
23a60 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45  ue;.    }.    pE
23a70 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
23a80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21  .    assert( pE!
23a90 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  =0 );.    if( pL
23aa0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
23ab0 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
23ac0 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a  rty(pE, EP_FromJ
23ad0 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  oin) ){.      co
23ae0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
23af0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
23b00 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c  alse(pParse, pE,
23b10 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
23b20 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
23b30 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
23b40 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
23b50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  .  }..  /* Inser
23b60 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 66  t code to test f
23b70 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e 73 74  or implied const
23b80 72 61 69 6e 74 73 20 62 61 73 65 64 20 6f 6e 20  raints based on 
23b90 74 72 61 6e 73 69 74 69 76 69 74 79 0a 20 20 2a  transitivity.  *
23ba0 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22 20 6f 70  * of the "==" op
23bb0 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  erator..  **.  *
23bc0 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68  * Example: If th
23bd0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
23be0 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d 74 32  ontains "t1.a=t2
23bf0 2e 62 22 20 61 6e 64 20 22 74 32 2e 62 3d 31 32  .b" and "t2.b=12
23c00 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20 61  3".  ** and we a
23c10 72 65 20 63 6f 64 69 6e 67 20 74 68 65 20 74 31  re coding the t1
23c20 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20 74 32   loop and the t2
23c30 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20 79 65   loop has not ye
23c40 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20 74 68  t coded,.  ** th
23c50 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65  en we cannot use
23c60 20 74 68 65 20 22 74 31 2e 61 3d 74 32 2e 62 22   the "t1.a=t2.b"
23c70 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62 75 74   constraint, but
23c80 20 77 65 20 63 61 6e 20 63 6f 64 65 0a 20 20 2a   we can code.  *
23c90 2a 20 74 68 65 20 69 6d 70 6c 69 65 64 20 22 74  * the implied "t
23ca0 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74 72 61  1.a=123" constra
23cb0 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  int..  */.  for(
23cc0 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d  pTerm=pWC->a, j=
23cd0 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b  pWC->nTerm; j>0;
23ce0 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j--, pTerm++){.
23cf0 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70      Expr *pE, *p
23d00 45 41 6c 74 3b 0a 20 20 20 20 57 68 65 72 65 54  EAlt;.    WhereT
23d10 65 72 6d 20 2a 70 41 6c 74 3b 0a 20 20 20 20 69  erm *pAlt;.    i
23d20 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
23d30 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
23d40 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
23d50 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
23d60 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
23d70 6f 72 21 3d 28 57 4f 5f 45 51 55 49 56 7c 57 4f  or!=(WO_EQUIV|WO
23d80 5f 45 51 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  _EQ) ) continue;
23d90 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
23da0 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72  leftCursor!=iCur
23db0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23dc0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
23dd0 66 74 4a 6f 69 6e 20 29 20 63 6f 6e 74 69 6e 75  ftJoin ) continu
23de0 65 3b 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72  e;.    pE = pTer
23df0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  m->pExpr;.    as
23e00 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
23e10 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72  operty(pE, EP_Fr
23e20 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20 20 20 61  omJoin) );.    a
23e30 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 70  ssert( (pTerm->p
23e40 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4c 65  rereqRight & pLe
23e50 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d  vel->notReady)!=
23e60 30 20 29 3b 0a 20 20 20 20 70 41 6c 74 20 3d 20  0 );.    pAlt = 
23e70 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
23e80 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  ur, pTerm->u.lef
23e90 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61 64  tColumn, notRead
23ea0 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20  y, WO_EQ|WO_IN, 
23eb0 30 29 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74  0);.    if( pAlt
23ec0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
23ed0 20 20 20 20 69 66 28 20 70 41 6c 74 2d 3e 77 74      if( pAlt->wt
23ee0 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f  Flags & (TERM_CO
23ef0 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
23f00 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
23f10 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  Alt->eOperator &
23f20 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 74 65   WO_EQ );.    te
23f30 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f  stcase( pAlt->eO
23f40 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
23f50 29 3b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  );.    VdbeNoopC
23f60 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69  omment((v, "begi
23f70 6e 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e  n transitive con
23f80 73 74 72 61 69 6e 74 22 29 29 3b 0a 20 20 20 20  straint"));.    
23f90 70 45 41 6c 74 20 3d 20 73 71 6c 69 74 65 33 53  pEAlt = sqlite3S
23fa0 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c  tackAllocRaw(db,
23fb0 20 73 69 7a 65 6f 66 28 2a 70 45 41 6c 74 29 29   sizeof(*pEAlt))
23fc0 3b 0a 20 20 20 20 69 66 28 20 70 45 41 6c 74 20  ;.    if( pEAlt 
23fd0 29 7b 0a 20 20 20 20 20 20 2a 70 45 41 6c 74 20  ){.      *pEAlt 
23fe0 3d 20 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b 0a  = *pAlt->pExpr;.
23ff0 20 20 20 20 20 20 70 45 41 6c 74 2d 3e 70 4c 65        pEAlt->pLe
24000 66 74 20 3d 20 70 45 2d 3e 70 4c 65 66 74 3b 0a  ft = pE->pLeft;.
24010 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
24020 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
24030 20 70 45 41 6c 74 2c 20 61 64 64 72 43 6f 6e 74   pEAlt, addrCont
24040 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
24050 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
24060 74 65 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c  te3StackFree(db,
24070 20 70 45 41 6c 74 29 3b 0a 20 20 20 20 7d 0a 20   pEAlt);.    }. 
24080 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c   }..  /* For a L
24090 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
240a0 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  generate code th
240b0 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74  at will record t
240c0 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a  he fact that.  *
240d0 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72  * at least one r
240e0 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  ow of the right 
240f0 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65  table has matche
24100 64 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  d the left table
24110 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  .  .  */.  if( p
24120 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
24130 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   ){.    pLevel->
24140 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
24150 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
24160 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
24170 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
24180 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70  OP_Integer, 1, p
24190 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
241a0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
241b0 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c  nt((v, "record L
241c0 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b  EFT JOIN hit"));
241d0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
241e0 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
241f0 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72  e);.    for(pTer
24200 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a  m=pWC->a, j=0; j
24210 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b  <pWC->nTerm; j++
24220 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
24230 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
24240 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
24250 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
24260 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
24270 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
24280 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20  RM_CODED );.    
24290 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
242a0 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
242b0 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
242c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
242d0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
242e0 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65  rereqAll & pLeve
242f0 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20  l->notReady)!=0 
24300 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
24310 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  t( pWInfo->untes
24320 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20  tedTerms );.    
24330 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
24340 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
24350 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
24360 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
24370 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
24380 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  rse, pTerm->pExp
24390 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  r, addrCont, SQL
243a0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
243b0 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
243c0 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
243d0 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  DED;.    }.  }. 
243e0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
243f0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69  empReg(pParse, i
24400 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20 20  ReleaseReg);..  
24410 72 65 74 75 72 6e 20 70 4c 65 76 65 6c 2d 3e 6e  return pLevel->n
24420 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 64  otReady;.}..#ifd
24430 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
24440 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ABLED./*.** Prin
24450 74 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  t a WhereLoop ob
24460 6a 65 63 74 20 66 6f 72 20 64 65 62 75 67 67 69  ject for debuggi
24470 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73  ng purposes.*/.s
24480 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
24490 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c  LoopPrint(WhereL
244a0 6f 6f 70 20 2a 70 2c 20 53 72 63 4c 69 73 74 20  oop *p, SrcList 
244b0 2a 70 54 61 62 4c 69 73 74 29 7b 0a 20 20 69 6e  *pTabList){.  in
244c0 74 20 6e 62 20 3d 20 31 2b 28 70 54 61 62 4c 69  t nb = 1+(pTabLi
244d0 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a 20  st->nSrc+7)/8;. 
244e0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
244f0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 54  item *pItem = pT
24500 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69  abList->a + p->i
24510 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  Tab;.  Table *pT
24520 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
24530 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
24540 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e 25 30  Printf("%c%2d.%0
24550 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d  *llx.%0*llx", p-
24560 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20 20  >cId,.          
24570 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 54             p->iT
24580 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53  ab, nb, p->maskS
24590 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72  elf, nb, p->prer
245a0 65 71 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  eq);.  sqlite3De
245b0 62 75 67 50 72 69 6e 74 66 28 22 20 25 31 32 73  bugPrintf(" %12s
245c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
245d0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a          pItem->z
245e0 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a  Alias ? pItem->z
245f0 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e  Alias : pTab->zN
24600 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ame);.  if( (p->
24610 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
24620 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
24630 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75   ){.    if( p->u
24640 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 29 7b  .btree.pIndex ){
24650 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
24660 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e  r *zName = p->u.
24670 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e  btree.pIndex->zN
24680 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ame;.      if( z
24690 4e 61 6d 65 3d 3d 30 20 29 20 7a 4e 61 6d 65 20  Name==0 ) zName 
246a0 3d 20 22 69 70 6b 22 3b 0a 20 20 20 20 20 20 69  = "ipk";.      i
246b0 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65  f( strncmp(zName
246c0 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
246d0 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b  dex_", 17)==0 ){
246e0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d  .        int i =
246f0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
24700 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20  (zName) - 1;.   
24710 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d       while( zNam
24720 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b  e[i]!='_' ) i--;
24730 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b  .        zName +
24740 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = i;.      }.   
24750 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24760 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25 32  rintf(".%-16s %2
24770 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e  d", zName, p->u.
24780 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20  btree.nEq);.    
24790 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
247a0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
247b0 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20 20  "%20s","");.    
247c0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  }.  }else{.    c
247d0 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20  har *z;.    if( 
247e0 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
247f0 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71   ){.      z = sq
24800 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
24810 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a  %d,\"%s\",%x)",.
24820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24830 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
24840 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  , p->u.vtab.idxS
24850 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  tr, p->u.vtab.om
24860 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c  itMask);.    }el
24870 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  se{.      z = sq
24880 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
24890 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74  %d,%x)", p->u.vt
248a0 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e  ab.idxNum, p->u.
248b0 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a  vtab.omitMask);.
248c0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
248d0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
248e0 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73  -19s", z);.    s
248f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
24900 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62    }.  sqlite3Deb
24910 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30 34  ugPrintf(" f %04
24920 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46 6c  x N %d", p->wsFl
24930 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b  ags, p->nLTerm);
24940 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
24950 72 69 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c  rintf(" cost %d,
24960 25 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65  %d,%d\n", p->rSe
24970 74 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d  tup, p->rRun, p-
24980 3e 6e 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  >nOut);.}.#endif
24990 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
249a0 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f  bulk memory into
249b0 20 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f   a valid WhereLo
249c0 6f 70 20 74 68 61 74 20 63 61 6e 20 62 65 20 70  op that can be p
249d0 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72  assed.** to wher
249e0 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c  eLoopClear harml
249f0 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  essly..*/.static
24a00 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49   void whereLoopI
24a10 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nit(WhereLoop *p
24a20 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d  ){.  p->aLTerm =
24a30 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b   p->aLTermSpace;
24a40 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  .  p->nLTerm = 0
24a50 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20  ;.  p->nLSlot = 
24a60 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54  ArraySize(p->aLT
24a70 65 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e  ermSpace);.  p->
24a80 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a  wsFlags = 0;.}..
24a90 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
24aa0 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f  WhereLoop.u unio
24ab0 6e 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c  n.  Leave WhereL
24ac0 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63  oop.pLTerm intac
24ad0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
24ae0 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  d whereLoopClear
24af0 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64  Union(sqlite3 *d
24b00 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
24b10 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61  {.  if( p->wsFla
24b20 67 73 20 26 20 28 57 48 45 52 45 5f 56 49 52 54  gs & (WHERE_VIRT
24b30 55 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41  UALTABLE|WHERE_A
24b40 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20  UTO_INDEX) ){.  
24b50 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
24b60 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
24b70 4c 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d  LTABLE)!=0 && p-
24b80 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
24b90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
24ba0 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62  3_free(p->u.vtab
24bb0 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20  .idxStr);.      
24bc0 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
24bd0 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  ee = 0;.      p-
24be0 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d  >u.vtab.idxStr =
24bf0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
24c00 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
24c10 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
24c20 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72  )!=0 && p->u.btr
24c30 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a  ee.pIndex!=0 ){.
24c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
24c50 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72  ree(db, p->u.btr
24c60 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41  ee.pIndex->zColA
24c70 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ff);.      sqlit
24c80 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
24c90 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b  u.btree.pIndex);
24ca0 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65  .      p->u.btre
24cb0 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
24cc0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
24cd0 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65   Deallocate inte
24ce0 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64  rnal memory used
24cf0 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20   by a WhereLoop 
24d00 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63  object.*/.static
24d10 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43   void whereLoopC
24d20 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62  lear(sqlite3 *db
24d30 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
24d40 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d  .  if( p->aLTerm
24d50 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  !=p->aLTermSpace
24d60 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
24d70 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b  (db, p->aLTerm);
24d80 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
24d90 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20  rUnion(db, p);. 
24da0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70   whereLoopInit(p
24db0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  );.}../*.** Incr
24dc0 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  ease the memory 
24dd0 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70  allocation for p
24de0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74  Loop->aLTerm[] t
24df0 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e  o be at least n.
24e00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
24e10 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73  hereLoopResize(s
24e20 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
24e30 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29  eLoop *p, int n)
24e40 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a  {.  WhereTerm **
24e50 70 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e  paNew;.  if( p->
24e60 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75  nLSlot>=n ) retu
24e70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
24e80 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20  n = (n+7)&~7;.  
24e90 70 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44  paNew = sqlite3D
24ea0 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
24eb0 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b  izeof(p->aLTerm[
24ec0 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61  0])*n);.  if( pa
24ed0 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
24ee0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
24ef0 6d 65 6d 63 70 79 28 70 61 4e 65 77 2c 20 70 2d  memcpy(paNew, p-
24f00 3e 61 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28  >aLTerm, sizeof(
24f10 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d  p->aLTerm[0])*p-
24f20 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20  >nLSlot);.  if( 
24f30 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c  p->aLTerm!=p->aL
24f40 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69  TermSpace ) sqli
24f50 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
24f60 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61  >aLTerm);.  p->a
24f70 4c 54 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20  LTerm = paNew;. 
24f80 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a   p->nLSlot = n;.
24f90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24fa0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61  OK;.}../*.** Tra
24fb0 6e 73 66 65 72 20 63 6f 6e 74 65 6e 74 20 66 72  nsfer content fr
24fc0 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 70 4c  om the second pL
24fd0 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 66 69 72  oop into the fir
24fe0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
24ff0 74 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28  t whereLoopXfer(
25000 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
25010 72 65 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65  reLoop *pTo, Whe
25020 72 65 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a  reLoop *pFrom){.
25030 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
25040 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a  Union(db, pTo);.
25050 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
25060 65 73 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70  esize(db, pTo, p
25070 46 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b  From->nLTerm) ){
25080 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 54 6f  .    memset(&pTo
25090 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ->u, 0, sizeof(p
250a0 54 6f 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65 74  To->u));.    ret
250b0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
250c0 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70  ;.  }.  memcpy(p
250d0 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45  To, pFrom, WHERE
250e0 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a  _LOOP_XFER_SZ);.
250f0 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c    memcpy(pTo->aL
25100 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54  Term, pFrom->aLT
25110 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d  erm, pTo->nLTerm
25120 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54  *sizeof(pTo->aLT
25130 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  erm[0]));.  if( 
25140 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26  pFrom->wsFlags &
25150 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
25160 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d  BLE ){.    pFrom
25170 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
25180 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 0;.  }else i
25190 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61  f( (pFrom->wsFla
251a0 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
251b0 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20  INDEX)!=0 ){.   
251c0 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e   pFrom->u.btree.
251d0 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  pIndex = 0;.  }.
251e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
251f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  OK;.}../*.** Del
25200 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  ete a WhereLoop 
25210 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63  object.*/.static
25220 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44   void whereLoopD
25230 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
25240 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
25250 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  {.  whereLoopCle
25260 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c  ar(db, p);.  sql
25270 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
25280 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
25290 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72   a WhereInfo str
252a0 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63  ucture.*/.static
252b0 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46   void whereInfoF
252c0 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ree(sqlite3 *db,
252d0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
252e0 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59  fo){.  if( ALWAY
252f0 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20  S(pWInfo) ){.   
25300 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
25310 72 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b  r(&pWInfo->sWC);
25320 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e  .    while( pWIn
25330 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20 20  fo->pLoops ){.  
25340 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
25350 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70   = pWInfo->pLoop
25360 73 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  s;.      pWInfo-
25370 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65  >pLoops = p->pNe
25380 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77 68  xtLoop;.      wh
25390 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62  ereLoopDelete(db
253a0 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , p);.    }.    
253b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
253c0 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  , pWInfo);.  }.}
253d0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f  ../*.** Insert o
253e0 72 20 72 65 70 6c 61 63 65 20 61 20 57 68 65 72  r replace a Wher
253f0 65 4c 6f 6f 70 20 65 6e 74 72 79 20 75 73 69 6e  eLoop entry usin
25400 67 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 73  g the template s
25410 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  upplied..**.** A
25420 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  n existing Where
25430 4c 6f 6f 70 20 65 6e 74 72 79 20 6d 69 67 68 74  Loop entry might
25440 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
25450 69 66 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c  if the new templ
25460 61 74 65 0a 2a 2a 20 69 73 20 62 65 74 74 65 72  ate.** is better
25470 20 61 6e 64 20 68 61 73 20 66 65 77 65 72 20 64   and has fewer d
25480 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72  ependencies.  Or
25490 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 77 69   the template wi
254a0 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a  ll be ignored.**
254b0 20 61 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20 77   and no insert w
254c0 69 6c 6c 20 6f 63 63 75 72 20 69 66 20 61 6e 20  ill occur if an 
254d0 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
254e0 6f 70 20 69 73 20 66 61 73 74 65 72 20 61 6e 64  op is faster and
254f0 20 68 61 73 0a 2a 2a 20 66 65 77 65 72 20 64 65   has.** fewer de
25500 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20  pendencies than 
25510 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f  the template.  O
25520 74 68 65 72 77 69 73 65 20 61 20 6e 65 77 20 57  therwise a new W
25530 68 65 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61  hereLoop is.** a
25540 64 64 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  dded based on th
25550 65 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a  e template..**.*
25560 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70  * If pBuilder->p
25570 4f 72 53 65 74 20 69 73 20 6e 6f 74 20 4e 55 4c  OrSet is not NUL
25580 4c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 63  L then we only c
25590 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79 20 74  are about only t
255a0 68 65 0a 2a 2a 20 70 72 65 72 65 71 75 69 73 69  he.** prerequisi
255b0 74 65 73 20 61 6e 64 20 72 52 75 6e 20 61 6e 64  tes and rRun and
255c0 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66 20 74   nOut costs of t
255d0 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70 73 2e  he N best loops.
255e0 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d    That.** inform
255f0 61 74 69 6f 6e 20 69 73 20 67 61 74 68 65 72 65  ation is gathere
25600 64 20 69 6e 20 74 68 65 20 70 42 75 69 6c 64 65  d in the pBuilde
25610 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65 63 74  r->pOrSet object
25620 2e 20 20 54 68 69 73 20 73 70 65 63 69 61 6c 0a  .  This special.
25630 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 6d 6f  ** processing mo
25640 64 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  de is used only 
25650 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72  for OR clause pr
25660 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
25670 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e  When accumulatin
25680 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73  g multiple loops
25690 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65 72 2d   (when pBuilder-
256a0 3e 70 4f 72 53 65 74 20 69 73 20 4e 55 4c 4c 29  >pOrSet is NULL)
256b0 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67   we.** still mig
256c0 68 74 20 6f 76 65 72 77 72 69 74 65 20 73 69 6d  ht overwrite sim
256d0 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74 68 20  ilar loops with 
256e0 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65  the new template
256f0 20 69 66 20 74 68 65 0a 2a 2a 20 74 65 6d 70 6c   if the.** templ
25700 61 74 65 20 69 73 20 62 65 74 74 65 72 2e 20 20  ate is better.  
25710 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20 6f 76 65  Loops may be ove
25720 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20  rwritten if the 
25730 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f  following .** co
25740 6e 64 69 74 69 6f 6e 73 20 61 72 65 20 6d 65 74  nditions are met
25750 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
25760 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61  They have the sa
25770 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20 28  me iTab..**    (
25780 32 29 20 20 54 68 65 79 20 68 61 76 65 20 74 68  2)  They have th
25790 65 20 73 61 6d 65 20 69 53 6f 72 74 49 64 78 2e  e same iSortIdx.
257a0 0a 2a 2a 20 20 20 20 28 33 29 20 20 54 68 65 20  .**    (3)  The 
257b0 74 65 6d 70 6c 61 74 65 20 68 61 73 20 73 61 6d  template has sam
257c0 65 20 6f 72 20 66 65 77 65 72 20 64 65 70 65 6e  e or fewer depen
257d0 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65  dencies than the
257e0 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a   current loop.**
257f0 20 20 20 20 28 34 29 20 20 54 68 65 20 74 65 6d      (4)  The tem
25800 70 6c 61 74 65 20 68 61 73 20 74 68 65 20 73 61  plate has the sa
25810 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74  me or lower cost
25820 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
25830 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 35 29  t loop.**    (5)
25840 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 75    The template u
25850 73 65 73 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f  ses more terms o
25860 66 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78  f the same index
25870 20 62 75 74 20 68 61 73 20 6e 6f 20 61 64 64 69   but has no addi
25880 74 69 6f 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  tional.**       
25890 20 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 20    dependencies  
258a0 20 20 20 20 20 20 20 20 0a 2a 2f 0a 73 74 61 74          .*/.stat
258b0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
258c0 49 6e 73 65 72 74 28 57 68 65 72 65 4c 6f 6f 70  Insert(WhereLoop
258d0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
258e0 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  r, WhereLoop *pT
258f0 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68 65 72  emplate){.  Wher
25900 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 20  eLoop **ppPrev, 
25910 2a 70 2c 20 2a 70 4e 65 78 74 20 3d 20 30 3b 0a  *p, *pNext = 0;.
25920 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
25930 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
25940 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65  pWInfo;.  sqlite
25950 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
25960 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
25970 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70  * If pBuilder->p
25980 4f 72 53 65 74 20 69 73 20 64 65 66 69 6e 65 64  OrSet is defined
25990 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b 65 65 70  , then only keep
259a0 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 63 6f   track of the co
259b0 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 70 72 65  sts.  ** and pre
259c0 72 65 71 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  reqs..  */.  if(
259d0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
259e0 74 21 3d 30 20 29 7b 0a 23 69 66 20 57 48 45 52  t!=0 ){.#if WHER
259f0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
25a00 20 20 20 75 31 36 20 6e 20 3d 20 70 42 75 69 6c     u16 n = pBuil
25a10 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a  der->pOrSet->n;.
25a20 20 20 20 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64      int x =.#end
25a30 69 66 0a 20 20 20 20 77 68 65 72 65 4f 72 49 6e  if.    whereOrIn
25a40 73 65 72 74 28 70 42 75 69 6c 64 65 72 2d 3e 70  sert(pBuilder->p
25a50 4f 72 53 65 74 2c 20 70 54 65 6d 70 6c 61 74 65  OrSet, pTemplate
25a60 2d 3e 70 72 65 72 65 71 2c 20 70 54 65 6d 70 6c  ->prereq, pTempl
25a70 61 74 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20  ate->rRun,.     
25a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
25aa0 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b  Template->nOut);
25ab0 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
25ac0 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20  ENABLED.    if( 
25ad0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
25ae0 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20  e & 0x8 ){.     
25af0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
25b00 6e 74 66 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a  ntf(x?"   or-%d:
25b10 20 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22    ":"   or-X:  "
25b20 2c 20 6e 29 3b 0a 20 20 20 20 20 20 77 68 65 72  , n);.      wher
25b30 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
25b40 6c 61 74 65 2c 20 70 57 49 6e 66 6f 2d 3e 70 54  late, pWInfo->pT
25b50 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 23  abList);.    }.#
25b60 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
25b70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
25b80 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
25b90 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   an existing Whe
25ba0 72 65 4c 6f 6f 70 20 74 6f 20 6f 76 65 72 77 72  reLoop to overwr
25bb0 69 74 65 2c 20 6f 72 20 77 68 69 63 68 20 74 61  ite, or which ta
25bc0 6b 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 69 74  kes.  ** priorit
25bd0 79 20 6f 76 65 72 20 70 54 65 6d 70 6c 61 74 65  y over pTemplate
25be0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 70 50  ..  */.  for(ppP
25bf0 72 65 76 3d 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f  rev=&pWInfo->pLo
25c00 6f 70 73 2c 20 70 3d 2a 70 70 50 72 65 76 3b 20  ops, p=*ppPrev; 
25c10 70 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e  p; ppPrev=&p->pN
25c20 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72  extLoop, p=*ppPr
25c30 65 76 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ev){.    if( p->
25c40 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d  iTab!=pTemplate-
25c50 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72  >iTab || p->iSor
25c60 74 49 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d  tIdx!=pTemplate-
25c70 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20  >iSortIdx ){.   
25c80 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20     /* If either 
25c90 74 68 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72  the iTab or iSor
25ca0 74 49 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20  tIdx values for 
25cb0 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72  two WhereLoop ar
25cc0 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20  e different.    
25cd0 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20    ** then those 
25ce0 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20  WhereLoops need 
25cf0 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  to be considered
25d00 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65   separately.  Ne
25d10 69 74 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a  ither is.      *
25d20 2a 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  * a candidate to
25d30 20 72 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68   replace the oth
25d40 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  er. */.      con
25d50 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
25d60 20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65   /* In the curre
25d70 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
25d80 6e 2c 20 74 68 65 20 72 53 65 74 75 70 20 76 61  n, the rSetup va
25d90 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 7a 65  lue is either ze
25da0 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65  ro.    ** or the
25db0 20 63 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e   cost of buildin
25dc0 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  g an automatic i
25dd0 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64  ndex (NlogN) and
25de0 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a   the NlogN.    *
25df0 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f  * is the same fo
25e00 72 20 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65  r compatible Whe
25e10 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20  reLoops. */.    
25e20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
25e30 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74  p==0 || pTemplat
25e40 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20  e->rSetup==0 .  
25e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
25e60 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65  | p->rSetup==pTe
25e70 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
25e80 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72 65 4c  ;..    /* whereL
25e90 6f 6f 70 41 64 64 42 74 72 65 65 28 29 20 61 6c  oopAddBtree() al
25ea0 77 61 79 73 20 67 65 6e 65 72 61 74 65 73 20 61  ways generates a
25eb0 6e 64 20 69 6e 73 65 72 74 73 20 74 68 65 20 61  nd inserts the a
25ec0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20  utomatic index. 
25ed0 20 20 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74     ** case first
25ee0 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69  .  Hence compati
25ef0 62 6c 65 20 63 61 6e 64 69 64 61 74 65 20 57 68  ble candidate Wh
25f00 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68  ereLoops never h
25f10 61 76 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20  ave a larger.   
25f20 20 2a 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c   ** rSetup. Call
25f30 20 74 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41   this SETUP-INVA
25f40 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73  RIANT */.    ass
25f50 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d  ert( p->rSetup>=
25f60 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
25f70 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 28 70  p );..    if( (p
25f80 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70  ->prereq & pTemp
25f90 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70  late->prereq)==p
25fa0 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20 26 26  ->prereq.     &&
25fb0 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d   p->rSetup<=pTem
25fc0 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 0a 20 20  plate->rSetup.  
25fd0 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70     && p->rRun<=p
25fe0 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 0a 20  Template->rRun. 
25ff0 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d      && p->nOut<=
26000 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 0a  pTemplate->nOut.
26010 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
26020 54 68 69 73 20 62 72 61 6e 63 68 20 74 61 6b 65  This branch take
26030 6e 20 77 68 65 6e 20 70 20 69 73 20 65 71 75 61  n when p is equa
26040 6c 20 6f 72 20 62 65 74 74 65 72 20 74 68 61 6e  l or better than
26050 20 70 54 65 6d 70 6c 61 74 65 20 69 6e 20 0a 20   pTemplate in . 
26060 20 20 20 20 20 2a 2a 20 61 6c 6c 20 6f 66 20 28       ** all of (
26070 31 29 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  1) dependencies 
26080 28 32 29 20 73 65 74 75 70 2d 63 6f 73 74 2c 20  (2) setup-cost, 
26090 28 33 29 20 72 75 6e 2d 63 6f 73 74 2c 20 61 6e  (3) run-cost, an
260a0 64 0a 20 20 20 20 20 20 2a 2a 20 28 34 29 20 6e  d.      ** (4) n
260b0 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
260c0 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61  rows. */.      a
260d0 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
260e0 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  ==pTemplate->rSe
260f0 74 75 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28  tup );.      if(
26100 20 70 2d 3e 70 72 65 72 65 71 3d 3d 70 54 65 6d   p->prereq==pTem
26110 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20  plate->prereq.  
26120 20 20 20 20 20 26 26 20 70 2d 3e 6e 4c 54 65 72       && p->nLTer
26130 6d 3c 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54  m<pTemplate->nLT
26140 65 72 6d 0a 20 20 20 20 20 20 20 26 26 20 28 70  erm.       && (p
26150 2d 3e 77 73 46 6c 61 67 73 20 26 20 70 54 65 6d  ->wsFlags & pTem
26160 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26  plate->wsFlags &
26170 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
26180 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70 2d  =0.       && (p-
26190 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3d  >u.btree.pIndex=
261a0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 75 2e 62 74  =pTemplate->u.bt
261b0 72 65 65 2e 70 49 6e 64 65 78 0a 20 20 20 20 20  ree.pIndex.     
261c0 20 20 20 20 20 7c 7c 20 70 54 65 6d 70 6c 61 74       || pTemplat
261d0 65 2d 3e 72 52 75 6e 2b 70 2d 3e 6e 4c 54 65 72  e->rRun+p->nLTer
261e0 6d 3c 3d 70 2d 3e 72 52 75 6e 2b 70 54 65 6d 70  m<=p->rRun+pTemp
261f0 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 29 0a 20 20  late->nLTerm).  
26200 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
26210 2a 20 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65  * Overwrite an e
26220 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
26230 70 20 77 69 74 68 20 61 6e 20 73 69 6d 69 6c 61  p with an simila
26240 72 20 6f 6e 65 20 74 68 61 74 20 75 73 65 73 0a  r one that uses.
26250 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 72 65 20          ** more 
26260 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64  terms of the ind
26270 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  ex */.        pN
26280 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f  ext = p->pNextLo
26290 6f 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  op;.        brea
262a0 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
262b0 20 20 20 20 20 20 20 20 2f 2a 20 70 54 65 6d 70          /* pTemp
262c0 6c 61 74 65 20 69 73 20 6e 6f 74 20 68 65 6c 70  late is not help
262d0 66 75 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ful..        ** 
262e0 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 63  Return without c
262f0 68 61 6e 67 69 6e 67 20 6f 72 20 61 64 64 69 6e  hanging or addin
26300 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  g anything */.  
26310 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
26320 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3b  LoopInsert_noop;
26330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
26340 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
26350 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q & pTemplate->p
26360 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74  rereq)==pTemplat
26370 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20 26  e->prereq.     &
26380 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70  & p->rRun>=pTemp
26390 6c 61 74 65 2d 3e 72 52 75 6e 0a 20 20 20 20 20  late->rRun.     
263a0 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d  && p->nOut>=pTem
263b0 70 6c 61 74 65 2d 3e 6e 4f 75 74 0a 20 20 20 20  plate->nOut.    
263c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 76 65 72  ){.      /* Over
263d0 77 72 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e  write an existin
263e0 67 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68  g WhereLoop with
263f0 20 61 20 62 65 74 74 65 72 20 6f 6e 65 3a 20 6f   a better one: o
26400 6e 65 20 74 68 61 74 20 69 73 0a 20 20 20 20 20  ne that is.     
26410 20 2a 2a 20 62 65 74 74 65 72 20 61 74 20 6f 6e   ** better at on
26420 65 20 6f 66 20 28 31 29 20 64 65 70 65 6e 64 65  e of (1) depende
26430 6e 63 69 65 73 2c 20 28 32 29 20 73 65 74 75 70  ncies, (2) setup
26440 2d 63 6f 73 74 2c 20 28 33 29 20 72 75 6e 2d 63  -cost, (3) run-c
26450 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  ost.      ** or 
26460 28 34 29 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  (4) number of ou
26470 74 70 75 74 20 72 6f 77 73 2c 20 61 6e 64 20 69  tput rows, and i
26480 73 20 6e 6f 20 77 6f 72 73 65 20 69 6e 20 61 6e  s no worse in an
26490 79 20 6f 66 20 74 68 6f 73 65 0a 20 20 20 20 20  y of those.     
264a0 20 2a 2a 20 63 61 74 65 67 6f 72 69 65 73 2e 20   ** categories. 
264b0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
264c0 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d   p->rSetup>=pTem
264d0 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
264e0 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41 52 49   /* SETUP-INVARI
264f0 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20  ANT above */.   
26500 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
26510 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 62  extLoop;.      b
26520 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
26530 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
26540 68 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  h this point it 
26550 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65  means that eithe
26560 72 20 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  r p[] should be 
26570 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a  overwritten.  **
26580 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b   with pTemplate[
26590 5d 20 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c  ] if p[] exists,
265a0 20 6f 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74   or if p==NULL t
265b0 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e  hen allocate a n
265c0 65 77 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f  ew.  ** WhereLoo
265d0 70 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e  p and insert it.
265e0 0a 20 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54  .  */.#if WHERET
265f0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
26600 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
26610 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20  race & 0x8 ){.  
26620 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20    if( p!=0 ){.  
26630 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
26640 50 72 69 6e 74 66 28 22 69 6e 73 2d 64 65 6c 3a  Printf("ins-del:
26650 20 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72    ");.      wher
26660 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 57  eLoopPrint(p, pW
26670 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b  Info->pTabList);
26680 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
26690 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69  e3DebugPrintf("i
266a0 6e 73 2d 6e 65 77 3a 20 20 22 29 3b 0a 20 20 20  ns-new:  ");.   
266b0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
266c0 70 54 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e 66  pTemplate, pWInf
266d0 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20  o->pTabList);.  
266e0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
266f0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 20 3d 20 73  ==0 ){.    p = s
26700 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
26710 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 57 68 65  w(db, sizeof(Whe
26720 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20 20 69 66  reLoop));.    if
26730 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
26740 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
26750 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
26760 70 29 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c  p);.  }.  whereL
26770 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70  oopXfer(db, p, p
26780 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70 2d 3e  Template);.  p->
26790 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 70 4e 65 78  pNextLoop = pNex
267a0 74 3b 0a 20 20 2a 70 70 50 72 65 76 20 3d 20 70  t;.  *ppPrev = p
267b0 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  ;.  if( (p->wsFl
267c0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
267d0 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a  UALTABLE)==0 ){.
267e0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65      Index *pInde
267f0 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  x = p->u.btree.p
26800 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
26810 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d  Index && pIndex-
26820 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  >tnum==0 ){.    
26830 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e    p->u.btree.pIn
26840 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  dex = 0;.    }. 
26850 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
26860 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
26870 70 20 68 65 72 65 20 69 66 20 74 68 65 20 69 6e  p here if the in
26880 73 65 72 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20  sert is a no-op 
26890 2a 2f 0a 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65  */.whereLoopInse
268a0 72 74 5f 6e 6f 6f 70 3a 0a 23 69 66 20 57 48 45  rt_noop:.#if WHE
268b0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
268c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
268d0 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
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 6f 6f  gPrintf("ins-noo
26900 70 3a 20 22 29 3b 0a 20 20 20 20 77 68 65 72 65  p: ");.    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 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
26950 54 45 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  TE_OK;  .}../*.*
26960 2a 20 41 64 6a 75 73 74 20 74 68 65 20 57 68 65  * Adjust the Whe
26970 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75  reLoop.nOut valu
26980 65 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63  e downward to ac
26990 63 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20  count for terms 
269a0 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  of the.** WHERE 
269b0 63 6c 61 75 73 65 20 74 68 61 74 20 72 65 66 65  clause that refe
269c0 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62  rence the loop b
269d0 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
269e0 20 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69   used by an.** i
269f0 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ndex..**.** In t
26a00 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
26a10 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 66  mentation, the f
26a20 69 72 73 74 20 65 78 74 72 61 20 57 48 45 52 45  irst extra WHERE
26a30 20 63 6c 61 75 73 65 20 74 65 72 6d 20 72 65 64   clause term red
26a40 75 63 65 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  uces.** the numb
26a50 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
26a60 73 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66  s by a factor of
26a70 20 31 30 20 61 6e 64 20 65 61 63 68 20 61 64 64   10 and each add
26a80 69 74 69 6f 6e 61 6c 20 74 65 72 6d 0a 2a 2a 20  itional term.** 
26a90 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
26aa0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
26ab0 73 20 62 79 20 73 71 72 74 28 32 29 2e 0a 2a 2f  s by sqrt(2)..*/
26ac0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
26ad0 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
26ae0 73 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  st(WhereClause *
26af0 70 57 43 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  pWC, WhereLoop *
26b00 70 4c 6f 6f 70 29 7b 0a 20 20 57 68 65 72 65 54  pLoop){.  WhereT
26b10 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58 3b  erm *pTerm, *pX;
26b20 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41 6c  .  Bitmask notAl
26b30 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d  lowed = ~(pLoop-
26b40 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d  >prereq|pLoop->m
26b50 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74 20  askSelf);.  int 
26b60 69 2c 20 6a 3b 0a 0a 20 20 69 66 28 20 21 4f 70  i, j;..  if( !Op
26b70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
26b80 64 28 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  d(pWC->pWInfo->p
26b90 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54  Parse->db, SQLIT
26ba0 45 5f 41 64 6a 75 73 74 4f 75 74 45 73 74 29 20  E_AdjustOutEst) 
26bb0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
26bc0 20 7d 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e   }.  for(i=pWC->
26bd0 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43  nTerm, pTerm=pWC
26be0 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
26bf0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
26c00 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
26c10 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29   & TERM_VIRTUAL)
26c20 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
26c30 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
26c40 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e  reqAll & pLoop->
26c50 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63  maskSelf)==0 ) c
26c60 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
26c70 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
26c80 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29  ll & notAllowed)
26c90 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
26ca0 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d      for(j=pLoop-
26cb0 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b  >nLTerm-1; j>=0;
26cc0 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20   j--){.      pX 
26cd0 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
26ce0 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  j];.      if( pX
26cf0 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b  ==pTerm ) break;
26d00 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 69  .      if( pX->i
26d10 50 61 72 65 6e 74 3e 3d 30 20 26 26 20 28 26 70  Parent>=0 && (&p
26d20 57 43 2d 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e  WC->a[pX->iParen
26d30 74 5d 29 3d 3d 70 54 65 72 6d 20 29 20 62 72 65  t])==pTerm ) bre
26d40 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
26d50 28 20 6a 3c 30 20 29 20 70 4c 6f 6f 70 2d 3e 6e  ( j<0 ) pLoop->n
26d60 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72  Out += pTerm->tr
26d70 75 74 68 50 72 6f 62 3b 0a 20 20 7d 0a 7d 0a 0a  uthProb;.  }.}..
26d80 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f  /*.** We have so
26d90 20 66 61 72 20 6d 61 74 63 68 65 64 20 70 42 75   far matched pBu
26da0 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
26db0 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f  tree.nEq terms o
26dc0 66 20 74 68 65 20 69 6e 64 65 78 20 70 49 6e 64  f the index pInd
26dd0 65 78 2e 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 61  ex..** Try to ma
26de0 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a  tch one more..**
26df0 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74  .** If pProbe->t
26e00 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61  num==0, that mea
26e10 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66  ns pIndex is a f
26e20 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66  ake index used f
26e30 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  or the.** INTEGE
26e40 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
26e50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
26e60 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
26e70 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  dex(.  WhereLoop
26e80 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
26e90 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  r,     /* The Wh
26ea0 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20  ereLoop factory 
26eb0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
26ec0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
26ed0 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
26ee0 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61  use term being a
26ef0 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64  nalyzed */.  Ind
26f00 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20  ex *pProbe,     
26f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26f20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63  An index on pSrc
26f30 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e   */.  LogEst nIn
26f40 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Mul             
26f50 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d        /* log(Num
26f60 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
26f70 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a  s due to IN) */.
26f80 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
26f90 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
26fa0 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57  r->pWInfo;  /* W
26fb0 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e  HERE analyse con
26fc0 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
26fd0 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
26fe0 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20  ->pParse;       
26ff0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
27000 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
27010 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
27020 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b;       /* Data
27030 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
27040 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a  malloc context *
27050 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
27060 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
27070 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
27080 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20  WhereLoop under 
27090 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
270a0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
270b0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
270c0 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d    /* A WhereTerm
270d0 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61   under considera
270e0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
270f0 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
27100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
27110 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72  id operators for
27120 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
27130 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
27140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27150 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
27160 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f  r WHERE terms */
27170 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64  .  Bitmask saved
27180 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 20  _prereq;        
27190 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
271a0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72  alue of pNew->pr
271b0 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61  ereq */.  u16 sa
271c0 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20  ved_nLTerm;     
271d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
271e0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
271f0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20  New->nLTerm */. 
27200 20 69 6e 74 20 73 61 76 65 64 5f 6e 45 71 3b 20   int saved_nEq; 
27210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27220 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
27230 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74  ue of pNew->u.bt
27240 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 33 32  ree.nEq */.  u32
27250 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 20   saved_wsFlags; 
27260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27270 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
27280 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  f pNew->wsFlags 
27290 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73 61 76 65  */.  LogEst save
272a0 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20  d_nOut;         
272b0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
272c0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
272d0 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43  nOut */.  int iC
272e0 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
272f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
27300 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
27310 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
27320 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
27330 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
27340 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
27350 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 52  e */.  LogEst nR
27360 6f 77 45 73 74 3b 20 20 20 20 20 20 20 20 20 20  owEst;          
27370 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61         /* Estima
27380 74 65 64 20 69 6e 64 65 78 20 73 65 6c 65 63 74  ted index select
27390 69 76 69 74 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  ivity */.  LogEs
273a0 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20  t rLogSize;     
273b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
273c0 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65  garithm of table
273d0 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65   size */.  Where
273e0 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20  Term *pTop = 0, 
273f0 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f  *pBtm = 0; /* To
27400 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e  p and bottom ran
27410 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ge constraints *
27420 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  /..  pNew = pBui
27430 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66  lder->pNew;.  if
27440 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
27450 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ed ) return SQLI
27460 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73  TE_NOMEM;..  ass
27470 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c  ert( (pNew->wsFl
27480 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
27490 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a  UALTABLE)==0 );.
274a0 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d    assert( (pNew-
274b0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
274c0 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29  _TOP_LIMIT)==0 )
274d0 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73  ;.  if( pNew->ws
274e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
274f0 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f  M_LIMIT ){.    o
27500 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f  pMask = WO_LT|WO
27510 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _LE;.  }else if(
27520 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30   pProbe->tnum<=0
27530 20 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74   || (pSrc->joint
27540 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
27550 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  0 ){.    opMask 
27560 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  = WO_EQ|WO_IN|WO
27570 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c  _GT|WO_GE|WO_LT|
27580 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  WO_LE;.  }else{.
27590 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
275a0 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55  EQ|WO_IN|WO_ISNU
275b0 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57  LL|WO_GT|WO_GE|W
275c0 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 0a  O_LT|WO_LE;.  }.
275d0 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55    if( pProbe->bU
275e0 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73  nordered ) opMas
275f0 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f  k &= ~(WO_GT|WO_
27600 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b  GE|WO_LT|WO_LE);
27610 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
27620 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70  ->u.btree.nEq<=p
27630 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 20 29  Probe->nKeyCol )
27640 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e  ;.  if( pNew->u.
27650 62 74 72 65 65 2e 6e 45 71 20 3c 20 70 50 72 6f  btree.nEq < pPro
27660 62 65 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20  be->nKeyCol ){. 
27670 20 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65     iCol = pProbe
27680 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77 2d  ->aiColumn[pNew-
27690 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b 0a 20  >u.btree.nEq];. 
276a0 20 20 20 6e 52 6f 77 45 73 74 20 3d 20 73 71 6c     nRowEst = sql
276b0 69 74 65 33 4c 6f 67 45 73 74 28 70 50 72 6f 62  ite3LogEst(pProb
276c0 65 2d 3e 61 69 52 6f 77 45 73 74 5b 70 4e 65 77  e->aiRowEst[pNew
276d0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 31 5d  ->u.btree.nEq+1]
276e0 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45  );.    if( nRowE
276f0 73 74 3d 3d 30 20 26 26 20 70 50 72 6f 62 65 2d  st==0 && pProbe-
27700 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e  >onError==OE_Non
27710 65 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 31 3b  e ) nRowEst = 1;
27720 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 43  .  }else{.    iC
27730 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 6e 52 6f  ol = -1;.    nRo
27740 77 45 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  wEst = 0;.  }.  
27750 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61  pTerm = whereSca
27760 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 42 75  nInit(&scan, pBu
27770 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53 72 63  ilder->pWC, pSrc
27780 2d 3e 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c 2c  ->iCursor, iCol,
27790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
277a0 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c           opMask,
277b0 20 70 50 72 6f 62 65 29 3b 0a 20 20 73 61 76 65   pProbe);.  save
277c0 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e  d_nEq = pNew->u.
277d0 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76  btree.nEq;.  sav
277e0 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77  ed_nLTerm = pNew
277f0 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65  ->nLTerm;.  save
27800 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77  d_wsFlags = pNew
27810 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76  ->wsFlags;.  sav
27820 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77  ed_prereq = pNew
27830 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65  ->prereq;.  save
27840 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e  d_nOut = pNew->n
27850 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65  Out;.  pNew->rSe
27860 74 75 70 20 3d 20 30 3b 0a 20 20 72 4c 6f 67 53  tup = 0;.  rLogS
27870 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 73 71 6c  ize = estLog(sql
27880 69 74 65 33 4c 6f 67 45 73 74 28 70 50 72 6f 62  ite3LogEst(pProb
27890 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 29 29  e->aiRowEst[0]))
278a0 3b 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51  ;.  for(; rc==SQ
278b0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d  LITE_OK && pTerm
278c0 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77 68 65  !=0; pTerm = whe
278d0 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e  reScanNext(&scan
278e0 29 29 7b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20  )){.    int nIn 
278f0 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
27900 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
27910 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74  OR_STAT4.    int
27920 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75   nRecValid = pBu
27930 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
27940 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
27950 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
27960 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c  or==WO_ISNULL ||
27970 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
27980 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29  &TERM_VNULL)!=0)
27990 0a 20 20 20 20 20 26 26 20 28 69 43 6f 6c 3c 30  .     && (iCol<0
279a0 20 7c 7c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e   || pSrc->pTab->
279b0 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
279c0 6c 6c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ll).    ){.     
279d0 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67   continue; /* ig
279e0 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55  nore IS [NOT] NU
279f0 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  LL constraints o
27a00 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d  n NOT NULL colum
27a10 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ns */.    }.    
27a20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
27a30 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d  qRight & pNew->m
27a40 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e  askSelf ) contin
27a50 75 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ue;..    assert(
27a60 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76   pNew->nOut==sav
27a70 65 64 5f 6e 4f 75 74 20 29 3b 0a 0a 20 20 20 20  ed_nOut );..    
27a80 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
27a90 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
27aa0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
27ab0 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71  .nEq = saved_nEq
27ac0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ;.    pNew->nLTe
27ad0 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72  rm = saved_nLTer
27ae0 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65  m;.    if( where
27af0 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
27b00 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  New, pNew->nLTer
27b10 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a  m+1) ) break; /*
27b20 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77   OOM */.    pNew
27b30 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
27b40 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d  LTerm++] = pTerm
27b50 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
27b60 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72 65 72  eq = (saved_prer
27b70 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72  eq | pTerm->prer
27b80 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e 65 77  eqRight) & ~pNew
27b90 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
27ba0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 4c 6f  pNew->rRun = rLo
27bb0 67 53 69 7a 65 3b 20 2f 2a 20 42 61 73 65 6c 69  gSize; /* Baseli
27bc0 6e 65 20 63 6f 73 74 20 69 73 20 6c 6f 67 32 28  ne cost is log2(
27bd0 4e 29 2e 20 20 41 64 6a 75 73 74 6d 65 6e 74 73  N).  Adjustments
27be0 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 69 66   below */.    if
27bf0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
27c00 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20  or & WO_IN ){.  
27c10 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
27c20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
27c30 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
27c40 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
27c50 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66  UMN_IN;.      if
27c60 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
27c70 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
27c80 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
27c90 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45    /* "x IN (SELE
27ca0 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e  CT ...)":  TUNIN
27cb0 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  G: the SELECT re
27cc0 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f  turns 25 rows */
27cd0 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34  .        nIn = 4
27ce0 36 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d  6;  assert( 46==
27cf0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35  sqlite3LogEst(25
27d00 29 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ) );.      }else
27d10 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
27d20 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45  r->x.pList && pE
27d30 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
27d40 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
27d50 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c  /* "x IN (value,
27d60 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f   value, ...)" */
27d70 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73  .        nIn = s
27d80 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78  qlite3LogEst(pEx
27d90 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
27da0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
27db0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d     pNew->rRun +=
27dc0 20 6e 49 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77   nIn;.      pNew
27dd0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b  ->u.btree.nEq++;
27de0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
27df0 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49  t = nRowEst + nI
27e00 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20  nMul + nIn;.    
27e10 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d  }else if( pTerm-
27e20 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
27e30 5f 45 51 29 20 29 7b 0a 20 20 20 20 20 20 61 73  _EQ) ){.      as
27e40 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46  sert( (pNew->wsF
27e50 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f  lags & (WHERE_CO
27e60 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52 45 5f  LUMN_NULL|WHERE_
27e70 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d 30 0a 20  COLUMN_IN))!=0. 
27e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e90 20 7c 7c 20 6e 49 6e 4d 75 6c 3d 3d 30 20 29 3b   || nInMul==0 );
27ea0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
27eb0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
27ec0 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69  LUMN_EQ;.      i
27ed0 66 28 20 69 43 6f 6c 3c 30 20 20 0a 20 20 20 20  f( iCol<0  .    
27ee0 20 20 20 7c 7c 20 28 70 50 72 6f 62 65 2d 3e 6f     || (pProbe->o
27ef0 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
27f00 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20  && nInMul==0.   
27f10 20 20 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d          && pNew-
27f20 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 70 50  >u.btree.nEq==pP
27f30 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29  robe->nKeyCol-1)
27f40 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
27f50 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d    assert( (pNew-
27f60 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
27f70 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20 7c  _COLUMN_IN)==0 |
27f80 7c 20 69 43 6f 6c 3c 30 20 29 3b 0a 20 20 20 20  | iCol<0 );.    
27f90 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
27fa0 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f  s |= WHERE_ONERO
27fb0 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  W;.      }.     
27fc0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
27fd0 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77  Eq++;.      pNew
27fe0 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74  ->nOut = nRowEst
27ff0 20 2b 20 6e 49 6e 4d 75 6c 3b 0a 20 20 20 20 7d   + nInMul;.    }
28000 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e  else if( pTerm->
28010 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
28020 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  ISNULL) ){.     
28030 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
28040 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e  = WHERE_COLUMN_N
28050 55 4c 4c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ULL;.      pNew-
28060 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a  >u.btree.nEq++;.
28070 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
28080 20 49 53 20 4e 55 4c 4c 20 73 65 6c 65 63 74 73   IS NULL selects
28090 20 32 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20   2 rows */.     
280a0 20 6e 49 6e 20 3d 20 31 30 3b 20 20 61 73 73 65   nIn = 10;  asse
280b0 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 10==sqlite3L
280c0 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20  ogEst(2) );.    
280d0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e    pNew->nOut = n
280e0 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 20  RowEst + nInMul 
280f0 2b 20 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65  + nIn;.    }else
28100 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
28110 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57  rator & (WO_GT|W
28120 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74  O_GE) ){.      t
28130 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
28140 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
28150 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
28160 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
28170 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b  rator & WO_GE );
28180 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
28190 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
281a0 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45  LUMN_RANGE|WHERE
281b0 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _BTM_LIMIT;.    
281c0 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a    pBtm = pTerm;.
281d0 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a        pTop = 0;.
281e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
281f0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
28200 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
28210 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20  LT|WO_LE) );.   
28220 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
28230 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
28240 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74  WO_LT );.      t
28250 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
28260 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
28270 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E );.      pNew-
28280 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
28290 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
282a0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a  HERE_TOP_LIMIT;.
282b0 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65        pTop = pTe
282c0 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d  rm;.      pBtm =
282d0 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
282e0 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
282f0 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20  T)!=0 ?.        
28300 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
28310 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e  w->aLTerm[pNew->
28320 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20  nLTerm-2] : 0;. 
28330 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4e 65     }.    if( pNe
28340 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
28350 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
28360 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  ){.      /* Adju
28370 73 74 20 6e 4f 75 74 20 61 6e 64 20 72 52 75 6e  st nOut and rRun
28380 20 66 6f 72 20 53 54 41 54 33 20 72 61 6e 67 65   for STAT3 range
28390 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 20   values */.     
283a0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
283b0 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20  Out==saved_nOut 
283c0 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 52 61  );.      whereRa
283d0 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61 72 73  ngeScanEst(pPars
283e0 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 42 74  e, pBuilder, pBt
283f0 6d 2c 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b 0a  m, pTop, pNew);.
28400 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
28410 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
28420 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69 66  _OR_STAT4.    if
28430 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20  ( nInMul==0 .   
28440 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61    && pProbe->nSa
28450 6d 70 6c 65 20 0a 20 20 20 20 20 26 26 20 70 4e  mple .     && pN
28460 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
28470 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65  =pProbe->nSample
28480 43 6f 6c 0a 20 20 20 20 20 26 26 20 4f 70 74 69  Col.     && Opti
28490 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
284a0 64 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74 33  db, SQLITE_Stat3
284b0 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
284c0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
284d0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
284e0 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d    tRowcnt nOut =
284f0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   0;.      if( (p
28500 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
28510 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55  & (WO_EQ|WO_ISNU
28520 4c 4c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  LL))!=0 ){.     
28530 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
28540 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
28550 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
28560 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
28570 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
28580 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
28590 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
285a0 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
285b0 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70  , pBuilder, pExp
285c0 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75 74  r->pRight, &nOut
285d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
285e0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
285f0 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 0a 20 20  ator & WO_IN).  
28600 20 20 20 20 20 20 20 20 20 20 20 26 26 20 20 21             &&  !
28610 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
28620 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
28630 65 63 74 29 20 20 29 7b 0a 20 20 20 20 20 20 20  ect)  ){.       
28640 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53 63 61   rc = whereInSca
28650 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
28660 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e  ilder, pExpr->x.
28670 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20  pList, &nOut);. 
28680 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
28690 65 72 74 28 20 6e 4f 75 74 3d 3d 30 20 7c 7c 20  ert( nOut==0 || 
286a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
286b0 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 20  .      if( nOut 
286c0 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
286d0 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c  >nOut = sqlite3L
286e0 6f 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20  ogEst(nOut);.   
286f0 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e       if( pNew->n
28700 4f 75 74 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29  Out>saved_nOut )
28710 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
28720 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20  ved_nOut;.      
28730 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
28740 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73     if( (pNew->ws
28750 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  Flags & (WHERE_I
28760 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50  DX_ONLY|WHERE_IP
28770 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  K))==0 ){.      
28780 2f 2a 20 45 61 63 68 20 72 6f 77 20 69 6e 76 6f  /* Each row invo
28790 6c 76 65 73 20 61 20 73 74 65 70 20 6f 66 20 74  lves a step of t
287a0 68 65 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 61  he index, then a
287b0 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 6f   binary search o
287c0 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d  f.      ** the m
287d0 61 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ain table */.   
287e0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
287f0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
28800 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 72 4c 6f  d(pNew->rRun,rLo
28810 67 53 69 7a 65 3e 32 37 20 3f 20 72 4c 6f 67 53  gSize>27 ? rLogS
28820 69 7a 65 2d 31 37 20 3a 20 31 30 29 3b 0a 20 20  ize-17 : 10);.  
28830 20 20 7d 0a 20 20 20 20 2f 2a 20 53 74 65 70 20    }.    /* Step 
28840 63 6f 73 74 20 66 6f 72 20 65 61 63 68 20 6f 75  cost for each ou
28850 74 70 75 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  tput row */.    
28860 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c  pNew->rRun = sql
28870 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e  ite3LogEstAdd(pN
28880 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e  ew->rRun, pNew->
28890 6e 4f 75 74 29 3b 0a 20 20 20 20 77 68 65 72 65  nOut);.    where
288a0 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
288b0 28 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20  (pBuilder->pWC, 
288c0 70 4e 65 77 29 3b 0a 20 20 20 20 72 63 20 3d 20  pNew);.    rc = 
288d0 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
288e0 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
288f0 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e  .    if( (pNew->
28900 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
28910 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20  TOP_LIMIT)==0.  
28920 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74     && pNew->u.bt
28930 72 65 65 2e 6e 45 71 3c 28 70 50 72 6f 62 65 2d  ree.nEq<(pProbe-
28940 3e 6e 4b 65 79 43 6f 6c 20 2b 20 28 70 50 72 6f  >nKeyCol + (pPro
28950 62 65 2d 3e 7a 4e 61 6d 65 21 3d 30 29 29 0a 20  be->zName!=0)). 
28960 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72     ){.      wher
28970 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
28980 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72  ex(pBuilder, pSr
28990 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75  c, pProbe, nInMu
289a0 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  l+nIn);.    }.  
289b0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
289c0 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65  aved_nOut;.#ifde
289d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
289e0 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
289f0 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65     pBuilder->nRe
28a00 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c  cValid = nRecVal
28a10 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  id;.#endif.  }. 
28a20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
28a30 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20  saved_prereq;.  
28a40 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
28a50 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20  q = saved_nEq;. 
28a60 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
28a70 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
28a80 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
28a90 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65  aved_nOut;.  pNe
28aa0 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
28ab0 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 72 65 74 75  d_nLTerm;.  retu
28ac0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
28ad0 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 69  Return True if i
28ae0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
28af0 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20  at pIndex might 
28b00 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20  be useful in.** 
28b10 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65  implementing the
28b20 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
28b30 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a   in pBuilder..**
28b40 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65  .** Return False
28b50 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65   if pBuilder doe
28b60 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
28b70 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
28b80 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20   or.** if there 
28b90 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49  is no way for pI
28ba0 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66 75  ndex to be usefu
28bb0 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  l in implementin
28bc0 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20  g that.** ORDER 
28bd0 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  BY clause..*/.st
28be0 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69  atic int indexMi
28bf0 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72  ghtHelpWithOrder
28c00 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  By(.  WhereLoopB
28c10 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
28c20 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ,.  Index *pInde
28c30 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72  x,.  int iCursor
28c40 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
28c50 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a  pOB;.  int ii, j
28c60 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  j;..  if( pIndex
28c70 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72  ->bUnordered ) r
28c80 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
28c90 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pOB = pBuilder->
28ca0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
28cb0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
28cc0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
28cd0 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  pOB->nExpr; ii++
28ce0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
28cf0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
28d00 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d  SkipCollate(pOB-
28d10 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20  >a[ii].pExpr);. 
28d20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
28d30 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
28d40 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
28d50 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
28d60 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
28d70 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e  for(jj=0; jj<pIn
28d80 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a  dex->nKeyCol; jj
28d90 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
28da0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d   pExpr->iColumn=
28db0 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  =pIndex->aiColum
28dc0 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31  n[jj] ) return 1
28dd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
28de0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
28df0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
28e00 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20  a bitmask where 
28e10 31 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  1s indicate that
28e20 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
28e30 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20  ng column of.** 
28e40 74 68 65 20 74 61 62 6c 65 20 69 73 20 75 73 65  the table is use
28e50 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20  d by an index.  
28e60 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 36  Only the first 6
28e70 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f  3 columns are co
28e80 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61  nsidered..*/.sta
28e90 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75  tic Bitmask colu
28ea0 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78  mnsInIndex(Index
28eb0 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61   *pIdx){.  Bitma
28ec0 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20  sk m = 0;.  int 
28ed0 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d  j;.  for(j=pIdx-
28ee0 3e 6e 4b 65 79 43 6f 6c 2d 31 3b 20 6a 3e 3d 30  >nKeyCol-1; j>=0
28ef0 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; j--){.    int 
28f00 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  x = pIdx->aiColu
28f10 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 61 73 73 65 72  mn[j];.    asser
28f20 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 74  t( x>=0 );.    t
28f30 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d  estcase( x==BMS-
28f40 31 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  1 );.    testcas
28f50 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20  e( x==BMS-2 );. 
28f60 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29     if( x<BMS-1 )
28f70 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29   m |= MASKBIT(x)
28f80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  ;.  }.  return m
28f90 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f  ;.}../* Check to
28fa0 20 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61   see if a partia
28fb0 6c 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61  l index with pPa
28fc0 72 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e  rtIndexWhere can
28fd0 20 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74   be used.** in t
28fe0 68 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79  he current query
28ff0 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
29000 66 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20  f it can be and 
29010 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f  false if not..*/
29020 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
29030 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e  eUsablePartialIn
29040 64 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68  dex(int iTab, Wh
29050 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
29060 45 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20  Expr *pWhere){. 
29070 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54   int i;.  WhereT
29080 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 66 6f  erm *pTerm;.  fo
29090 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  r(i=0, pTerm=pWC
290a0 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
290b0 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
290c0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
290d0 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
290e0 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 70  (pTerm->pExpr, p
290f0 57 68 65 72 65 2c 20 69 54 61 62 29 20 29 20 72  Where, iTab) ) r
29100 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
29110 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
29120 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
29130 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
29140 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f  a single table o
29150 66 20 74 68 65 20 6a 6f 69 6e 20 77 68 65 72 65  f the join where
29160 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73   the table.** is
29170 20 69 64 65 6e 66 69 65 64 20 62 79 20 70 42 75   idenfied by pBu
29180 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61  ilder->pNew->iTa
29190 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69  b.  That table i
291a0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
291b0 62 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74  be.** a b-tree t
291c0 61 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74  able, not a virt
291d0 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ual table..*/.st
291e0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
291f0 6f 70 41 64 64 42 74 72 65 65 28 0a 20 20 57 68  opAddBtree(.  Wh
29200 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
29210 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45  pBuilder, /* WHE
29220 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d  RE clause inform
29230 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  ation */.  Bitma
29240 73 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20 20  sk mExtra       
29250 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
29260 70 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f  prerequesites fo
29270 72 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62  r using this tab
29280 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  le */.){.  Where
29290 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
292a0 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
292b0 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74  analysis context
292c0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72   */.  Index *pPr
292d0 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  obe;            
292e0 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65    /* An index we
292f0 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20   are evaluating 
29300 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20  */.  Index sPk; 
29310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29320 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78   /* A fake index
29330 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20   object for the 
29340 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20  primary key */. 
29350 20 74 52 6f 77 63 6e 74 20 61 69 52 6f 77 45 73   tRowcnt aiRowEs
29360 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20 2f 2a 20  tPk[2];      /* 
29370 54 68 65 20 61 69 52 6f 77 45 73 74 5b 5d 20 76  The aiRowEst[] v
29380 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
29390 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20   index */.  i16 
293a0 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b  aiColumnPk = -1;
293b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
293c0 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66  Column[] value f
293d0 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
293e0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
293f0 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20  TabList;        
29400 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
29410 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
29420 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
29430 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src;  /* The FRO
29440 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65 20 74  M clause btree t
29450 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  erm to add */.  
29460 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
29470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29480 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f  emplate WhereLoo
29490 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  p object */.  in
294a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
294b0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ;         /* Ret
294c0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
294d0 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20  t iSortIdx = 1; 
294e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
294f0 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ex number */.  i
29500 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20 20 20  nt b;           
29510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
29520 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f  boolean value */
29530 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b  .  LogEst rSize;
29540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29550 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
29560 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
29570 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69  .  LogEst rLogSi
29580 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
29590 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  * Logarithm of t
295a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
295b0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
295c0 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
295d0 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20  *pWC;           
295e0 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20 57 48  /* The parsed WH
295f0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
29600 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
29610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29620 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69  able being queri
29630 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20  ed */.  .  pNew 
29640 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
29650 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75  ;.  pWInfo = pBu
29660 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
29670 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e   pTabList = pWIn
29680 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
29690 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d  pSrc = pTabList-
296a0 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b  >a + pNew->iTab;
296b0 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
296c0 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42  pTab;.  pWC = pB
296d0 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61  uilder->pWC;.  a
296e0 73 73 65 72 74 28 20 21 49 73 56 69 72 74 75 61  ssert( !IsVirtua
296f0 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b  l(pSrc->pTab) );
29700 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49  ..  if( pSrc->pI
29710 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41  ndex ){.    /* A
29720 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
29730 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20  use specifies a 
29740 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
29750 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70   to use */.    p
29760 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49  Probe = pSrc->pI
29770 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ndex;.  }else{. 
29780 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
29790 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  o INDEXED BY cla
297a0 75 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66  use.  Create a f
297b0 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  ake Index object
297c0 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a   in local.    **
297d0 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f   variable sPk to
297e0 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72   represent the r
297f0 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79  owid primary key
29800 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68   index.  Make th
29810 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69  is.    ** fake i
29820 6e 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69  ndex the first i
29830 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64  n a chain of Ind
29840 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20  ex objects with 
29850 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a  all of the real.
29860 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74      ** indices t
29870 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  o follow */.    
29880 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20  Index *pFirst;  
29890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298a0 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c  /* First of real
298b0 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   indices on the 
298c0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d  table */.    mem
298d0 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a  set(&sPk, 0, siz
298e0 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20  eof(Index));.   
298f0 20 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31   sPk.nKeyCol = 1
29900 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75  ;.    sPk.aiColu
29910 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b  mn = &aiColumnPk
29920 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45  ;.    sPk.aiRowE
29930 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b  st = aiRowEstPk;
29940 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72  .    sPk.onError
29950 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20   = OE_Replace;. 
29960 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20     sPk.pTable = 
29970 70 54 61 62 3b 0a 20 20 20 20 61 69 52 6f 77 45  pTab;.    aiRowE
29980 73 74 50 6b 5b 30 5d 20 3d 20 70 54 61 62 2d 3e  stPk[0] = pTab->
29990 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 61 69 52  nRowEst;.    aiR
299a0 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a  owEstPk[1] = 1;.
299b0 20 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72      pFirst = pSr
299c0 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  c->pTab->pIndex;
299d0 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  .    if( pSrc->n
299e0 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a  otIndexed==0 ){.
299f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61        /* The rea
29a00 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65  l indices of the
29a10 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20   table are only 
29a20 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68  considered if th
29a30 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49  e.      ** NOT I
29a40 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72  NDEXED qualifier
29a50 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   is omitted from
29a60 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
29a70 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e   */.      sPk.pN
29a80 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20  ext = pFirst;.  
29a90 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d    }.    pProbe =
29aa0 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69   &sPk;.  }.  rSi
29ab0 7a 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ze = sqlite3LogE
29ac0 73 74 28 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74  st(pTab->nRowEst
29ad0 29 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20  );.  rLogSize = 
29ae0 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a  estLog(rSize);..
29af0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29b00 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
29b10 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74  DEX.  /* Automat
29b20 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  ic indexes */.  
29b30 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70  if( !pBuilder->p
29b40 4f 72 53 65 74 0a 20 20 20 26 26 20 28 70 57 49  OrSet.   && (pWI
29b50 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  nfo->pParse->db-
29b60 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
29b70 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20  AutoIndex)!=0.  
29b80 20 26 26 20 70 53 72 63 2d 3e 70 49 6e 64 65 78   && pSrc->pIndex
29b90 3d 3d 30 0a 20 20 20 26 26 20 21 70 53 72 63 2d  ==0.   && !pSrc-
29ba0 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 0a 20 20  >viaCoroutine.  
29bb0 20 26 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49 6e   && !pSrc->notIn
29bc0 64 65 78 65 64 0a 20 20 20 26 26 20 21 70 53 72  dexed.   && !pSr
29bd0 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 0a  c->isCorrelated.
29be0 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65    ){.    /* Gene
29bf0 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20  rate auto-index 
29c00 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20  WhereLoops */.  
29c10 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
29c20 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  rm;.    WhereTer
29c30 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d  m *pWCEnd = pWC-
29c40 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b  >a + pWC->nTerm;
29c50 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  .    for(pTerm=p
29c60 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54  WC->a; rc==SQLIT
29c70 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57  E_OK && pTerm<pW
29c80 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
29c90 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
29ca0 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
29cb0 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20  New->maskSelf ) 
29cc0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
29cd0 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
29ce0 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
29cf0 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  c, 0) ){.       
29d00 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
29d10 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  Eq = 1;.        
29d20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
29d30 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
29d40 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
29d50 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
29d60 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
29d70 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  erm;.        /* 
29d80 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65  TUNING: One-time
29d90 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74   cost for comput
29da0 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ing the automati
29db0 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20  c index is.     
29dc0 20 20 20 2a 2a 20 61 70 70 72 6f 78 69 6d 61 74     ** approximat
29dd0 65 6c 79 20 37 2a 4e 2a 6c 6f 67 32 28 4e 29 20  ely 7*N*log2(N) 
29de0 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
29df0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
29e00 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
29e10 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65  table being inde
29e20 78 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  xed. */.        
29e30 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72  pNew->rSetup = r
29e40 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 20  LogSize + rSize 
29e50 2b 20 32 38 3b 20 20 61 73 73 65 72 74 28 20 32  + 28;  assert( 2
29e60 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  8==sqlite3LogEst
29e70 28 37 29 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  (7) );.        /
29e80 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63 68 20 69  * TUNING: Each i
29e90 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c  ndex lookup yiel
29ea0 64 73 20 32 30 20 72 6f 77 73 20 69 6e 20 74 68  ds 20 rows in th
29eb0 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 0a 20  e table.  This. 
29ec0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72         ** is mor
29ed0 65 20 74 68 61 6e 20 74 68 65 20 75 73 75 61 6c  e than the usual
29ee0 20 67 75 65 73 73 20 6f 66 20 31 30 20 72 6f 77   guess of 10 row
29ef0 73 2c 20 73 69 6e 63 65 20 77 65 20 68 61 76 65  s, since we have
29f00 20 6e 6f 20 77 61 79 0a 20 20 20 20 20 20 20 20   no way.        
29f10 2a 2a 20 6f 66 20 6b 6e 6f 77 6e 69 6e 67 20 68  ** of knowning h
29f20 6f 77 20 73 65 6c 65 63 74 69 76 65 20 74 68 65  ow selective the
29f30 20 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74 69   index will ulti
29f40 6d 61 74 65 6c 79 20 62 65 2e 20 20 49 74 20 77  mately be.  It w
29f50 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ould.        ** 
29f60 6e 6f 74 20 62 65 20 75 6e 72 65 61 73 6f 6e 61  not be unreasona
29f70 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68 69 73  ble to make this
29f80 20 76 61 6c 75 65 20 6d 75 63 68 20 6c 61 72 67   value much larg
29f90 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  er. */.        p
29fa0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20  New->nOut = 43; 
29fb0 20 61 73 73 65 72 74 28 20 34 33 3d 3d 73 71 6c   assert( 43==sql
29fc0 69 74 65 33 4c 6f 67 45 73 74 28 32 30 29 20 29  ite3LogEst(20) )
29fd0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
29fe0 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
29ff0 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65  gEstAdd(rLogSize
2a000 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20  ,pNew->nOut);.  
2a010 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
2a020 61 67 73 20 3d 20 57 48 45 52 45 5f 41 55 54 4f  ags = WHERE_AUTO
2a030 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20  _INDEX;.        
2a040 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d  pNew->prereq = m
2a050 45 78 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70  Extra | pTerm->p
2a060 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
2a070 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2a080 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
2a090 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
2a0a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
2a0b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2a0c0 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
2a0d0 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  X */..  /* Loop 
2a0e0 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73  over all indices
2a0f0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63  .  */.  for(; rc
2a100 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2a110 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50  Probe; pProbe=pP
2a120 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f  robe->pNext, iSo
2a130 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66  rtIdx++){.    if
2a140 28 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49  ( pProbe->pPartI
2a150 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20  dxWhere!=0.     
2a160 26 26 20 21 77 68 65 72 65 55 73 61 62 6c 65 50  && !whereUsableP
2a170 61 72 74 69 61 6c 49 6e 64 65 78 28 70 4e 65 77  artialIndex(pNew
2a180 2d 3e 69 54 61 62 2c 20 70 57 43 2c 20 70 50 72  ->iTab, pWC, pPr
2a190 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65  obe->pPartIdxWhe
2a1a0 72 65 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  re) ){.      con
2a1b0 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74 69  tinue;  /* Parti
2a1c0 61 6c 20 69 6e 64 65 78 20 69 6e 61 70 70 72 6f  al index inappro
2a1d0 70 72 69 61 74 65 20 66 6f 72 20 74 68 69 73 20  priate for this 
2a1e0 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20  query */.    }. 
2a1f0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
2a200 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e  .nEq = 0;.    pN
2a210 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a  ew->nLTerm = 0;.
2a220 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
2a230 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  dx = 0;.    pNew
2a240 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
2a250 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
2a260 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e 65   mExtra;.    pNe
2a270 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
2a280 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
2a290 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f  ee.pIndex = pPro
2a2a0 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65  be;.    b = inde
2a2b0 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72  xMightHelpWithOr
2a2c0 64 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20  derBy(pBuilder, 
2a2d0 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43  pProbe, pSrc->iC
2a2e0 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54  ursor);.    /* T
2a2f0 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  he ONEPASS_DESIR
2a300 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f  ED flags never o
2a310 63 63 75 72 73 20 74 6f 67 65 74 68 65 72 20 77  ccurs together w
2a320 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  ith ORDER BY */.
2a330 20 20 20 20 61 73 73 65 72 74 28 20 28 70 57 49      assert( (pWI
2a340 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2a350 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
2a360 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62  DESIRED)==0 || b
2a370 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
2a380 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29  Probe->tnum<=0 )
2a390 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67  {.      /* Integ
2a3a0 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  er primary key i
2a3b0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e  ndex */.      pN
2a3c0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
2a3d0 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20  ERE_IPK;..      
2a3e0 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63  /* Full table sc
2a3f0 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  an */.      pNew
2a400 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f  ->iSortIdx = b ?
2a410 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20   iSortIdx : 0;. 
2a420 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
2a430 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62  Cost of full tab
2a440 6c 65 20 73 63 61 6e 20 69 73 20 33 2a 28 4e 20  le scan is 3*(N 
2a450 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20 20 20 20  + log2(N))..    
2a460 20 20 2a 2a 20 20 2b 20 20 54 68 65 20 65 78 74    **  +  The ext
2a470 72 61 20 33 20 66 61 63 74 6f 72 20 69 73 20 74  ra 3 factor is t
2a480 6f 20 65 6e 63 6f 75 72 61 67 65 20 74 68 65 20  o encourage the 
2a490 75 73 65 20 6f 66 20 69 6e 64 65 78 65 64 20 6c  use of indexed l
2a4a0 6f 6f 6b 75 70 73 0a 20 20 20 20 20 20 2a 2a 20  ookups.      ** 
2a4b0 20 20 20 20 6f 76 65 72 20 66 75 6c 6c 20 73 63      over full sc
2a4c0 61 6e 73 2e 20 20 46 49 58 4d 45 20 2a 2f 0a 20  ans.  FIXME */. 
2a4d0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2a4e0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
2a4f0 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69 7a  dd(rSize,rLogSiz
2a500 65 29 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 77  e) + 16;.      w
2a510 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64  hereLoopOutputAd
2a520 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77 29 3b  just(pWC, pNew);
2a530 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
2a540 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
2a550 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
2a560 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
2a570 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  rSize;.      if(
2a580 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
2a590 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69   }else{.      Bi
2a5a0 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e  tmask m = pSrc->
2a5b0 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d  colUsed & ~colum
2a5c0 6e 73 49 6e 49 6e 64 65 78 28 70 50 72 6f 62 65  nsInIndex(pProbe
2a5d0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  );.      pNew->w
2a5e0 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20  sFlags = (m==0) 
2a5f0 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  ? (WHERE_IDX_ONL
2a600 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  Y|WHERE_INDEXED)
2a610 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   : WHERE_INDEXED
2a620 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c  ;..      /* Full
2a630 20 73 63 61 6e 20 76 69 61 20 69 6e 64 65 78 20   scan via index 
2a640 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 0a 20  */.      if( b. 
2a650 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a        || ( m==0.
2a660 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f           && pPro
2a670 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  be->bUnordered==
2a680 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50  0.         && pP
2a690 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  robe->szIdxRow<p
2a6a0 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20  Tab->szTabRow.  
2a6b0 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
2a6c0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
2a6d0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
2a6e0 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20  SIRED)==0.      
2a6f0 20 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f     && sqlite3Glo
2a700 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
2a710 73 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70  s.         && Op
2a720 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
2a730 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  d(pWInfo->pParse
2a740 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76  ->db, SQLITE_Cov
2a750 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20  erIdxScan).     
2a760 20 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a       ).      ){.
2a770 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53          pNew->iS
2a780 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f  ortIdx = b ? iSo
2a790 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20  rtIdx : 0;.     
2a7a0 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20     if( m==0 ){. 
2a7b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49           /* TUNI
2a7c0 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 63 6f  NG: Cost of a co
2a7d0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61  vering index sca
2a7e0 6e 20 69 73 20 4b 2a 28 4e 20 2b 20 6c 6f 67 32  n is K*(N + log2
2a7f0 28 4e 29 29 2e 0a 20 20 20 20 20 20 20 20 20 20  (N))..          
2a800 2a 2a 20 20 2b 20 20 54 68 65 20 65 78 74 72 61  **  +  The extra
2a810 20 66 61 63 74 6f 72 20 4b 20 6f 66 20 62 65 74   factor K of bet
2a820 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30  ween 1.1 and 3.0
2a830 20 74 68 61 74 20 64 65 70 65 6e 64 73 0a 20 20   that depends.  
2a840 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f          **     o
2a850 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 73  n the relative s
2a860 69 7a 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c  izes of the tabl
2a870 65 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 2e  e and the index.
2a880 20 20 4b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a    K.          **
2a890 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20       is smaller 
2a8a0 66 6f 72 20 73 6d 61 6c 6c 65 72 20 69 6e 64 69  for smaller indi
2a8b0 63 65 73 2c 20 74 68 75 73 20 66 61 76 6f 72 69  ces, thus favori
2a8c0 6e 67 20 74 68 65 6d 2e 0a 20 20 20 20 20 20 20  ng them..       
2a8d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2a8e0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c  pNew->rRun = sql
2a8f0 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 53  ite3LogEstAdd(rS
2a900 69 7a 65 2c 72 4c 6f 67 53 69 7a 65 29 20 2b 20  ize,rLogSize) + 
2a910 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1 +.            
2a920 20 20 20 20 20 20 20 20 20 20 20 20 28 31 35 2a              (15*
2a930 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
2a940 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  )/pTab->szTabRow
2a950 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2a960 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2a970 74 28 20 62 21 3d 30 20 29 3b 20 0a 20 20 20 20  t( b!=0 ); .    
2a980 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
2a990 20 43 6f 73 74 20 6f 66 20 73 63 61 6e 6e 69 6e   Cost of scannin
2a9a0 67 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67  g a non-covering
2a9b0 20 69 6e 64 65 78 20 69 73 20 28 4e 2b 31 29 2a   index is (N+1)*
2a9c0 6c 6f 67 32 28 4e 29 0a 20 20 20 20 20 20 20 20  log2(N).        
2a9d0 20 20 2a 2a 20 77 68 69 63 68 20 77 65 20 77 69    ** which we wi
2a9e0 6c 6c 20 73 69 6d 70 6c 69 66 79 20 74 6f 20 6a  ll simplify to j
2a9f0 75 73 74 20 4e 2a 6c 6f 67 32 28 4e 29 20 2a 2f  ust N*log2(N) */
2aa00 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
2aa10 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20  >rRun = rSize + 
2aa20 72 4c 6f 67 53 69 7a 65 3b 0a 20 20 20 20 20 20  rLogSize;.      
2aa30 20 20 7d 0a 20 20 20 20 20 20 20 20 77 68 65 72    }.        wher
2aa40 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73  eLoopOutputAdjus
2aa50 74 28 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20 20  t(pWC, pNew);.  
2aa60 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2aa70 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
2aa80 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
2aa90 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2aaa0 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20   rSize;.        
2aab0 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
2aac0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2aad0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2aae0 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
2aaf0 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
2ab00 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64 65  Probe, 0);.#ifde
2ab10 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2ab20 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
2ab30 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 34 50     sqlite3Stat4P
2ab40 72 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64 65  robeFree(pBuilde
2ab50 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42  r->pRec);.    pB
2ab60 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
2ab70 64 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c  d = 0;.    pBuil
2ab80 64 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23  der->pRec = 0;.#
2ab90 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
2aba0 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e   there was an IN
2abb0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
2abc0 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20   then only that 
2abd0 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20  one index is.   
2abe0 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20   ** considered. 
2abf0 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  */.    if( pSrc-
2ac00 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b  >pIndex ) break;
2ac10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2ac20 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
2ac30 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2ac40 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20  TABLE./*.** Add 
2ac50 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
2ac60 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c  jects for a tabl
2ac70 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64  e of the join id
2ac80 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70  entified by.** p
2ac90 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69  Builder->pNew->i
2aca0 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65  Tab.  That table
2acb0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2acc0 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20 74  o be a virtual t
2acd0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
2ace0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
2acf0 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65  Virtual(.  Where
2ad00 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
2ad10 69 6c 64 65 72 20 20 20 2f 2a 20 57 48 45 52 45  ilder   /* WHERE
2ad20 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
2ad30 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ion */.){.  Wher
2ad40 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
2ad50 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52           /* WHER
2ad60 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65  E analysis conte
2ad70 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  xt */.  Parse *p
2ad80 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
2ad90 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
2ada0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
2adb0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
2adc0 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  C;            /*
2add0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
2ade0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
2adf0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
2ae00 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
2ae10 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73  clause term to s
2ae20 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65  earch */.  Table
2ae30 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65   *pTab;.  sqlite
2ae40 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33  3 *db;.  sqlite3
2ae50 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
2ae60 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  xInfo;.  struct 
2ae70 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
2ae80 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f  nstraint *pIdxCo
2ae90 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  ns;.  struct sql
2aea0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
2aeb0 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
2aec0 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  age;.  WhereTerm
2aed0 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
2aee0 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d  , j;.  int iTerm
2aef0 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20  , mxTerm;.  int 
2af00 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69  nConstraint;.  i
2af10 6e 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20  nt seenIn = 0;  
2af20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2af30 72 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70 65  rue if an IN ope
2af40 72 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f  rator is seen */
2af50 0a 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20 3d  .  int seenVar =
2af60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2af70 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f 6e  /* True if a non
2af80 2d 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72  -constant constr
2af90 61 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a  aint is seen */.
2afa0 20 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20 20    int iPhase;   
2afb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2afc0 2a 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49  * 0: const w/o I
2afd0 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20  N, 1: const, 2: 
2afe0 6e 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f  no IN,  2: IN */
2aff0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
2b000 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ew;.  int rc = S
2b010 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57 49  QLITE_OK;..  pWI
2b020 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
2b030 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65  pWInfo;.  pParse
2b040 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
2b050 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  e;.  db = pParse
2b060 2d 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20 70 42  ->db;.  pWC = pB
2b070 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70  uilder->pWC;.  p
2b080 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
2b090 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26  pNew;.  pSrc = &
2b0a0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2b0b0 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b  ->a[pNew->iTab];
2b0c0 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
2b0d0 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20  pTab;.  assert( 
2b0e0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
2b0f0 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20  );.  pIdxInfo = 
2b100 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66  allocateIndexInf
2b110 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70  o(pParse, pWC, p
2b120 53 72 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  Src, pBuilder->p
2b130 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20  OrderBy);.  if( 
2b140 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65  pIdxInfo==0 ) re
2b150 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2b160 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  M;.  pNew->prere
2b170 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72  q = 0;.  pNew->r
2b180 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65  Setup = 0;.  pNe
2b190 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
2b1a0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b  RE_VIRTUALTABLE;
2b1b0 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
2b1c0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  = 0;.  pNew->u.v
2b1d0 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
2b1e0 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64  ;.  pUsage = pId
2b1f0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
2b200 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73  ntUsage;.  nCons
2b210 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66  traint = pIdxInf
2b220 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->nConstraint;.
2b230 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
2b240 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
2b250 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a  nConstraint) ){.
2b260 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2b270 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  e(db, pIdxInfo);
2b280 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2b290 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
2b2a0 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20 69   for(iPhase=0; i
2b2b0 50 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73 65  Phase<=3; iPhase
2b2c0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 65  ++){.    if( !se
2b2d0 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65 26  enIn && (iPhase&
2b2e0 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  1)!=0 ){.      i
2b2f0 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69  Phase++;.      i
2b300 66 28 20 69 50 68 61 73 65 3e 33 20 29 20 62 72  f( iPhase>3 ) br
2b310 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
2b320 66 28 20 21 73 65 65 6e 56 61 72 20 26 26 20 69  f( !seenVar && i
2b330 50 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b 3b  Phase>1 ) break;
2b340 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  .    pIdxCons = 
2b350 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
2b360 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
2b370 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
2b380 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  Constraint;.    
2b390 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49  for(i=0; i<pIdxI
2b3a0 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
2b3b0 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
2b3c0 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 49  +){.      j = pI
2b3d0 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
2b3e0 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  set;.      pTerm
2b3f0 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20   = &pWC->a[j];. 
2b400 20 20 20 20 20 73 77 69 74 63 68 28 20 69 50 68       switch( iPh
2b410 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ase ){.        c
2b420 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e  ase 0:    /* Con
2b430 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20 49  stants without I
2b440 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
2b450 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
2b460 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20  ->usable = 0;.  
2b470 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
2b480 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
2b490 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20  WO_IN)!=0 ){.   
2b4a0 20 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e 20           seenIn 
2b4b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
2b4c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2b4d0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
2b4e0 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t!=0 ){.        
2b4f0 20 20 20 20 73 65 65 6e 56 61 72 20 3d 20 31 3b      seenVar = 1;
2b500 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2b510 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
2b520 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d  erator & WO_IN)=
2b530 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2b540 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
2b550 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  le = 1;.        
2b560 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
2b570 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
2b580 65 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74  e 1:    /* Const
2b590 61 6e 74 73 20 77 69 74 68 20 49 4e 20 6f 70 65  ants with IN ope
2b5a0 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20  rators */.      
2b5b0 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e      assert( seen
2b5c0 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  In );.          
2b5d0 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
2b5e0 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65   = (pTerm->prere
2b5f0 71 52 69 67 68 74 3d 3d 30 29 3b 0a 20 20 20 20  qRight==0);.    
2b600 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2b610 20 20 20 20 20 63 61 73 65 20 32 3a 20 20 20 20       case 2:    
2b620 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69 74  /* Variables wit
2b630 68 6f 75 74 20 49 4e 20 2a 2f 0a 20 20 20 20 20  hout IN */.     
2b640 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65       assert( see
2b650 6e 56 61 72 20 29 3b 0a 20 20 20 20 20 20 20 20  nVar );.        
2b660 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
2b670 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 65 4f 70  le = (pTerm->eOp
2b680 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d  erator & WO_IN)=
2b690 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  =0;.          br
2b6a0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66  eak;.        def
2b6b0 61 75 6c 74 3a 20 20 20 2f 2a 20 56 61 72 69 61  ault:   /* Varia
2b6c0 62 6c 65 73 20 77 69 74 68 20 49 4e 20 2a 2f 0a  bles with IN */.
2b6d0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2b6e0 28 20 73 65 65 6e 56 61 72 20 26 26 20 73 65 65  ( seenVar && see
2b6f0 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nIn );.         
2b700 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
2b710 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
2b720 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2b730 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
2b740 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65  (pUsage, 0, size
2b750 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49  of(pUsage[0])*pI
2b760 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
2b770 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 49  int);.    if( pI
2b780 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
2b790 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74  eeIdxStr ) sqlit
2b7a0 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f  e3_free(pIdxInfo
2b7b0 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70  ->idxStr);.    p
2b7c0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20  IdxInfo->idxStr 
2b7d0 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
2b7e0 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20  o->idxNum = 0;. 
2b7f0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65     pIdxInfo->nee
2b800 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20  dToFreeIdxStr = 
2b810 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
2b820 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
2b830 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 0;.    pIdxIn
2b840 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
2b850 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  t = SQLITE_BIG_D
2b860 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a  BL / (double)2;.
2b870 20 20 20 20 72 63 20 3d 20 76 74 61 62 42 65 73      rc = vtabBes
2b880 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  tIndex(pParse, p
2b890 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  Tab, pIdxInfo);.
2b8a0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2b8b0 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74  o whereLoopAddVt
2b8c0 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 70 49 64  ab_exit;.    pId
2b8d0 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74  xCons = *(struct
2b8e0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
2b8f0 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
2b900 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
2b910 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72  nt;.    pNew->pr
2b920 65 72 65 71 20 3d 20 30 3b 0a 20 20 20 20 6d 78  ereq = 0;.    mx
2b930 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 61  Term = -1;.    a
2b940 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53  ssert( pNew->nLS
2b950 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  lot>=nConstraint
2b960 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
2b970 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   i<nConstraint; 
2b980 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72  i++) pNew->aLTer
2b990 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e  m[i] = 0;.    pN
2b9a0 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d  ew->u.vtab.omitM
2b9b0 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ask = 0;.    for
2b9c0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61  (i=0; i<nConstra
2b9d0 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f  int; i++, pIdxCo
2b9e0 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ns++){.      if(
2b9f0 20 28 69 54 65 72 6d 20 3d 20 70 55 73 61 67 65   (iTerm = pUsage
2ba00 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d 20  [i].argvIndex - 
2ba10 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)>=0 ){.       
2ba20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69   j = pIdxCons->i
2ba30 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
2ba40 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e      if( iTerm>=n
2ba50 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20  Constraint.     
2ba60 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20      || j<0.     
2ba70 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e      || j>=pWC->n
2ba80 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 7c 7c  Term.         ||
2ba90 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54   pNew->aLTerm[iT
2baa0 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20 20  erm]!=0.        
2bab0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2bac0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
2bad0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2bae0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2baf0 2c 20 22 25 73 2e 78 42 65 73 74 49 6e 64 65 78  , "%s.xBestIndex
2bb00 28 29 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c  () malfunction",
2bb10 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
2bb20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68           goto wh
2bb30 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65  ereLoopAddVtab_e
2bb40 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xit;.        }. 
2bb50 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2bb60 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61   iTerm==nConstra
2bb70 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  int-1 );.       
2bb80 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20   testcase( j==0 
2bb90 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
2bba0 61 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65  ase( j==pWC->nTe
2bbb0 72 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  rm-1 );.        
2bbc0 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
2bbd0 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  j];.        pNew
2bbe0 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65 72  ->prereq |= pTer
2bbf0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
2bc00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2bc10 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c  iTerm<pNew->nLSl
2bc20 6f 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  ot );.        pN
2bc30 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d  ew->aLTerm[iTerm
2bc40 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
2bc50 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d 78 54     if( iTerm>mxT
2bc60 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20 69  erm ) mxTerm = i
2bc70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 74 65  Term;.        te
2bc80 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31  stcase( iTerm==1
2bc90 35 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  5 );.        tes
2bca0 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 36  tcase( iTerm==16
2bcb0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2bcc0 69 54 65 72 6d 3c 31 36 20 26 26 20 70 55 73 61  iTerm<16 && pUsa
2bcd0 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65  ge[i].omit ) pNe
2bce0 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  w->u.vtab.omitMa
2bcf0 73 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a  sk |= 1<<iTerm;.
2bd00 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
2bd10 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
2bd20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20  WO_IN)!=0 ){.   
2bd30 20 20 20 20 20 20 20 69 66 28 20 70 55 73 61 67         if( pUsag
2bd40 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a  e[i].omit==0 ){.
2bd50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2bd60 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
2bd70 20 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74   use an IN const
2bd80 72 61 69 6e 74 20 69 66 20 74 68 65 20 76 69 72  raint if the vir
2bd90 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20  tual table.     
2bda0 20 20 20 20 20 20 20 2a 2a 20 73 61 79 73 20 74         ** says t
2bdb0 68 61 74 20 74 68 65 20 65 71 75 69 76 61 6c 65  hat the equivale
2bdc0 6e 74 20 45 51 20 63 6f 6e 73 74 72 61 69 6e 74  nt EQ constraint
2bdd0 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c   cannot be safel
2bde0 79 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20 20  y omitted..     
2bdf0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65 20         ** If we 
2be00 64 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  do attempt to us
2be10 65 20 73 75 63 68 20 61 20 63 6f 6e 73 74 72 61  e such a constra
2be20 69 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d  int, some rows m
2be30 69 67 68 74 20 62 65 0a 20 20 20 20 20 20 20 20  ight be.        
2be40 20 20 20 20 2a 2a 20 72 65 70 65 61 74 65 64 20      ** repeated 
2be50 69 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 20 2a  in the output. *
2be60 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  /.            br
2be70 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
2be80 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  .          /* A 
2be90 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
2bea0 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  at is constraine
2beb0 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75 73  d by an IN claus
2bec0 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20 20  e may not.      
2bed0 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74      ** consume t
2bee0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2bef0 73 65 20 62 65 63 61 75 73 65 20 28 31 29 20 74  se because (1) t
2bf00 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 74  he order of IN t
2bf10 65 72 6d 73 0a 20 20 20 20 20 20 20 20 20 20 2a  erms.          *
2bf20 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  * is not necessa
2bf30 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20  rily related to 
2bf40 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75 74  the order of out
2bf50 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20 20  put terms and.  
2bf60 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20 4d          ** (2) M
2bf70 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73 20  ultiple outputs 
2bf80 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e  from a single IN
2bf90 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20   value will not 
2bfa0 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20 20 20  merge.          
2bfb0 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f  ** together.  */
2bfc0 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 49  .          pIdxI
2bfd0 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
2bfe0 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  umed = 0;.      
2bff0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2c000 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 6f  }.    if( i>=nCo
2c010 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20  nstraint ){.    
2c020 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
2c030 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 20 20 20   mxTerm+1;.     
2c040 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
2c050 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53  LTerm<=pNew->nLS
2c060 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  lot );.      pNe
2c070 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  w->u.vtab.idxNum
2c080 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78   = pIdxInfo->idx
2c090 4e 75 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  Num;.      pNew-
2c0a0 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
2c0b0 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65   = pIdxInfo->nee
2c0c0 64 54 6f 46 72 65 65 49 64 78 53 74 72 3b 0a 20  dToFreeIdxStr;. 
2c0d0 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e       pIdxInfo->n
2c0e0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
2c0f0 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 0;.      pNew-
2c100 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d  >u.vtab.idxStr =
2c110 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74   pIdxInfo->idxSt
2c120 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  r;.      pNew->u
2c130 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20  .vtab.isOrdered 
2c140 3d 20 28 75 38 29 28 28 70 49 64 78 49 6e 66 6f  = (u8)((pIdxInfo
2c150 2d 3e 6e 4f 72 64 65 72 42 79 21 3d 30 29 0a 20  ->nOrderBy!=0). 
2c160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c180 20 20 20 20 26 26 20 70 49 64 78 49 6e 66 6f 2d      && pIdxInfo-
2c190 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
2c1a0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  );.      pNew->r
2c1b0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20  Setup = 0;.     
2c1c0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
2c1d0 6c 69 74 65 33 4c 6f 67 45 73 74 46 72 6f 6d 44  lite3LogEstFromD
2c1e0 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e  ouble(pIdxInfo->
2c1f0 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
2c200 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
2c210 20 45 76 65 72 79 20 76 69 72 74 75 61 6c 20 74   Every virtual t
2c220 61 62 6c 65 20 71 75 65 72 79 20 72 65 74 75 72  able query retur
2c230 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20  ns 25 rows */.  
2c240 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2c250 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34 36   46;  assert( 46
2c260 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
2c270 32 35 29 20 29 3b 0a 20 20 20 20 20 20 77 68 65  25) );.      whe
2c280 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
2c290 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
2c2a0 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e      if( pNew->u.
2c2b0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b  vtab.needFree ){
2c2c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2c2d0 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74  _free(pNew->u.vt
2c2e0 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
2c2f0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
2c300 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
2c310 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2c320 20 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64    ..whereLoopAdd
2c330 56 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28  Vtab_exit:.  if(
2c340 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
2c350 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71  oFreeIdxStr ) sq
2c360 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49  lite3_free(pIdxI
2c370 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
2c380 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2c390 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72  , pIdxInfo);.  r
2c3a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
2c3b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2c3c0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
2c3d0 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65  /../*.** Add Whe
2c3e0 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74  reLoop entries t
2c3f0 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d  o handle OR term
2c400 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66  s.  This works f
2c410 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72  or either.** btr
2c420 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74  ees or virtual t
2c430 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
2c440 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
2c450 64 4f 72 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  dOr(WhereLoopBui
2c460 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
2c470 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 29 7b  Bitmask mExtra){
2c480 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
2c490 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
2c4a0 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65  >pWInfo;.  Where
2c4b0 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57  Clause *pWC;.  W
2c4c0 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
2c4d0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
2c4e0 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69  rm, *pWCEnd;.  i
2c4f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2c500 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20  K;.  int iCur;. 
2c510 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d   WhereClause tem
2c520 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  pWC;.  WhereLoop
2c530 42 75 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c  Builder sSubBuil
2c540 64 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20  d;.  WhereOrSet 
2c550 73 53 75 6d 2c 20 73 43 75 72 2c 20 73 50 72 65  sSum, sCur, sPre
2c560 76 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  v;.  struct SrcL
2c570 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2c580 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69  .  .  pWC = pBui
2c590 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66 28  lder->pWC;.  if(
2c5a0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
2c5b0 61 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44 5f  ags & WHERE_AND_
2c5c0 4f 4e 4c 59 20 29 20 72 65 74 75 72 6e 20 53 51  ONLY ) return SQ
2c5d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e  LITE_OK;.  pWCEn
2c5e0 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
2c5f0 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20  ->nTerm;.  pNew 
2c600 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
2c610 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 75 6d  ;.  memset(&sSum
2c620 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d  , 0, sizeof(sSum
2c630 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57  ));.  pItem = pW
2c640 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
2c650 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a  a + pNew->iTab;.
2c660 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e    iCur = pItem->
2c670 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28  iCursor;..  for(
2c680 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
2c690 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63  erm<pWCEnd && rc
2c6a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65  ==SQLITE_OK; pTe
2c6b0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
2c6c0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2c6d0 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20   & WO_OR)!=0.   
2c6e0 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70    && (pTerm->u.p
2c6f0 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
2c700 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  e & pNew->maskSe
2c710 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  lf)!=0 .    ){. 
2c720 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
2c730 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d   * const pOrWC =
2c740 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
2c750 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68  fo->wc;.      Wh
2c760 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20  ereTerm * const 
2c770 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57  pOrWCEnd = &pOrW
2c780 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72  C->a[pOrWC->nTer
2c790 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  m];.      WhereT
2c7a0 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20  erm *pOrTerm;.  
2c7b0 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31      int once = 1
2c7c0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  ;.      int i, j
2c7d0 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 73 53 75  ;.    .      sSu
2c7e0 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64  bBuild = *pBuild
2c7f0 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75  er;.      sSubBu
2c800 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ild.pOrderBy = 0
2c810 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c  ;.      sSubBuil
2c820 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43 75 72  d.pOrSet = &sCur
2c830 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72  ;..      for(pOr
2c840 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70  Term=pOrWC->a; p
2c850 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b  OrTerm<pOrWCEnd;
2c860 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
2c870 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
2c880 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2c890 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20  O_AND)!=0 ){.   
2c8a0 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64         sSubBuild
2c8b0 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d  .pWC = &pOrTerm-
2c8c0 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  >u.pAndInfo->wc;
2c8d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2c8e0 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
2c8f0 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a  Cursor==iCur ){.
2c900 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
2c910 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70  .pWInfo = pWC->p
2c920 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  WInfo;.         
2c930 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d   tempWC.pOuter =
2c940 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20   pWC;.          
2c950 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41  tempWC.op = TK_A
2c960 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  ND;.          te
2c970 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a  mpWC.nTerm = 1;.
2c980 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
2c990 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20  .a = pOrTerm;.  
2c9a0 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c          sSubBuil
2c9b0 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b  d.pWC = &tempWC;
2c9c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2c9d0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2c9e0 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
2c9f0 20 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30        sCur.n = 0
2ca00 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2ca10 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2ca20 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  LE.        if( I
2ca30 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e  sVirtual(pItem->
2ca40 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
2ca50 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2ca60 70 41 64 64 56 69 72 74 75 61 6c 28 26 73 53 75  pAddVirtual(&sSu
2ca70 62 42 75 69 6c 64 29 3b 0a 20 20 20 20 20 20 20  bBuild);.       
2ca80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 43     for(i=0; i<sC
2ca90 75 72 2e 6e 3b 20 69 2b 2b 29 20 73 43 75 72 2e  ur.n; i++) sCur.
2caa0 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c 3d 20 6d  a[i].prereq |= m
2cab0 45 78 74 72 61 3b 0a 20 20 20 20 20 20 20 20 7d  Extra;.        }
2cac0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
2cad0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
2cae0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
2caf0 64 42 74 72 65 65 28 26 73 53 75 62 42 75 69 6c  dBtree(&sSubBuil
2cb00 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20  d, mExtra);.    
2cb10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
2cb20 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2cb30 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30  _OK || sCur.n==0
2cb40 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2cb50 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  sCur.n==0 ){.   
2cb60 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20         sSum.n = 
2cb70 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
2cb80 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
2cb90 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20  e if( once ){.  
2cba0 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d          whereOrM
2cbb0 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72  ove(&sSum, &sCur
2cbc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63  );.          onc
2cbd0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
2cbe0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2cbf0 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 50 72  whereOrMove(&sPr
2cc00 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20 20  ev, &sSum);.    
2cc10 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30        sSum.n = 0
2cc20 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
2cc30 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20  i=0; i<sPrev.n; 
2cc40 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2cc50 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75    for(j=0; j<sCu
2cc60 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  r.n; j++){.     
2cc70 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72           whereOr
2cc80 49 6e 73 65 72 74 28 26 73 53 75 6d 2c 20 73 50  Insert(&sSum, sP
2cc90 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20  rev.a[i].prereq 
2cca0 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72  | sCur.a[j].prer
2ccb0 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eq,.            
2ccc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ccd0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
2cce0 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e  (sPrev.a[i].rRun
2ccf0 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e  , sCur.a[j].rRun
2cd00 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2cd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2cd20 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
2cd30 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c  sPrev.a[i].nOut,
2cd40 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29   sCur.a[j].nOut)
2cd50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
2cd60 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2cd70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2cd80 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72       pNew->nLTer
2cd90 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65  m = 1;.      pNe
2cda0 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70  w->aLTerm[0] = p
2cdb0 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77  Term;.      pNew
2cdc0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
2cdd0 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20  E_MULTI_OR;.    
2cde0 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
2cdf0 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   0;.      pNew->
2ce00 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20  iSortIdx = 0;.  
2ce10 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77      memset(&pNew
2ce20 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ->u, 0, sizeof(p
2ce30 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20  New->u));.      
2ce40 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
2ce50 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d  ITE_OK && i<sSum
2ce60 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; i++){.      
2ce70 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 75 6c    /* TUNING: Mul
2ce80 74 69 70 6c 65 20 62 79 20 33 2e 35 20 66 6f 72  tiple by 3.5 for
2ce90 20 74 68 65 20 73 65 63 6f 6e 64 61 72 79 20 74   the secondary t
2cea0 61 62 6c 65 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20  able lookup */. 
2ceb0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
2cec0 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52  n = sSum.a[i].rR
2ced0 75 6e 20 2b 20 31 38 3b 0a 20 20 20 20 20 20 20  un + 18;.       
2cee0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53   pNew->nOut = sS
2cef0 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20  um.a[i].nOut;.  
2cf00 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
2cf10 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70  eq = sSum.a[i].p
2cf20 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72  rereq;.        r
2cf30 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
2cf40 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2cf50 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
2cf60 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2cf70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
2cf80 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
2cf90 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74  bjects for all t
2cfa0 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63  ables .*/.static
2cfb0 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
2cfc0 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75  dAll(WhereLoopBu
2cfd0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29  ilder *pBuilder)
2cfe0 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
2cff0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
2d000 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d  ->pWInfo;.  Bitm
2d010 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a  ask mExtra = 0;.
2d020 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72    Bitmask mPrior
2d030 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62   = 0;.  int iTab
2d040 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
2d050 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
2d060 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
2d070 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2d080 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
2d090 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
2d0a0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
2d0b0 74 20 6e 54 61 62 4c 69 73 74 20 3d 20 70 57 49  t nTabList = pWI
2d0c0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69  nfo->nLevel;.  i
2d0d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2d0e0 4b 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69  K;.  u8 priorJoi
2d0f0 6e 54 79 70 65 20 3d 20 30 3b 0a 20 20 57 68 65  nType = 0;.  Whe
2d100 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20  reLoop *pNew;.. 
2d110 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68   /* Loop over th
2d120 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
2d130 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20  join, from left 
2d140 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e  to right */.  pN
2d150 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
2d160 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  New;.  whereLoop
2d170 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f  Init(pNew);.  fo
2d180 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d  r(iTab=0, pItem=
2d190 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 54 61  pTabList->a; iTa
2d1a0 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54 61 62  b<nTabList; iTab
2d1b0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2d1c0 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69    pNew->iTab = i
2d1d0 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d  Tab;.    pNew->m
2d1e0 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73  askSelf = getMas
2d1f0 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
2d200 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Set, pItem->iCur
2d210 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28  sor);.    if( ((
2d220 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c  pItem->jointype|
2d230 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 29 20 26  priorJoinType) &
2d240 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
2d250 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  SS))!=0 ){.     
2d260 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72   mExtra = mPrior
2d270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f  ;.    }.    prio
2d280 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70 49 74 65  rJoinType = pIte
2d290 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  m->jointype;.   
2d2a0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
2d2b0 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20  Item->pTab) ){. 
2d2c0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2d2d0 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70 42  oopAddVirtual(pB
2d2e0 75 69 6c 64 65 72 29 3b 0a 20 20 20 20 7d 65 6c  uilder);.    }el
2d2f0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  se{.      rc = w
2d300 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
2d310 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72  (pBuilder, mExtr
2d320 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  a);.    }.    if
2d330 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d340 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  ){.      rc = wh
2d350 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75  ereLoopAddOr(pBu
2d360 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a  ilder, mExtra);.
2d370 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72      }.    mPrior
2d380 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65   |= pNew->maskSe
2d390 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c  lf;.    if( rc |
2d3a0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
2d3b0 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ed ) break;.  }.
2d3c0 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
2d3d0 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65  (db, pNew);.  re
2d3e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2d3f0 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72  * Examine a Wher
2d400 65 50 61 74 68 20 28 77 69 74 68 20 74 68 65 20  ePath (with the 
2d410 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  addition of the 
2d420 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20  extra WhereLoop 
2d430 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a 20 70 61  of the 5th.** pa
2d440 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65  rameters) to see
2d450 20 69 66 20 69 74 20 6f 75 74 70 75 74 73 20 72   if it outputs r
2d460 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75 65  ows in the reque
2d470 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a  sted ORDER BY.**
2d480 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77   (or GROUP BY) w
2d490 69 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67  ithout requiring
2d4a0 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74   a separate sort
2d4b0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74   operation.  Ret
2d4c0 75 72 6e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 30  urn:.** .**    0
2d4d0 3a 20 20 4f 52 44 45 52 20 42 59 20 69 73 20 6e  :  ORDER BY is n
2d4e0 6f 74 20 73 61 74 69 73 66 69 65 64 2e 20 20 53  ot satisfied.  S
2d4f0 6f 72 74 69 6e 67 20 72 65 71 75 69 72 65 64 0a  orting required.
2d500 2a 2a 20 20 20 20 31 3a 20 20 4f 52 44 45 52 20  **    1:  ORDER 
2d510 42 59 20 69 73 20 73 61 74 69 73 66 69 65 64 2e  BY is satisfied.
2d520 20 20 20 20 20 20 4f 6d 69 74 20 73 6f 72 74 69        Omit sorti
2d530 6e 67 0a 2a 2a 20 20 20 2d 31 3a 20 20 55 6e 6b  ng.**   -1:  Unk
2d540 6e 6f 77 6e 20 61 74 20 74 68 69 73 20 74 69 6d  nown at this tim
2d550 65 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  e.**.** Note tha
2d560 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  t processing for
2d570 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61   WHERE_GROUPBY a
2d580 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  nd WHERE_DISTINC
2d590 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a  TBY is not as.**
2d5a0 20 73 74 72 69 63 74 2e 20 20 57 69 74 68 20 47   strict.  With G
2d5b0 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
2d5c0 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65  INCT the only re
2d5d0 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61  quirement is tha
2d5e0 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20  t.** equivalent 
2d5f0 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65  rows appear imme
2d600 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74  diately adjacent
2d610 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e   to one another.
2d620 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e    GROUP BY.** an
2d630 64 20 44 49 53 54 49 4e 54 20 64 6f 20 6e 6f 74  d DISTINT do not
2d640 20 72 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f   require rows to
2d650 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70   appear in any p
2d660 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20  articular order 
2d670 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71  as long.** as eq
2d680 75 69 76 65 6c 65 6e 74 20 72 6f 77 73 20 61 72  uivelent rows ar
2d690 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68  e grouped togeth
2d6a0 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52  er.  Thus for GR
2d6b0 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49  OUP BY and DISTI
2d6c0 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65  NCT.** the pOrde
2d6d0 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65  rBy terms can be
2d6e0 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20   matched in any 
2d6f0 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44  order.  With ORD
2d700 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70  ER BY, the .** p
2d710 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75  OrderBy terms mu
2d720 73 74 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e  st be matched in
2d730 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d   strict left-to-
2d740 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a  right order..*/.
2d750 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
2d760 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
2d770 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66  erBy(.  WhereInf
2d780 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a  o *pWInfo,    /*
2d790 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
2d7a0 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
2d7b0 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
2d7c0 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
2d7d0 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54  P BY or DISTINCT
2d7e0 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b   clause to check
2d7f0 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
2d800 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54  *pPath,     /* T
2d810 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f 20  he WherePath to 
2d820 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77  check */.  u16 w
2d830 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
2d840 20 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69   /* Might contai
2d850 6e 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  n WHERE_GROUPBY 
2d860 6f 72 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  or WHERE_DISTINC
2d870 54 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f  TBY */.  u16 nLo
2d880 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  op,            /
2d890 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
2d8a0 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c  ies in pPath->aL
2d8b0 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  oop[] */.  Where
2d8c0 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20  Loop *pLast,    
2d8d0 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68 65   /* Add this Whe
2d8e0 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e  reLoop to the en
2d8f0 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  d of pPath->aLoo
2d900 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  p[] */.  Bitmask
2d910 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f   *pRevMask     /
2d920 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57  * OUT: Mask of W
2d930 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e  hereLoops to run
2d940 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
2d950 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76  r */.){.  u8 rev
2d960 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Set;            
2d970 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76 20 69  /* True if rev i
2d980 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20  s known */.  u8 
2d990 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
2d9a0 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20     /* Composite 
2d9b0 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20  sort order */.  
2d9c0 75 38 20 72 65 76 49 64 78 3b 20 20 20 20 20 20  u8 revIdx;      
2d9d0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
2d9e0 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75  ort order */.  u
2d9f0 38 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  8 isOrderDistinc
2da00 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f  t;   /* All prio
2da10 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65  r WhereLoops are
2da20 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20   order-distinct 
2da30 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74  */.  u8 distinct
2da40 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72  Columns;   /* Tr
2da50 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68  ue if the loop h
2da60 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55  as UNIQUE NOT NU
2da70 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  LL columns */.  
2da80 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20  u8 isMatch;     
2da90 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e        /* iColumn
2daa0 20 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d 20   matches a term 
2dab0 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
2dac0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20  clause */.  u16 
2dad0 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20  nKeyCol;        
2dae0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2daf0 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78  olumns in pIndex
2db00 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72   */.  u16 nOrder
2db10 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
2db20 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74  umber terms in t
2db30 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2db40 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f  se */.  int iLoo
2db50 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
2db60 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c   Index of WhereL
2db70 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65 69  oop in pPath bei
2db80 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ng processed */.
2db90 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
2dba0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2dbb0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
2dbc0 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
2dbd0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
2dbe0 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74  mber for current
2dbf0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20   WhereLoop */.  
2dc00 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  int iColumn;    
2dc10 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d        /* A colum
2dc20 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20  n number within 
2dc30 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20  table iCur */.  
2dc40 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
2dc50 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74   = 0; /* Current
2dc60 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67   WhereLoop being
2dc70 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20   processed. */. 
2dc80 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
2dc90 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67  m;     /* A sing
2dca0 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  le term of the W
2dcb0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
2dcc0 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20   Expr *pOBExpr; 
2dcd0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
2dce0 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  ression from the
2dcf0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2dd00 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
2dd10 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43  Coll;       /* C
2dd20 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20  OLLATE function 
2dd30 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59  from an ORDER BY
2dd40 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a   clause term */.
2dd50 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
2dd60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
2dd70 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
2dd80 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20  with pLoop */.  
2dd90 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
2dda0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
2ddb0 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
2ddc0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42  onnection */.  B
2ddd0 69 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30  itmask obSat = 0
2dde0 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
2ddf0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73  ORDER BY terms s
2de00 61 74 69 73 66 69 65 64 20 73 6f 20 66 61 72 20  atisfied so far 
2de10 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44  */.  Bitmask obD
2de20 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61  one;       /* Ma
2de30 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20  sk of all ORDER 
2de40 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69  BY terms */.  Bi
2de50 74 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69  tmask orderDisti
2de60 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73  nctMask;  /* Mas
2de70 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72  k of all well-or
2de80 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20  dered loops */. 
2de90 20 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20   Bitmask ready; 
2dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2deb0 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f  Mask of inner lo
2dec0 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ops */..  /*.  *
2ded0 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65  * We say the Whe
2dee0 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72  reLoop is "one-r
2def0 6f 77 22 20 69 66 20 69 74 20 67 65 6e 65 72 61  ow" if it genera
2df00 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  tes no more than
2df10 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66   one.  ** row of
2df20 20 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65 72   output.  A Wher
2df30 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77  eLoop is one-row
2df40 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
2df50 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
2df60 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c  e:.  **  (a) All
2df70 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d   index columns m
2df80 61 74 63 68 20 77 69 74 68 20 57 48 45 52 45 5f  atch with WHERE_
2df90 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20  COLUMN_EQ..  ** 
2dfa0 20 28 62 29 20 54 68 65 20 69 6e 64 65 78 20 69   (b) The index i
2dfb0 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e  s unique.  ** An
2dfc0 79 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68  y WhereLoop with
2dfd0 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   an WHERE_COLUMN
2dfe0 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  _EQ constraint o
2dff0 6e 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f  n the rowid is o
2e000 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65  ne-row..  ** Eve
2e010 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65  ry one-row Where
2e020 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74  Loop will have t
2e030 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20  he WHERE_ONEROW 
2e040 62 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61  bit set in wsFla
2e050 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  gs..  **.  ** We
2e060 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f   say the WhereLo
2e070 6f 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73  op is "order-dis
2e080 74 69 6e 63 74 22 20 69 66 20 74 68 65 20 73 65  tinct" if the se
2e090 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  t of columns fro
2e0a0 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72  m.  ** that Wher
2e0b0 65 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69  eLoop that are i
2e0c0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
2e0d0 6c 61 75 73 65 20 61 72 65 20 64 69 66 66 65 72  lause are differ
2e0e0 65 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20  ent for every.  
2e0f0 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68  ** row of the Wh
2e100 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20  ereLoop.  Every 
2e110 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
2e120 70 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  p is automatical
2e130 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69  ly.  ** order-di
2e140 73 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72  stinct.   A Wher
2e150 65 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e  eLoop that has n
2e160 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  o columns in the
2e170 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2e180 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64  .  ** is not ord
2e190 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20  er-distinct. To 
2e1a0 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  be order-distinc
2e1b0 74 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74  t is not quite t
2e1c0 68 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67  he same as being
2e1d0 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e  .  ** UNIQUE sin
2e1e0 63 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75  ce a UNIQUE colu
2e1f0 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20  mn or index can 
2e200 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  have multiple ro
2e210 77 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72  ws that .  ** ar
2e220 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20  e NULL and NULL 
2e230 76 61 6c 75 65 73 20 61 72 65 20 65 71 75 69 76  values are equiv
2e240 61 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75  alent for the pu
2e250 72 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64  rpose of order-d
2e260 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f  istinct..  ** To
2e270 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   be order-distin
2e280 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  ct, the columns 
2e290 6d 75 73 74 20 62 65 20 55 4e 49 51 55 45 20 61  must be UNIQUE a
2e2a0 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a  nd NOT NULL..  *
2e2b0 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64  *.  ** The rowid
2e2c0 20 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20   for a table is 
2e2d0 61 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e  always UNIQUE an
2e2e0 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68  d NOT NULL so wh
2e2f0 65 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20  enever the.  ** 
2e300 72 6f 77 69 64 20 61 70 70 65 61 72 73 20 69 6e  rowid appears in
2e310 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2e320 61 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73  ause, the corres
2e330 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f  ponding WhereLoo
2e340 70 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  p is.  ** automa
2e350 74 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69  tically order-di
2e360 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20  stinct..  */..  
2e370 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
2e380 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 6f 72  !=0 );..  /* Sor
2e390 74 61 62 69 6c 69 74 79 20 6f 66 20 76 69 72 74  tability of virt
2e3a0 75 61 6c 20 74 61 62 6c 65 73 20 69 73 20 64 65  ual tables is de
2e3b0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
2e3c0 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f  xBestIndex metho
2e3d0 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 76 69  d.  ** of the vi
2e3e0 72 74 75 61 6c 20 74 61 62 6c 65 20 69 74 73 65  rtual table itse
2e3f0 6c 66 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73  lf */.  if( pLas
2e400 74 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  t->wsFlags & WHE
2e410 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  RE_VIRTUALTABLE 
2e420 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ){.    testcase(
2e430 20 6e 4c 6f 6f 70 3e 30 20 29 3b 20 20 2f 2a 20   nLoop>0 );  /* 
2e440 54 72 75 65 20 77 68 65 6e 20 6f 75 74 65 72 20  True when outer 
2e450 6c 6f 6f 70 73 20 61 72 65 20 6f 6e 65 2d 72 6f  loops are one-ro
2e460 77 20 61 6e 64 20 6d 61 74 63 68 20 0a 20 20 20  w and match .   
2e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e480 20 20 20 20 20 20 20 2a 2a 20 6e 6f 20 4f 52 44         ** no ORD
2e490 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
2e4a0 20 20 20 72 65 74 75 72 6e 20 70 4c 61 73 74 2d     return pLast-
2e4b0 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65  >u.vtab.isOrdere
2e4c0 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f  d;.  }.  if( nLo
2e4d0 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69  op && Optimizati
2e4e0 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
2e4f0 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78  QLITE_OrderByIdx
2e500 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
2e510 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  ;..  nOrderBy = 
2e520 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
2e530 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72  .  testcase( nOr
2e540 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a  derBy==BMS-1 );.
2e550 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42    if( nOrderBy>B
2e560 4d 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  MS-1 ) return 0;
2e570 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69    /* Cannot opti
2e580 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67  mize overly larg
2e590 65 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20  e ORDER BYs */. 
2e5a0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2e5b0 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d   = 1;.  obDone =
2e5c0 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42   MASKBIT(nOrderB
2e5d0 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73  y)-1;.  orderDis
2e5e0 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20  tinctMask = 0;. 
2e5f0 20 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f   ready = 0;.  fo
2e600 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64  r(iLoop=0; isOrd
2e610 65 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62  erDistinct && ob
2e620 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c  Sat<obDone && iL
2e630 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  oop<=nLoop; iLoo
2e640 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c  p++){.    if( iL
2e650 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d  oop>0 ) ready |=
2e660 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
2e670 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c  ;.    pLoop = iL
2e680 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74  oop<nLoop ? pPat
2e690 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20  h->aLoop[iLoop] 
2e6a0 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20 61 73 73  : pLast;.    ass
2e6b0 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
2e6c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
2e6d0 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b  TUALTABLE)==0 );
2e6e0 0a 20 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e  .    iCur = pWIn
2e6f0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
2e700 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75  pLoop->iTab].iCu
2e710 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61  rsor;..    /* Ma
2e720 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52  rk off any ORDER
2e730 20 42 59 20 74 65 72 6d 20 58 20 74 68 61 74 20   BY term X that 
2e740 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  is a column in t
2e750 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20  he table of.    
2e760 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  ** the current l
2e770 6f 6f 70 20 66 6f 72 20 77 68 69 63 68 20 74 68  oop for which th
2e780 65 72 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74  ere is term in t
2e790 68 65 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20  he WHERE.    ** 
2e7a0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
2e7b0 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20  rm X IS NULL or 
2e7c0 58 3d 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e  X=? that referen
2e7d0 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20  ce only outer.  
2e7e0 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20    ** loops..    
2e7f0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
2e800 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
2e810 7b 0a 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b  {.      if( MASK
2e820 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29  BIT(i) & obSat )
2e830 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2e840 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74   pOBExpr = sqlit
2e850 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
2e860 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  e(pOrderBy->a[i]
2e870 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  .pExpr);.      i
2e880 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d  f( pOBExpr->op!=
2e890 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74  TK_COLUMN ) cont
2e8a0 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
2e8b0 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  pOBExpr->iTable!
2e8c0 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
2e8d0 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
2e8e0 66 69 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f  findTerm(&pWInfo
2e8f0 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42  ->sWC, iCur, pOB
2e900 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20  Expr->iColumn,. 
2e910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e920 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20 57 4f        ~ready, WO
2e930 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30  _EQ|WO_ISNULL, 0
2e940 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
2e950 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  rm==0 ) continue
2e960 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
2e970 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f  rm->eOperator&WO
2e980 5f 45 51 29 21 3d 30 20 26 26 20 70 4f 42 45 78  _EQ)!=0 && pOBEx
2e990 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29  pr->iColumn>=0 )
2e9a0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
2e9b0 63 68 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20  char *z1, *z2;. 
2e9c0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
2e9d0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
2e9e0 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  q(pWInfo->pParse
2e9f0 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  , pOrderBy->a[i]
2ea00 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
2ea10 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
2ea20 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
2ea30 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31 20  oll;.        z1 
2ea40 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a  = pColl->zName;.
2ea50 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
2ea60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
2ea70 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  eq(pWInfo->pPars
2ea80 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29  e, pTerm->pExpr)
2ea90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
2eaa0 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
2eab0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
2eac0 20 20 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c        z2 = pColl
2ead0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
2eae0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
2eaf0 43 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29  Cmp(z1, z2)!=0 )
2eb00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2eb10 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74 20 7c   }.      obSat |
2eb20 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  = MASKBIT(i);.  
2eb30 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4c    }..    if( (pL
2eb40 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2eb50 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20  HERE_ONEROW)==0 
2eb60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  ){.      if( pLo
2eb70 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2eb80 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20  ERE_IPK ){.     
2eb90 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20     pIndex = 0;. 
2eba0 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d         nKeyCol =
2ebb0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
2ebc0 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c  if( (pIndex = pL
2ebd0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
2ebe0 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65  dex)==0 || pInde
2ebf0 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b  x->bUnordered ){
2ec00 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2ec10 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
2ec20 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20          nKeyCol 
2ec30 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  = pIndex->nKeyCo
2ec40 6c 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64  l;.        isOrd
2ec50 65 72 44 69 73 74 69 6e 63 74 20 3d 20 70 49 6e  erDistinct = pIn
2ec60 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  dex->onError!=OE
2ec70 5f 4e 6f 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  _None;.      }..
2ec80 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
2ec90 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e  rough all column
2eca0 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  s of the index a
2ecb0 6e 64 20 64 65 61 6c 20 77 69 74 68 20 74 68 65  nd deal with the
2ecc0 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74   ones.      ** t
2ecd0 68 61 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73  hat are not cons
2ece0 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72  trained by == or
2ecf0 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   IN..      */.  
2ed00 20 20 20 20 72 65 76 20 3d 20 72 65 76 53 65 74      rev = revSet
2ed10 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 69 73 74   = 0;.      dist
2ed20 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b  inctColumns = 0;
2ed30 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
2ed40 6a 3c 3d 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29  j<=nKeyCol; j++)
2ed50 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62 4f 6e  {.        u8 bOn
2ed60 63 65 3b 20 20 20 2f 2a 20 54 72 75 65 20 74 6f  ce;   /* True to
2ed70 20 72 75 6e 20 74 68 65 20 4f 52 44 45 52 20 42   run the ORDER B
2ed80 59 20 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f  Y search loop */
2ed90 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69  ..        /* Ski
2eda0 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53  p over == and IS
2edb0 20 4e 55 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a 20   NULL terms */. 
2edc0 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f         if( j<pLo
2edd0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a  op->u.btree.nEq.
2ede0 20 20 20 20 20 20 20 20 20 26 26 20 28 28 69 20           && ((i 
2edf0 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
2ee00 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20 26  j]->eOperator) &
2ee10 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c   (WO_EQ|WO_ISNUL
2ee20 4c 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 29  L))!=0.        )
2ee30 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2ee40 69 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  i & WO_ISNULL ){
2ee50 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
2ee60 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69  tcase( isOrderDi
2ee70 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
2ee80 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
2ee90 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
2eea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2eeb0 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20   continue;  .   
2eec0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2eed0 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d  /* Get the colum
2eee0 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20  n number in the 
2eef0 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20  table (iColumn) 
2ef00 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a 20  and sort order. 
2ef10 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49 64         ** (revId
2ef20 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68 20  x) for the j-th 
2ef30 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
2ef40 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  dex..        */.
2ef50 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 6e 4b          if( j<nK
2ef60 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  eyCol ){.       
2ef70 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 69 6e 64     /* Normal ind
2ef80 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  ex columns */.  
2ef90 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20          iColumn 
2efa0 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  = pIndex->aiColu
2efb0 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20  mn[j];.         
2efc0 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78   revIdx = pIndex
2efd0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b  ->aSortOrder[j];
2efe0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2eff0 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e  Column==pIndex->
2f000 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20  pTable->iPKey ) 
2f010 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
2f020 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f030 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 52 4f         /* The RO
2f040 57 49 44 20 63 6f 6c 75 6d 6e 20 61 74 20 74 68  WID column at th
2f050 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  e end */.       
2f060 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 4b     assert( j==nK
2f070 65 79 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20  eyCol );.       
2f080 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b     iColumn = -1;
2f090 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64  .          revId
2f0a0 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  x = 0;.        }
2f0b0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ..        /* An 
2f0c0 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f  unconstrained co
2f0d0 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67 68 74 20  lumn that might 
2f0e0 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68  be NULL means th
2f0f0 61 74 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  at this.        
2f100 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ** WhereLoop is 
2f110 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64  not well-ordered
2f120 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
2f130 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72       if( isOrder
2f140 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20 20  Distinct.       
2f150 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a    && iColumn>=0.
2f160 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d 70           && j>=p
2f170 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
2f180 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49  q.         && pI
2f190 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  ndex->pTable->aC
2f1a0 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e  ol[iColumn].notN
2f1b0 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 29  ull==0.        )
2f1c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72  {.          isOr
2f1d0 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  derDistinct = 0;
2f1e0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2f1f0 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20      /* Find the 
2f200 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 74 68  ORDER BY term th
2f210 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  at corresponds t
2f220 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d  o the j-th colum
2f230 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  n.        ** of 
2f240 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 61 6e  the index and an
2f250 64 20 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45  d mark that ORDE
2f260 52 20 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20  R BY term off . 
2f270 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2f280 20 20 62 4f 6e 63 65 20 3d 20 31 3b 0a 20 20 20    bOnce = 1;.   
2f290 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30       isMatch = 0
2f2a0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
2f2b0 30 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f  0; bOnce && i<nO
2f2c0 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
2f2d0 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b          if( MASK
2f2e0 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29  BIT(i) & obSat )
2f2f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2f300 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73       pOBExpr = s
2f310 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
2f320 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e  llate(pOrderBy->
2f330 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
2f340 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2f350 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
2f360 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20  ERE_GROUPBY );. 
2f370 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2f380 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  e( wctrlFlags & 
2f390 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
2f3a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2f3b0 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
2f3c0 28 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57  (WHERE_GROUPBY|W
2f3d0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29  HERE_DISTINCTBY)
2f3e0 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30  )==0 ) bOnce = 0
2f3f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2f400 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  pOBExpr->op!=TK_
2f410 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75  COLUMN ) continu
2f420 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
2f430 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65   pOBExpr->iTable
2f440 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  !=iCur ) continu
2f450 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
2f460 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
2f470 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e  n!=iColumn ) con
2f480 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2f490 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20   if( iColumn>=0 
2f4a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
2f4b0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
2f4c0 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
2f4d0 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  ->pParse, pOrder
2f4e0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
2f4f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2f500 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
2f510 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
2f520 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2f530 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2f540 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49  pColl->zName, pI
2f550 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29  ndex->azColl[j])
2f560 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
2f570 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f580 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
2f590 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
2f5a0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
2f5b0 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63        if( isMatc
2f5c0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  h ){.          i
2f5d0 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  f( iColumn<0 ){.
2f5e0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2f5f0 63 61 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f  case( distinctCo
2f600 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20  lumns==0 );.    
2f610 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74          distinct
2f620 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20  Columns = 1;.   
2f630 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f640 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
2f650 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20  BIT(i);.        
2f660 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
2f670 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2f680 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b  E_GROUPBY)==0 ){
2f690 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
2f6a0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f  Make sure the so
2f6b0 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70  rt order is comp
2f6c0 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44  atible in an ORD
2f6d0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  ER BY clause..  
2f6e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72            ** Sor
2f6f0 74 20 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c  t order is irrel
2f700 65 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55  evant for a GROU
2f710 50 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a  P BY clause. */.
2f720 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2f730 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20  revSet ){.      
2f740 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65 76          if( (rev
2f750 20 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64   ^ revIdx)!=pOrd
2f760 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
2f770 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rder ) return 0;
2f780 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
2f790 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2f7a0 20 20 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e    rev = revIdx ^
2f7b0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
2f7c0 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  sortOrder;.     
2f7d0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76           if( rev
2f7e0 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20   ) *pRevMask |= 
2f7f0 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a  MASKBIT(iLoop);.
2f800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2f810 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  vSet = 1;.      
2f820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f830 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
2f840 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2f850 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a  No match found *
2f860 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2f870 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f  j==0 || j<nKeyCo
2f880 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
2f890 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
2f8a0 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b  erDistinct!=0 );
2f8b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
2f8c0 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
2f8d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f8e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2f8f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2f900 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65   /* end Loop ove
2f910 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75  r all index colu
2f920 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  mns */.      if(
2f930 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
2f940 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
2f950 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
2f960 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  tinct==0 );.    
2f970 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
2f980 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nct = 1;.      }
2f990 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66  .    } /* end-if
2f9a0 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a   not one-row */.
2f9b0 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66  .    /* Mark off
2f9c0 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52   any other ORDER
2f9d0 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 72   BY terms that r
2f9e0 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a  eference pLoop *
2f9f0 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64 65  /.    if( isOrde
2fa00 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  rDistinct ){.   
2fa10 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74     orderDistinct
2fa20 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d  Mask |= pLoop->m
2fa30 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66  askSelf;.      f
2fa40 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
2fa50 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
2fa60 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20    Expr *p;.     
2fa70 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
2fa80 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
2fa90 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20  inue;.        p 
2faa0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
2fab0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
2fac0 69 66 28 20 28 65 78 70 72 54 61 62 6c 65 55 73  if( (exprTableUs
2fad0 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  age(&pWInfo->sMa
2fae0 73 6b 53 65 74 2c 20 70 29 26 7e 6f 72 64 65 72  skSet, p)&~order
2faf0 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30  DistinctMask)==0
2fb00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 62   ){.          ob
2fb10 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  Sat |= MASKBIT(i
2fb20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2fb30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f     }.    }.  } /
2fb40 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f  * End the loop o
2fb50 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  ver all WhereLoo
2fb60 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f  ps from outer-mo
2fb70 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72  st down to inner
2fb80 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f  -most */.  if( o
2fb90 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72  bSat==obDone ) r
2fba0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 21  eturn 1;.  if( !
2fbb0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2fbc0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
2fbd0 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64  turn -1;.}..#ifd
2fbe0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
2fbf0 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62  ABLED./* For deb
2fc00 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a  ugging use only:
2fc10 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
2fc20 20 63 68 61 72 20 2a 77 68 65 72 65 50 61 74 68   char *wherePath
2fc30 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a  Name(WherePath *
2fc40 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70  pPath, int nLoop
2fc50 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61  , WhereLoop *pLa
2fc60 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  st){.  static ch
2fc70 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20  ar zName[65];.  
2fc80 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
2fc90 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b  ; i<nLoop; i++){
2fca0 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74   zName[i] = pPat
2fcb0 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64  h->aLoop[i]->cId
2fcc0 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20  ; }.  if( pLast 
2fcd0 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70  ) zName[i++] = p
2fce0 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61  Last->cId;.  zNa
2fcf0 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74  me[i] = 0;.  ret
2fd00 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e  urn zName;.}.#en
2fd10 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  dif.../*.** Give
2fd20 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68  n the list of Wh
2fd30 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
2fd40 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  at pWInfo->pLoop
2fd50 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  s, this routine.
2fd60 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ** attempts to f
2fd70 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  ind the lowest c
2fd80 6f 73 74 20 70 61 74 68 20 74 68 61 74 20 76 69  ost path that vi
2fd90 73 69 74 73 20 65 61 63 68 20 57 68 65 72 65 4c  sits each WhereL
2fda0 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68  oop.** once.  Th
2fdb0 69 73 20 70 61 74 68 20 69 73 20 74 68 65 6e 20  is path is then 
2fdc0 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20  loaded into the 
2fdd0 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f  pWInfo->a[].pWLo
2fde0 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a  op fields..**.**
2fdf0 20 41 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   Assume that the
2fe00 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
2fe10 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68 61   output rows tha
2fe20 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62  t will need to b
2fe30 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c  e sorted.** will
2fe40 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e 20   be nRowEst (in 
2fe50 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70 72  the 10*log2 repr
2fe60 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72  esentation).  Or
2fe70 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67  , ignore sorting
2fe80 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52 6f  .** costs if nRo
2fe90 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52  wEst==0..**.** R
2fea0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
2feb0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53 51  on success or SQ
2fec0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20  LITE_NOMEM of a 
2fed0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
2fee0 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  n.** error occur
2fef0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2ff00 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72   wherePathSolver
2ff10 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
2ff20 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45  fo, LogEst nRowE
2ff30 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f  st){.  int mxCho
2ff40 69 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ice;            
2ff50 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
2ff60 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f  er of simultaneo
2ff70 75 73 20 70 61 74 68 73 20 74 72 61 63 6b 65 64  us paths tracked
2ff80 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b   */.  int nLoop;
2ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ffa0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
2ffb0 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a  ms in the join *
2ffc0 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
2ffd0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2ffe0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
2fff0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
30000 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
30010 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
30020 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
30030 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20  int iLoop;      
30040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
30050 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20 74  p counter over t
30060 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
30070 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69  join */.  int ii
30080 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20  , jj;           
30090 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
300a0 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  ters */.  int mx
300b0 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  I = 0;          
300c0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
300d0 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20 72 65  next entry to re
300e0 70 6c 61 63 65 20 2a 2f 0a 20 20 4c 6f 67 45 73  place */.  LogEs
300f0 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20  t rCost;        
30100 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20       /* Cost of 
30110 61 20 70 61 74 68 20 2a 2f 0a 20 20 4c 6f 67 45  a path */.  LogE
30120 73 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20  st nOut;        
30130 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
30140 6f 66 20 6f 75 74 70 75 74 73 20 2a 2f 0a 20 20  of outputs */.  
30150 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74 20 3d 20  LogEst mxCost = 
30160 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78  0;        /* Max
30170 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73  imum cost of a s
30180 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20  et of paths */. 
30190 20 4c 6f 67 45 73 74 20 6d 78 4f 75 74 20 3d 20   LogEst mxOut = 
301a0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  0;         /* Ma
301b0 78 69 6d 75 6d 20 6e 4f 75 74 20 76 61 6c 75 65  ximum nOut value
301c0 20 6f 6e 20 74 68 65 20 73 65 74 20 6f 66 20 70   on the set of p
301d0 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  aths */.  LogEst
301e0 20 72 53 6f 72 74 43 6f 73 74 3b 20 20 20 20 20   rSortCost;     
301f0 20 20 20 20 2f 2a 20 43 6f 73 74 20 74 6f 20 64      /* Cost to d
30200 6f 20 61 20 73 6f 72 74 20 2a 2f 0a 20 20 69 6e  o a sort */.  in
30210 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20  t nTo, nFrom;   
30220 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
30230 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69  r of valid entri
30240 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20  es in aTo[] and 
30250 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65  aFrom[] */.  Whe
30260 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20  rePath *aFrom;  
30270 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46         /* All nF
30280 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68 65  rom paths at the
30290 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c 20   previous level 
302a0 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
302b0 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  aTo;           /
302c0 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20 70  * The nTo best p
302d0 61 74 68 73 20 61 74 20 74 68 65 20 63 75 72 72  aths at the curr
302e0 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57  ent level */.  W
302f0 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b  herePath *pFrom;
30300 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
30310 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b  lement of aFrom[
30320 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f  ] that we are wo
30330 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68  rking on */.  Wh
30340 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20 20  erePath *pTo;   
30350 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c          /* An el
30360 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74  ement of aTo[] t
30370 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69  hat we are worki
30380 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ng on */.  Where
30390 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20  Loop *pWLoop;   
303a0 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
303b0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
303c0 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c  ects */.  WhereL
303d0 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20  oop **pX;       
303e0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64      /* Used to d
303f0 69 76 79 20 75 70 20 74 68 65 20 70 53 70 61 63  ivy up the pSpac
30400 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 63 68  e memory */.  ch
30410 61 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20  ar *pSpace;     
30420 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
30430 72 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64  rary memory used
30440 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
30450 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
30460 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
30470 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
30480 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49  b;.  nLoop = pWI
30490 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f  nfo->nLevel;.  /
304a0 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69  * TUNING: For si
304b0 6d 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f 6e  mple queries, on
304c0 6c 79 20 74 68 65 20 62 65 73 74 20 70 61 74 68  ly the best path
304d0 20 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a   is tracked..  *
304e0 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e  * For 2-way join
304f0 73 2c 20 74 68 65 20 35 20 62 65 73 74 20 70 61  s, the 5 best pa
30500 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64  ths are followed
30510 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73  ..  ** For joins
30520 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74 61   of 3 or more ta
30530 62 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65 20  bles, track the 
30540 31 30 20 62 65 73 74 20 70 61 74 68 73 20 2a 2f  10 best paths */
30550 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e  .  mxChoice = (n
30560 4c 6f 6f 70 3d 3d 31 29 20 3f 20 31 20 3a 20 28  Loop==1) ? 1 : (
30570 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31  nLoop==2 ? 5 : 1
30580 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c  0);.  assert( nL
30590 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61  oop<=pWInfo->pTa
305a0 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
305b0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30   WHERETRACE(0x00
305c0 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20  2, ("---- begin 
305d0 73 6f 6c 76 65 72 5c 6e 22 29 29 3b 0a 0a 20 20  solver\n"));..  
305e0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
305f0 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63 65  initialize space
30600 20 66 6f 72 20 61 54 6f 20 61 6e 64 20 61 46 72   for aTo and aFr
30610 6f 6d 20 2a 2f 0a 20 20 69 69 20 3d 20 28 73 69  om */.  ii = (si
30620 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68 29 2b  zeof(WherePath)+
30630 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
30640 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69  *)*nLoop)*mxChoi
30650 63 65 2a 32 3b 0a 20 20 70 53 70 61 63 65 20 3d  ce*2;.  pSpace =
30660 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
30670 52 61 77 28 64 62 2c 20 69 69 29 3b 0a 20 20 69  Raw(db, ii);.  i
30680 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20 72  f( pSpace==0 ) r
30690 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
306a0 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68 65  EM;.  aTo = (Whe
306b0 72 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b 0a  rePath*)pSpace;.
306c0 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78    aFrom = aTo+mx
306d0 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74  Choice;.  memset
306e0 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f  (aFrom, 0, sizeo
306f0 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20  f(aFrom[0]));.  
30700 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a  pX = (WhereLoop*
30710 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63  *)(aFrom+mxChoic
30720 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43  e);.  for(ii=mxC
30730 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61  hoice*2, pFrom=a
30740 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20  To; ii>0; ii--, 
30750 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e  pFrom++, pX += n
30760 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d  Loop){.    pFrom
30770 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20  ->aLoop = pX;.  
30780 7d 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65  }..  /* Seed the
30790 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73   search with a s
307a0 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20  ingle WherePath 
307b0 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20  containing zero 
307c0 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a  WhereLoops..  **
307d0 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f  .  ** TUNING: Do
307e0 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d   not let the num
307f0 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
30800 73 20 67 6f 20 61 62 6f 76 65 20 32 35 2e 20 20  s go above 25.  
30810 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a  If the cost.  **
30820 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e   of computing an
30830 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
30840 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63   is not paid bac
30850 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  k within the fir
30860 73 74 20 32 35 0a 20 20 2a 2a 20 72 6f 77 73 2c  st 25.  ** rows,
30870 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65   then do not use
30880 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
30890 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d  ndex. */.  aFrom
308a0 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70  [0].nRow = MIN(p
308b0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
308c0 70 2c 20 34 36 29 3b 20 20 61 73 73 65 72 74 28  p, 46);  assert(
308d0 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   46==sqlite3LogE
308e0 73 74 28 32 35 29 20 29 3b 0a 20 20 6e 46 72 6f  st(25) );.  nFro
308f0 6d 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 50 72 65  m = 1;..  /* Pre
30900 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 73 74  compute the cost
30910 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65 20   of sorting the 
30920 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 73 65 74  final result set
30930 2c 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 0a  , if the caller.
30940 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 57    ** to sqlite3W
30950 68 65 72 65 42 65 67 69 6e 28 29 20 77 61 73 20  hereBegin() was 
30960 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20  concerned about 
30970 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 72 53 6f  sorting */.  rSo
30980 72 74 43 6f 73 74 20 3d 20 30 3b 0a 20 20 69 66  rtCost = 0;.  if
30990 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
309a0 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74  By==0 || nRowEst
309b0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d  ==0 ){.    aFrom
309c0 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 56 61 6c  [0].isOrderedVal
309d0 69 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  id = 1;.  }else{
309e0 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  .    /* TUNING: 
309f0 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f  Estimated cost o
30a00 66 20 73 6f 72 74 69 6e 67 20 69 73 20 34 38 2a  f sorting is 48*
30a10 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20  N*log2(N) where 
30a20 4e 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  N is the.    ** 
30a30 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
30a40 20 72 6f 77 73 2e 20 54 68 65 20 34 38 20 69 73   rows. The 48 is
30a50 20 74 68 65 20 65 78 70 65 63 74 65 64 20 73 69   the expected si
30a60 7a 65 20 6f 66 20 61 20 72 6f 77 20 74 6f 20 73  ze of a row to s
30a70 6f 72 74 2e 20 0a 20 20 20 20 2a 2a 20 46 49 58  ort. .    ** FIX
30a80 4d 45 3a 20 20 63 6f 6d 70 75 74 65 20 61 20 62  ME:  compute a b
30a90 65 74 74 65 72 20 65 73 74 69 6d 61 74 65 20 6f  etter estimate o
30aa0 66 20 74 68 65 20 34 38 20 6d 75 6c 74 69 70 6c  f the 48 multipl
30ab0 69 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ier based on the
30ac0 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 73  .    ** result s
30ad0 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  et expressions. 
30ae0 2a 2f 0a 20 20 20 20 72 53 6f 72 74 43 6f 73 74  */.    rSortCost
30af0 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 65 73 74   = nRowEst + est
30b00 4c 6f 67 28 6e 52 6f 77 45 73 74 29 3b 0a 20 20  Log(nRowEst);.  
30b10 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30    WHERETRACE(0x0
30b20 30 32 2c 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63  02,("---- sort c
30b30 6f 73 74 3d 25 2d 33 64 5c 6e 22 2c 20 72 53 6f  ost=%-3d\n", rSo
30b40 72 74 43 6f 73 74 29 29 3b 0a 20 20 7d 0a 0a 20  rtCost));.  }.. 
30b50 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63   /* Compute succ
30b60 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20  essively longer 
30b70 57 68 65 72 65 50 61 74 68 73 20 75 73 69 6e 67  WherePaths using
30b80 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 67 65   the previous ge
30b90 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66  neration.  ** of
30ba0 20 57 68 65 72 65 50 61 74 68 73 20 61 73 20 74   WherePaths as t
30bb0 68 65 20 62 61 73 69 73 20 66 6f 72 20 74 68 65  he basis for the
30bc0 20 6e 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61   next.  Keep tra
30bd0 63 6b 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69  ck of the mxChoi
30be0 63 65 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74  ce.  ** best pat
30bf0 68 73 20 61 74 20 65 61 63 68 20 67 65 6e 65 72  hs at each gener
30c00 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69  ation */.  for(i
30c10 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c  Loop=0; iLoop<nL
30c20 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20  oop; iLoop++){. 
30c30 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20     nTo = 0;.    
30c40 66 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d  for(ii=0, pFrom=
30c50 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b  aFrom; ii<nFrom;
30c60 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b   ii++, pFrom++){
30c70 0a 20 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f  .      for(pWLoo
30c80 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  p=pWInfo->pLoops
30c90 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70  ; pWLoop; pWLoop
30ca0 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f  =pWLoop->pNextLo
30cb0 6f 70 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74  op){.        Bit
30cc0 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 0a 20 20  mask maskNew;.  
30cd0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65        Bitmask re
30ce0 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20  vMask = 0;.     
30cf0 20 20 20 75 38 20 69 73 4f 72 64 65 72 65 64 56     u8 isOrderedV
30d00 61 6c 69 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73  alid = pFrom->is
30d10 4f 72 64 65 72 65 64 56 61 6c 69 64 3b 0a 20 20  OrderedValid;.  
30d20 20 20 20 20 20 20 75 38 20 69 73 4f 72 64 65 72        u8 isOrder
30d30 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72  ed = pFrom->isOr
30d40 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 69  dered;.        i
30d50 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72  f( (pWLoop->prer
30d60 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73  eq & ~pFrom->mas
30d70 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74  kLoop)!=0 ) cont
30d80 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
30d90 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  ( (pWLoop->maskS
30da0 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73  elf & pFrom->mas
30db0 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74  kLoop)!=0 ) cont
30dc0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a  inue;.        /*
30dd0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
30de0 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e 64  pWLoop is a cand
30df0 69 64 61 74 65 20 74 6f 20 62 65 20 74 68 65 20  idate to be the 
30e00 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20  next loop. .    
30e10 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69      ** Compute i
30e20 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20  ts cost */.     
30e30 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69 74     rCost = sqlit
30e40 65 33 4c 6f 67 45 73 74 41 64 64 28 70 57 4c 6f  e3LogEstAdd(pWLo
30e50 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f  op->rSetup,pWLoo
30e60 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d  p->rRun + pFrom-
30e70 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20  >nRow);.        
30e80 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c  rCost = sqlite3L
30e90 6f 67 45 73 74 41 64 64 28 72 43 6f 73 74 2c 20  ogEstAdd(rCost, 
30ea0 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 29 3b 0a 20  pFrom->rCost);. 
30eb0 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 70 46         nOut = pF
30ec0 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f  rom->nRow + pWLo
30ed0 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20  op->nOut;.      
30ee0 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f    maskNew = pFro
30ef0 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57  m->maskLoop | pW
30f00 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
30f10 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73 4f          if( !isO
30f20 72 64 65 72 65 64 56 61 6c 69 64 20 29 7b 0a 20  rderedValid ){. 
30f30 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28           switch(
30f40 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
30f50 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66  iesOrderBy(pWInf
30f60 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
30f70 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
30f80 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f  ->pOrderBy, pFro
30f90 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  m, pWInfo->wctrl
30fa0 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  Flags,.         
30fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 4c                iL
30fc0 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72 65  oop, pWLoop, &re
30fd0 76 4d 61 73 6b 29 20 29 7b 0a 20 20 20 20 20 20  vMask) ){.      
30fe0 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 20 2f        case 1:  /
30ff0 2a 20 59 65 73 2e 20 20 70 46 72 6f 6d 2b 70 57  * Yes.  pFrom+pW
31000 4c 6f 6f 70 20 64 6f 65 73 20 73 61 74 69 73 66  Loop does satisf
31010 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  y the ORDER BY c
31020 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20  lause */.       
31030 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
31040 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
31050 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c      isOrderedVal
31060 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  id = 1;.        
31070 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
31080 20 20 20 20 20 20 20 20 20 63 61 73 65 20 30 3a           case 0:
31090 20 20 2f 2a 20 4e 6f 2e 20 20 70 46 72 6f 6d 2b    /* No.  pFrom+
310a0 70 57 4c 6f 6f 70 20 77 69 6c 6c 20 72 65 71 75  pWLoop will requ
310b0 69 72 65 20 61 20 73 65 70 61 72 61 74 65 20 73  ire a separate s
310c0 6f 72 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ort */.         
310d0 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d       isOrdered =
310e0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
310f0 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64    isOrderedValid
31100 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
31110 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69      rCost = sqli
31120 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 43 6f  te3LogEstAdd(rCo
31130 73 74 2c 20 72 53 6f 72 74 43 6f 73 74 29 3b 0a  st, rSortCost);.
31140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
31150 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
31160 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20 43 61 6e   default: /* Can
31170 6e 6f 74 20 74 65 6c 6c 20 79 65 74 2e 20 20 54  not tell yet.  T
31180 72 79 20 61 67 61 69 6e 20 6f 6e 20 74 68 65 20  ry again on the 
31190 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 2a  next iteration *
311a0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
311b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
311c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
311d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 4d  {.          revM
311e0 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76  ask = pFrom->rev
311f0 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Loop;.        }.
31200 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
31210 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f 6f   to see if pWLoo
31220 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64 65  p should be adde
31230 64 20 74 6f 20 74 68 65 20 6d 78 43 68 6f 69 63  d to the mxChoic
31240 65 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f  e best so far */
31250 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d  .        for(jj=
31260 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e  0, pTo=aTo; jj<n
31270 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29  To; jj++, pTo++)
31280 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
31290 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d  pTo->maskLoop==m
312a0 61 73 6b 4e 65 77 0a 20 20 20 20 20 20 20 20 20  askNew.         
312b0 20 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64 65    && pTo->isOrde
312c0 72 65 64 56 61 6c 69 64 3d 3d 69 73 4f 72 64 65  redValid==isOrde
312d0 72 65 64 56 61 6c 69 64 0a 20 20 20 20 20 20 20  redValid.       
312e0 20 20 20 20 26 26 20 28 28 70 54 6f 2d 3e 72 43      && ((pTo->rC
312f0 6f 73 74 3c 3d 72 43 6f 73 74 20 26 26 20 70 54  ost<=rCost && pT
31300 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20 7c  o->nRow<=nOut) |
31310 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
31320 20 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3e 3d 72    (pTo->rCost>=r
31330 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f  Cost && pTo->nRo
31340 77 3e 3d 6e 4f 75 74 29 29 0a 20 20 20 20 20 20  w>=nOut)).      
31350 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
31360 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d     testcase( jj=
31370 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20  =nTo-1 );.      
31380 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
31390 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
313a0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
313b0 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20  j>=nTo ){.      
313c0 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43      if( nTo>=mxC
313d0 68 6f 69 63 65 20 26 26 20 72 43 6f 73 74 3e 3d  hoice && rCost>=
313e0 6d 78 43 6f 73 74 20 29 7b 0a 23 69 66 64 65 66  mxCost ){.#ifdef
313f0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
31400 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20 20 20  LED.            
31410 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
31420 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
31430 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
31440 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53  e3DebugPrintf("S
31450 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  kip   %s cost=%-
31460 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
31470 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
31480 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
31490 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
314a0 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
314b0 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  , nOut,.        
314c0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
314d0 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72  redValid ? (isOr
314e0 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e  dered ? 'Y' : 'N
314f0 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
31500 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
31510 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
31520 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
31530 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  }.          /* A
31540 64 64 20 61 20 6e 65 77 20 50 61 74 68 20 74 6f  dd a new Path to
31550 20 74 68 65 20 61 54 6f 5b 5d 20 73 65 74 20 2a   the aTo[] set *
31560 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
31570 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a  nTo<mxChoice ){.
31580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
31590 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
315a0 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74 20   of the aTo set 
315b0 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  by one */.      
315c0 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b        jj = nTo++
315d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
315e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
315f0 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61  * New path repla
31600 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f  ces the prior wo
31610 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e  rst to keep coun
31620 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65  t below mxChoice
31630 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
31640 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20  jj = mxI;.      
31650 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
31660 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a  pTo = &aTo[jj];.
31670 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
31680 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20  E_ENABLED.      
31690 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
316a0 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
316b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
316c0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
316d0 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74 3d  "New    %s cost=
316e0 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
316f0 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
31700 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
31710 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
31720 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
31730 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  , nOut,.        
31740 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
31750 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65  dValid ? (isOrde
31760 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29  red ? 'Y' : 'N')
31770 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
31780 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
31790 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
317a0 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
317b0 6f 73 74 3c 3d 72 43 6f 73 74 20 26 26 20 70 54  ost<=rCost && pT
317c0 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 20 29 7b  o->nRow<=nOut ){
317d0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
317e0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
317f0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
31800 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
31810 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31820 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
31830 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
31840 20 20 20 20 20 20 20 20 22 53 6b 69 70 20 20 20          "Skip   
31850 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
31860 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
31870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
31880 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
31890 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
318a0 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a  ), rCost, nOut,.
318b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318c0 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64    isOrderedValid
318d0 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20   ? (isOrdered ? 
318e0 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27  'Y' : 'N') : '?'
318f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
31900 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
31910 6e 74 66 28 22 20 20 20 76 73 20 25 73 20 63 6f  ntf("   vs %s co
31920 73 74 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65 72  st=%-3d,%d order
31930 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
31940 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
31950 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
31960 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
31970 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
31980 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31990 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
319a0 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69  dValid ? (pTo->i
319b0 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a  sOrdered ? 'Y' :
319c0 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20   'N') : '?');.  
319d0 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
319e0 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  if.            t
319f0 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43  estcase( pTo->rC
31a00 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20  ost==rCost );.  
31a10 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
31a20 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
31a30 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
31a40 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  se( pTo->rCost==
31a50 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20  rCost+1 );.     
31a60 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 61 6e       /* A new an
31a70 64 20 62 65 74 74 65 72 20 73 63 6f 72 65 20 66  d better score f
31a80 6f 72 20 61 20 70 72 65 76 69 6f 75 73 6c 79 20  or a previously 
31a90 63 72 65 61 74 65 64 20 65 71 75 69 76 61 6c 65  created equivale
31aa0 6e 74 20 70 61 74 68 20 2a 2f 0a 23 69 66 64 65  nt path */.#ifde
31ab0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
31ac0 42 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20 69  BLED.          i
31ad0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
31ae0 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
31af0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
31b00 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
31b10 20 20 20 20 20 20 20 20 20 20 20 20 22 55 70 64              "Upd
31b20 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  ate %s cost=%-3d
31b30 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  ,%3d order=%c",.
31b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b50 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
31b60 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
31b70 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
31b80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31b90 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64    isOrderedValid
31ba0 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20   ? (isOrdered ? 
31bb0 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27  'Y' : 'N') : '?'
31bc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
31bd0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
31be0 66 28 22 20 20 77 61 73 20 25 73 20 63 6f 73 74  f("  was %s cost
31bf0 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
31c00 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
31c10 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
31c20 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b  Name(pTo, iLoop+
31c30 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73  1, 0), pTo->rCos
31c40 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20  t, pTo->nRow,.  
31c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
31c60 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  o->isOrderedVali
31c70 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65  d ? (pTo->isOrde
31c80 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29  red ? 'Y' : 'N')
31c90 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
31ca0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
31cb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
31cc0 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e   pWLoop is a win
31cd0 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f 20  ner.  Add it to 
31ce0 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 20  the set of best 
31cf0 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
31d00 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20    pTo->maskLoop 
31d10 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
31d20 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
31d30 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70 54  Self;.        pT
31d40 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76  o->revLoop = rev
31d50 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  Mask;.        pT
31d60 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a  o->nRow = nOut;.
31d70 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f          pTo->rCo
31d80 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20  st = rCost;.    
31d90 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
31da0 65 64 56 61 6c 69 64 20 3d 20 69 73 4f 72 64 65  edValid = isOrde
31db0 72 65 64 56 61 6c 69 64 3b 0a 20 20 20 20 20 20  redValid;.      
31dc0 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
31dd0 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20   = isOrdered;.  
31de0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f        memcpy(pTo
31df0 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e  ->aLoop, pFrom->
31e00 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68  aLoop, sizeof(Wh
31e10 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29  ereLoop*)*iLoop)
31e20 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61  ;.        pTo->a
31e30 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57  Loop[iLoop] = pW
31e40 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66  Loop;.        if
31e50 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20  ( nTo>=mxChoice 
31e60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49  ){.          mxI
31e70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
31e80 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e  mxCost = aTo[0].
31e90 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20  rCost;.         
31ea0 20 6d 78 4f 75 74 20 3d 20 61 54 6f 5b 30 5d 2e   mxOut = aTo[0].
31eb0 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20  nRow;.          
31ec0 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61  for(jj=1, pTo=&a
31ed0 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69  To[1]; jj<mxChoi
31ee0 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29  ce; jj++, pTo++)
31ef0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
31f00 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43  ( pTo->rCost>mxC
31f10 6f 73 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f  ost || (pTo->rCo
31f20 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70 54  st==mxCost && pT
31f30 6f 2d 3e 6e 52 6f 77 3e 6d 78 4f 75 74 29 20 29  o->nRow>mxOut) )
31f40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
31f50 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43  mxCost = pTo->rC
31f60 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ost;.           
31f70 20 20 20 6d 78 4f 75 74 20 3d 20 70 54 6f 2d 3e     mxOut = pTo->
31f80 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20  nRow;.          
31f90 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20      mxI = jj;.  
31fa0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31fc0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
31fd0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
31fe0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69  CE_ENABLED.    i
31ff0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
32000 72 61 63 65 3e 3d 32 20 29 7b 0a 20 20 20 20 20  race>=2 ){.     
32010 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
32020 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20  ntf("---- after 
32030 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22  round %d ----\n"
32040 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  , iLoop);.      
32050 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54  for(ii=0, pTo=aT
32060 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c  o; ii<nTo; ii++,
32070 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
32080 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
32090 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d  ntf(" %s cost=%-
320a0 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64  3d nrow=%-3d ord
320b0 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
320c0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
320d0 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
320e0 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70  ), pTo->rCost, p
320f0 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  To->nRow,.      
32100 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
32110 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d  redValid ? (pTo-
32120 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27  >isOrdered ? 'Y'
32130 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a   : 'N') : '?');.
32140 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
32150 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20  >isOrderedValid 
32160 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  && pTo->isOrdere
32170 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
32180 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
32190 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e  f(" rev=0x%llx\n
321a0 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29  ", pTo->revLoop)
321b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
321c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
321d0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
321e0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n");.        }. 
321f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
32200 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70  dif..    /* Swap
32210 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61 46   the roles of aF
32220 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72 20  rom and aTo for 
32230 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61 74  the next generat
32240 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d  ion */.    pFrom
32250 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20   = aTo;.    aTo 
32260 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72  = aFrom;.    aFr
32270 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20  om = pFrom;.    
32280 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d  nFrom = nTo;.  }
32290 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30  ..  if( nFrom==0
322a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
322b0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
322c0 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74 69  "no query soluti
322d0 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  on");.    sqlite
322e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61  3DbFree(db, pSpa
322f0 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ce);.    return 
32300 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
32310 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74  }.  .  /* Find t
32320 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70  he lowest cost p
32330 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c  ath.  pFrom will
32340 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   be left pointin
32350 67 20 74 6f 20 74 68 61 74 20 70 61 74 68 20 2a  g to that path *
32360 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f  /.  pFrom = aFro
32370 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69  m;.  for(ii=1; i
32380 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a  i<nFrom; ii++){.
32390 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72      if( pFrom->r
323a0 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72  Cost>aFrom[ii].r
323b0 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20 26  Cost ) pFrom = &
323c0 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20  aFrom[ii];.  }. 
323d0 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
323e0 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29  >nLevel==nLoop )
323f0 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20  ;.  /* Load the 
32400 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
32410 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a   into pWInfo */.
32420 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69    for(iLoop=0; i
32430 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  Loop<nLoop; iLoo
32440 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c  p++){.    WhereL
32450 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70  evel *pLevel = p
32460 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70  WInfo->a + iLoop
32470 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57  ;.    pLevel->pW
32480 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20  Loop = pWLoop = 
32490 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f  pFrom->aLoop[iLo
324a0 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  op];.    pLevel-
324b0 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d  >iFrom = pWLoop-
324c0 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76 65  >iTab;.    pLeve
324d0 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57 49  l->iTabCur = pWI
324e0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
324f0 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e  [pLevel->iFrom].
32500 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69  iCursor;.  }.  i
32510 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
32520 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
32530 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d 30  ANT_DISTINCT)!=0
32540 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
32550 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
32560 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d 3d  RE_DISTINCTBY)==
32570 30 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e  0.   && pWInfo->
32580 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45  eDistinct==WHERE
32590 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20  _DISTINCT_NOOP. 
325a0 20 20 26 26 20 6e 52 6f 77 45 73 74 0a 20 20 29    && nRowEst.  )
325b0 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f  {.    Bitmask no
325c0 74 55 73 65 64 3b 0a 20 20 20 20 69 6e 74 20 72  tUsed;.    int r
325d0 63 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74  c = wherePathSat
325e0 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57  isfiesOrderBy(pW
325f0 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52  Info, pWInfo->pR
32600 65 73 75 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c  esultSet, pFrom,
32610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32620 20 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54    WHERE_DISTINCT
32630 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72  BY, nLoop-1, pFr
32640 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d  om->aLoop[nLoop-
32650 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20  1], &notUsed);. 
32660 20 20 20 69 66 28 20 72 63 3d 3d 31 20 29 20 70     if( rc==1 ) p
32670 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
32680 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
32690 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 7d 0a 20  T_ORDERED;.  }. 
326a0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72   if( pFrom->isOr
326b0 64 65 72 65 64 20 29 7b 0a 20 20 20 20 69 66 28  dered ){.    if(
326c0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
326d0 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
326e0 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20  INCTBY ){.      
326f0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
32700 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
32710 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20  CT_ORDERED;.    
32720 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49  }else{.      pWI
32730 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 31 3b  nfo->bOBSat = 1;
32740 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72  .      pWInfo->r
32750 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e  evMask = pFrom->
32760 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20  revLoop;.    }. 
32770 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f   }.  pWInfo->nRo
32780 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52  wOut = pFrom->nR
32790 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74  ow;..  /* Free t
327a0 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20  emporary memory 
327b0 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63 65  and return succe
327c0 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  ss */.  sqlite3D
327d0 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65  bFree(db, pSpace
327e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
327f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
32800 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75 73 65  Most queries use
32810 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
32820 61 62 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e  able (they are n
32830 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61  ot joins) and ha
32840 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20  ve.** simple == 
32850 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69  constraints agai
32860 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c  nst indexed fiel
32870 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ds.  This routin
32880 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f  e attempts.** to
32890 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70   plan those simp
328a0 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d  le cases using m
328b0 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e  uch less ceremon
328c0 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65  y than the.** ge
328d0 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75  neral-purpose qu
328e0 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64  ery planner, and
328f0 20 74 68 65 72 65 62 79 20 79 69 65 6c 64 20 66   thereby yield f
32900 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72  aster sqlite3_pr
32910 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73  epare().** times
32920 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
32930 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  case..**.** Retu
32940 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73  rn non-zero on s
32950 75 63 63 65 73 73 2c 20 69 66 20 74 68 69 73 20  uccess, if this 
32960 71 75 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e  query can be han
32970 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20  dled by this.** 
32980 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20  no-frills query 
32990 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e  planner.  Return
329a0 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71 75   zero if this qu
329b0 65 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a  ery needs the .*
329c0 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73  * general-purpos
329d0 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  e query planner.
329e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
329f0 68 65 72 65 53 68 6f 72 74 43 75 74 28 57 68 65  hereShortCut(Whe
32a00 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
32a10 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72  Builder){.  Wher
32a20 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20  eInfo *pWInfo;. 
32a30 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
32a40 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57  item *pItem;.  W
32a50 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
32a60 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
32a70 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  erm;.  WhereLoop
32a80 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69   *pLoop;.  int i
32a90 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  Cur;.  int j;.  
32aa0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
32ab0 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20  ndex *pIdx;.  . 
32ac0 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64   pWInfo = pBuild
32ad0 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66  er->pWInfo;.  if
32ae0 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
32af0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52  lags & WHERE_FOR
32b00 43 45 5f 54 41 42 4c 45 20 29 20 72 65 74 75 72  CE_TABLE ) retur
32b10 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 0;.  assert( p
32b20 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
32b30 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49  >nSrc>=1 );.  pI
32b40 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  tem = pWInfo->pT
32b50 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61  abList->a;.  pTa
32b60 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
32b70 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
32b80 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
32b90 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  0;.  if( pItem->
32ba0 7a 49 6e 64 65 78 20 29 20 72 65 74 75 72 6e 20  zIndex ) return 
32bb0 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65  0;.  iCur = pIte
32bc0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57  m->iCursor;.  pW
32bd0 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
32be0 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69  ;.  pLoop = pBui
32bf0 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c  lder->pNew;.  pL
32c00 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30  oop->wsFlags = 0
32c10 3b 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64  ;.  pTerm = find
32c20 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
32c30 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 30 29  -1, 0, WO_EQ, 0)
32c40 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b  ;.  if( pTerm ){
32c50 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  .    pLoop->wsFl
32c60 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
32c70 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c  MN_EQ|WHERE_IPK|
32c80 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
32c90 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b    pLoop->aLTerm[
32ca0 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
32cb0 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
32cc0 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  1;.    pLoop->u.
32cd0 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
32ce0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
32cf0 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f  st of a rowid lo
32d00 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20  okup is 10 */.  
32d10 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20    pLoop->rRun = 
32d20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69  33;  /* 33==sqli
32d30 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f  te3LogEst(10) */
32d40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
32d50 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
32d60 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
32d70 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
32d80 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
32d90 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d  p->aLTermSpace==
32da0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b  pLoop->aLTerm );
32db0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 41  .      assert( A
32dc0 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e  rraySize(pLoop->
32dd0 61 4c 54 65 72 6d 53 70 61 63 65 29 3d 3d 34 20  aLTermSpace)==4 
32de0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
32df0 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e  x->onError==OE_N
32e00 6f 6e 65 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  one .       || p
32e10 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
32e20 72 65 21 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c  re!=0 .       ||
32e30 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41   pIdx->nKeyCol>A
32e40 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e  rraySize(pLoop->
32e50 61 4c 54 65 72 6d 53 70 61 63 65 29 20 0a 20 20  aLTermSpace) .  
32e60 20 20 20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a      ) continue;.
32e70 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
32e80 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
32e90 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54  j++){.        pT
32ea0 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
32eb0 57 43 2c 20 69 43 75 72 2c 20 70 49 64 78 2d 3e  WC, iCur, pIdx->
32ec0 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c 20  aiColumn[j], 0, 
32ed0 57 4f 5f 45 51 2c 20 70 49 64 78 29 3b 0a 20 20  WO_EQ, pIdx);.  
32ee0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
32ef0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
32f00 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
32f10 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[j] = pTerm;.  
32f20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
32f30 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  j!=pIdx->nKeyCol
32f40 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
32f50 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
32f60 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
32f70 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57  _EQ|WHERE_ONEROW
32f80 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a  |WHERE_INDEXED;.
32f90 20 20 20 20 20 20 69 66 28 20 28 70 49 74 65 6d        if( (pItem
32fa0 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c  ->colUsed & ~col
32fb0 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78  umnsInIndex(pIdx
32fc0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
32fd0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
32fe0 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  |= WHERE_IDX_ONL
32ff0 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  Y;.      }.     
33000 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d   pLoop->nLTerm =
33010 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d   j;.      pLoop-
33020 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a  >u.btree.nEq = j
33030 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  ;.      pLoop->u
33040 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
33050 70 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54  pIdx;.      /* T
33060 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61  UNING: Cost of a
33070 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f   unique index lo
33080 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20  okup is 15 */.  
33090 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20      pLoop->rRun 
330a0 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71  = 39;  /* 39==sq
330b0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 35 29 20  lite3LogEst(15) 
330c0 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
330d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
330e0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29  pLoop->wsFlags )
330f0 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  {.    pLoop->nOu
33100 74 20 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20  t = (LogEst)1;. 
33110 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e     pWInfo->a[0].
33120 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a  pWLoop = pLoop;.
33130 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53      pLoop->maskS
33140 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70  elf = getMask(&p
33150 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
33160 20 69 43 75 72 29 3b 0a 20 20 20 20 70 57 49 6e   iCur);.    pWIn
33170 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72  fo->a[0].iTabCur
33180 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49   = iCur;.    pWI
33190 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31  nfo->nRowOut = 1
331a0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
331b0 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57 49  ->pOrderBy ) pWI
331c0 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 20 31  nfo->bOBSat =  1
331d0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
331e0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
331f0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
33200 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e  CT ){.      pWIn
33210 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
33220 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
33230 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66  NIQUE;.    }.#if
33240 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
33250 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20  .    pLoop->cId 
33260 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20  = '0';.#endif.  
33270 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
33280 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
33290 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
332a0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
332b0 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72  he loop used for
332c0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
332d0 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65  ocessing..** The
332e0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
332f0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
33300 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72   opaque structur
33310 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  e that contains.
33320 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e  ** information n
33330 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61  eeded to termina
33340 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61  te the loop.  La
33350 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ter, the calling
33360 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75   routine.** shou
33370 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ld invoke sqlite
33380 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68  3WhereEnd() with
33390 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
333a0 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
333b0 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  on.** in order t
333c0 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57  o complete the W
333d0 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
333e0 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  essing..**.** If
333f0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
33400 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
33410 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  eturns NULL..**.
33420 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65  ** The basic ide
33430 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73  a is to do a nes
33440 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f  ted loop, one lo
33450 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  op for each tabl
33460 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  e in.** the FROM
33470 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c   clause of a sel
33480 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e  ect.  (INSERT an
33490 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  d UPDATE stateme
334a0 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73  nts are the.** s
334b0 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20  ame as a SELECT 
334c0 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67  with only a sing
334d0 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  le table in the 
334e0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46  FROM clause.)  F
334f0 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69  or.** example, i
33500 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69  f the SQL is thi
33510 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53  s:.**.**       S
33520 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
33530 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e   t2, t3 WHERE ..
33540 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68  .;.**.** Then th
33550 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
33560 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79   is conceptually
33570 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77   like the follow
33580 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ing:.**.**      
33590 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
335a0 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20  t1 do       \   
335b0 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
335c0 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  **        foreac
335d0 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20  h row2 in t2 do 
335e0 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
335f0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a  te3WhereBegin().
33600 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  **          fore
33610 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64  ach row3 in t3 d
33620 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20  o   /.**        
33630 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
33640 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
33650 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20              \   
33660 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
33670 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20  **        end   
33680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33690 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
336a0 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a  te3WhereEnd().**
336b0 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
336c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
336d0 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74    /.**.** Note t
336e0 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69  hat the loops mi
336f0 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65  ght not be neste
33700 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69  d in the order i
33710 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20  n which they.** 
33720 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
33730 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64  OM clause if a d
33740 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69  ifferent order i
33750 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f  s better able to
33760 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20   make.** use of 
33770 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61  indices.  Note a
33780 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68  lso that when th
33790 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70  e IN operator ap
337a0 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  pears in.** the 
337b0 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74  WHERE clause, it
337c0 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
337d0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74   additional nest
337e0 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20  ed loops for.** 
337f0 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
33800 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74   all values on t
33810 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
33820 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a  de of the IN..**
33830 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74  .** There are Bt
33840 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f  ree cursors asso
33850 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
33860 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73   table.  t1 uses
33870 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
33880 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  r pTabList->a[0]
33890 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73  .iCursor.  t2 us
338a0 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54  es the cursor pT
338b0 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75  abList->a[1].iCu
338c0 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20  rsor..** And so 
338d0 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75  forth.  This rou
338e0 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
338f0 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73  ode to open thos
33900 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a  e VDBE cursors.*
33910 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65  * and sqlite3Whe
33920 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65  reEnd() generate
33930 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c  s the code to cl
33940 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ose them..**.** 
33950 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71  The code that sq
33960 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
33970 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76  ) generates leav
33980 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e  es the cursors n
33990 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c  amed.** in pTabL
339a0 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ist pointing at 
339b0 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74  their appropriat
339c0 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20  e entries.  The 
339d0 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61  [...] code.** ca
339e0 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  n use OP_Column 
339f0 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63  and OP_Rowid opc
33a00 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75  odes on these cu
33a10 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74  rsors to extract
33a20 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68  .** data from th
33a30 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73  e various tables
33a40 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   of the loop..**
33a50 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45  .** If the WHERE
33a60 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79   clause is empty
33a70 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f  , the foreach lo
33a80 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63  ops must each sc
33a90 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69  an their.** enti
33aa0 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73  re tables.  Thus
33ab0 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69   a three-way joi
33ac0 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f  n is an O(N^3) o
33ad0 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69  peration.  But i
33ae0 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20  f.** the tables 
33af0 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64  have indices and
33b00 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73   there are terms
33b10 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
33b20 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66  ause that.** ref
33b30 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69  er to those indi
33b40 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20  ces, a complete 
33b50 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62  table scan can b
33b60 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68  e avoided and th
33b70 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72  e.** code will r
33b80 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20  un much faster. 
33b90 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72   Most of the wor
33ba0 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  k of this routin
33bb0 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  e is checking.**
33bc0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
33bd0 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61   are indices tha
33be0 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
33bf0 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f   speed up the lo
33c00 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20  op..**.** Terms 
33c10 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
33c20 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65  use are also use
33c30 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68  d to limit which
33c40 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a   rows actually.*
33c50 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65  * make it to the
33c60 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69   "..." in the mi
33c70 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ddle of the loop
33c80 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66  .  After each "f
33c90 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d  oreach",.** term
33ca0 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
33cb0 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f  lause that use o
33cc0 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61  nly terms in tha
33cd0 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72  t loop and outer
33ce0 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76  .** loops are ev
33cf0 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66  aluated and if f
33d00 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d  alse a jump is m
33d10 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73  ade around all s
33d20 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e  ubsequent.** inn
33d30 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f  er loops (or aro
33d40 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66  und the "..." if
33d50 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73   the test occurs
33d60 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65   within the inne
33d70 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29  r-.** most loop)
33d80 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49  .**.** OUTER JOI
33d90 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65  NS.**.** An oute
33da0 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73  r join of tables
33db0 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f   t1 and t2 is co
33dc0 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20  nceptally coded 
33dd0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
33de0 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77  *    foreach row
33df0 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20  1 in t1 do.**   
33e00 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20     flag = 0.**  
33e10 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
33e20 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20   in t2 do.**    
33e30 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20      start:.**   
33e40 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
33e50 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a         flag = 1.
33e60 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20  **      end.**  
33e70 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74      if flag==0 t
33e80 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f  hen.**        mo
33e90 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73  ve the row2 curs
33ea0 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77  or to a null row
33eb0 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .**        goto 
33ec0 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69  start.**      fi
33ed0 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a  .**    end.**.**
33ee0 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45   ORDER BY CLAUSE
33ef0 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a   PROCESSING.**.*
33f00 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20  * pOrderBy is a 
33f10 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f  pointer to the O
33f20 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28  RDER BY clause (
33f30 6f 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  or the GROUP BY 
33f40 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65  clause.** if the
33f50 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66   WHERE_GROUPBY f
33f60 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 77 63  lag is set in wc
33f70 74 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53  trlFlags) of a S
33f80 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
33f90 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
33fa0 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ne.  If there is
33fb0 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
33fc0 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72  use or if this r
33fd0 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
33fe0 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41  led from an UPDA
33ff0 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61  TE or DELETE sta
34000 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72  tement, then pOr
34010 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a  derBy is NULL..*
34020 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c  /.WhereInfo *sql
34030 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a  ite3WhereBegin(.
34040 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
34050 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
34060 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
34070 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
34080 4c 69 73 74 2c 20 20 20 20 2f 2a 20 46 52 4f 4d  List,    /* FROM
34090 20 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74 20   clause: A list 
340a0 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  of all tables to
340b0 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20   be scanned */. 
340c0 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20   Expr *pWhere,  
340d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
340e0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
340f0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
34100 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45  By,   /* An ORDE
34110 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20  R BY clause, or 
34120 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
34130 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74 2c 20  st *pResultSet, 
34140 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 20 6f 66  /* Result set of
34150 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
34160 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  u16 wctrlFlags, 
34170 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
34180 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67  the WHERE_* flag
34190 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c  s defined in sql
341a0 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e  iteInt.h */.  in
341b0 74 20 69 49 64 78 43 75 72 20 20 20 20 20 20 20  t iIdxCur       
341c0 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f      /* If WHERE_
341d0 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73  ONETABLE_ONLY is
341e0 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73   set, index curs
341f0 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  or number */.){.
34200 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f    int nByteWInfo
34210 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
34220 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63  Num. bytes alloc
34230 61 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e  ated for WhereIn
34240 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69  fo struct */.  i
34250 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20  nt nTabList;    
34260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
34270 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
34280 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20  in pTabList */. 
34290 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
342a0 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  fo;         /* W
342b0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72  ill become the r
342c0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
342d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
342e0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
342f0 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20  se->pVdbe;   /* 
34300 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61  The virtual data
34310 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20  base engine */. 
34320 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
34330 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  y;          /* C
34340 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
34350 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e  not yet position
34360 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  ed */.  WhereLoo
34370 70 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20 20  pBuilder sWLB;  
34380 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
34390 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20  oop builder */. 
343a0 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
343b0 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54  MaskSet;    /* T
343c0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  he expression ma
343d0 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72  sk set */.  Wher
343e0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
343f0 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
34400 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e  le level in pWIn
34410 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65  fo->a[] */.  Whe
34420 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20  reLoop *pLoop;  
34430 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
34440 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 57  er to a single W
34450 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
34460 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  */.  int ii;    
34470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34480 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
34490 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
344a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
344b0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
344c0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
344d0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
344e0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
344f0 20 63 6f 64 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20   code */...  /* 
34500 56 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c  Variable initial
34510 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20  ization */.  db 
34520 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
34530 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c 20 30 2c  memset(&sWLB, 0,
34540 20 73 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a   sizeof(sWLB));.
34550 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20    sWLB.pOrderBy 
34560 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f  = pOrderBy;..  /
34570 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49  * Disable the DI
34580 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74  STINCT optimizat
34590 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69  ion if SQLITE_Di
345a0 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74  stinctOpt is set
345b0 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65   via.  ** sqlite
345c0 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49  3_test_ctrl(SQLI
345d0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
345e0 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a  MIZATIONS,...) *
345f0 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
34600 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
34610 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74   SQLITE_Distinct
34620 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72  Opt) ){.    wctr
34630 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  lFlags &= ~WHERE
34640 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a  _WANT_DISTINCT;.
34650 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75    }..  /* The nu
34660 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
34670 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
34680 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
34690 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
346a0 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74  ** bits in a Bit
346b0 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73  mask .  */.  tes
346c0 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d  tcase( pTabList-
346d0 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nSrc==BMS );.  
346e0 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
346f0 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71  rc>BMS ){.    sq
34700 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
34710 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25  arse, "at most %
34720 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  d tables in a jo
34730 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72  in", BMS);.    r
34740 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
34750 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
34760 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61   normally genera
34770 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f  tes a nested loo
34780 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  p for all tables
34790 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69   in .  ** pTabLi
347a0 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  st.  But if the 
347b0 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
347c0 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c  NLY flag is set,
347d0 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a   then we should.
347e0 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61    ** only genera
347f0 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
34800 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70  first table in p
34810 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75  TabList and assu
34820 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79  me that.  ** any
34830 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
34840 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75  ted with subsequ
34850 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75  ent tables are u
34860 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
34870 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20  */.  nTabList = 
34880 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
34890 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
348a0 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73  Y) ? 1 : pTabLis
348b0 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41  t->nSrc;..  /* A
348c0 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
348d0 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65  ialize the Where
348e0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
348f0 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
34900 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  the.  ** return 
34910 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20  value. A single 
34920 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73  allocation is us
34930 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
34940 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73  WhereInfo.  ** s
34950 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65  truct, the conte
34960 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f  nts of WhereInfo
34970 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43  .a[], the WhereC
34980 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
34990 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65    ** and the Whe
349a0 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74  reMaskSet struct
349b0 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65  ure. Since Where
349c0 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  Clause contains 
349d0 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66  an 8-byte.  ** f
349e0 69 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61  ield (type Bitma
349f0 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  sk) it must be a
34a00 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62  ligned on an 8-b
34a10 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a  yte boundary on.
34a20 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74    ** some archit
34a30 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74  ectures. Hence t
34a40 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f  he ROUND8() belo
34a50 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57  w..  */.  nByteW
34a60 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69  Info = ROUND8(si
34a70 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b  zeof(WhereInfo)+
34a80 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a  (nTabList-1)*siz
34a90 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29  eof(WhereLevel))
34aa0 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  ;.  pWInfo = sql
34ab0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
34ac0 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20  (db, nByteWInfo 
34ad0 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  + sizeof(WhereLo
34ae0 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  op));.  if( db->
34af0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
34b00 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
34b10 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
34b20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20     pWInfo = 0;. 
34b30 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
34b40 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  inError;.  }.  p
34b50 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20  WInfo->nLevel = 
34b60 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  nTabList;.  pWIn
34b70 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61  fo->pParse = pPa
34b80 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rse;.  pWInfo->p
34b90 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  TabList = pTabLi
34ba0 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f  st;.  pWInfo->pO
34bb0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
34bc0 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65  y;.  pWInfo->pRe
34bd0 73 75 6c 74 53 65 74 20 3d 20 70 52 65 73 75 6c  sultSet = pResul
34be0 74 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  tSet;.  pWInfo->
34bf0 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
34c00 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
34c10 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  ;.  pWInfo->wctr
34c20 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c  lFlags = wctrlFl
34c30 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73  ags;.  pWInfo->s
34c40 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d  avedNQueryLoop =
34c50 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
34c60 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20  oop;.  pMaskSet 
34c70 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  = &pWInfo->sMask
34c80 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e  Set;.  sWLB.pWIn
34c90 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73  fo = pWInfo;.  s
34ca0 57 4c 42 2e 70 57 43 20 3d 20 26 70 57 49 6e 66  WLB.pWC = &pWInf
34cb0 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70  o->sWC;.  sWLB.p
34cc0 4e 65 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70  New = (WhereLoop
34cd0 2a 29 28 28 28 63 68 61 72 2a 29 70 57 49 6e 66  *)(((char*)pWInf
34ce0 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a  o)+nByteWInfo);.
34cf0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
34d00 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73  BYTE_ALIGNMENT(s
34d10 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77  WLB.pNew) );.  w
34d20 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c  hereLoopInit(sWL
34d30 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65 66 20  B.pNew);.#ifdef 
34d40 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73  SQLITE_DEBUG.  s
34d50 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20  WLB.pNew->cId = 
34d60 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  '*';.#endif..  /
34d70 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52  * Split the WHER
34d80 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65  E clause into se
34d90 70 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73  parate subexpres
34da0 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68  sions where each
34db0 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73  .  ** subexpress
34dc0 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64  ion is separated
34dd0 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61   by an AND opera
34de0 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74  tor..  */.  init
34df0 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74  MaskSet(pMaskSet
34e00 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  );.  whereClause
34e10 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57  Init(&pWInfo->sW
34e20 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71  C, pWInfo);.  sq
34e30 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e  lite3ExprCodeCon
34e40 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70  stants(pParse, p
34e50 57 68 65 72 65 29 3b 0a 20 20 77 68 65 72 65 53  Where);.  whereS
34e60 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57  plit(&pWInfo->sW
34e70 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e  C, pWhere, TK_AN
34e80 44 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64  D);.  sqlite3Cod
34e90 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
34ea0 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e  arse, -1); /* In
34eb0 73 65 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20  sert the cookie 
34ec0 76 65 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f  verifier Goto */
34ed0 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69  .    .  /* Speci
34ee0 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52 45  al case: a WHERE
34ef0 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20   clause that is 
34f00 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75  constant.  Evalu
34f10 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70  ate the.  ** exp
34f20 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68  ression and eith
34f30 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c  er jump over all
34f40 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20   of the code or 
34f50 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a  fall thru..  */.
34f60 20 20 69 66 28 20 70 57 68 65 72 65 20 26 26 20    if( pWhere && 
34f70 28 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20  (nTabList==0 || 
34f80 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
34f90 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57 68  stantNotJoin(pWh
34fa0 65 72 65 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  ere)) ){.    sql
34fb0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
34fc0 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20  pParse, pWhere, 
34fd0 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20  pWInfo->iBreak, 
34fe0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
34ff0 4c 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  L);.    pWhere =
35000 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70   0;.  }..  /* Sp
35010 65 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46  ecial case: No F
35020 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  ROM clause.  */.
35030 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d    if( nTabList==
35040 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72  0 ){.    if( pOr
35050 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e  derBy ) pWInfo->
35060 62 4f 42 53 61 74 20 3d 20 31 3b 0a 20 20 20 20  bOBSat = 1;.    
35070 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
35080 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
35090 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57  INCT ){.      pW
350a0 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
350b0 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
350c0 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20  _UNIQUE;.    }. 
350d0 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20   }..  /* Assign 
350e0 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62  a bit from the b
350f0 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20  itmask to every 
35100 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d  term in the FROM
35110 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
35120 2a 2a 20 57 68 65 6e 20 61 73 73 69 67 6e 69 6e  ** When assignin
35130 67 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73  g bitmask values
35140 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   to FROM clause 
35150 63 75 72 73 6f 72 73 2c 20 69 74 20 6d 75 73 74  cursors, it must
35160 20 62 65 0a 20 20 2a 2a 20 74 68 65 20 63 61 73   be.  ** the cas
35170 65 20 74 68 61 74 20 69 66 20 58 20 69 73 20 74  e that if X is t
35180 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74  he bitmask for t
35190 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61  he N-th FROM cla
351a0 75 73 65 20 74 65 72 6d 20 74 68 65 6e 0a 20 20  use term then.  
351b0 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  ** the bitmask f
351c0 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75  or all FROM clau
351d0 73 65 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  se terms to the 
351e0 6c 65 66 74 20 6f 66 20 74 68 65 20 4e 2d 74 68  left of the N-th
351f0 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58   term.  ** is (X
35200 2d 31 29 2e 20 20 20 41 6e 20 65 78 70 72 65 73  -1).   An expres
35210 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e  sion from the ON
35220 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46   clause of a LEF
35230 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20  T JOIN can use. 
35240 20 2a 2a 20 69 74 73 20 45 78 70 72 2e 69 52 69   ** its Expr.iRi
35250 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c  ghtJoinTable val
35260 75 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62  ue to find the b
35270 69 74 6d 61 73 6b 20 6f 66 20 74 68 65 20 72 69  itmask of the ri
35280 67 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ght table.  ** o
35290 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62  f the join.  Sub
352a0 74 72 61 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f  tracting one fro
352b0 6d 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  m the right tabl
352c0 65 20 62 69 74 6d 61 73 6b 20 67 69 76 65 73 20  e bitmask gives 
352d0 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66  a.  ** bitmask f
352e0 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  or all tables to
352f0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65   the left of the
35300 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20   join.  Knowing 
35310 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a  the bitmask.  **
35320 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
35330 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61  to the left of a
35340 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d   left join is im
35350 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74  portant.  Ticket
35360 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a   #3015..  **.  *
35370 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69 74 6d  * Note that bitm
35380 61 73 6b 73 20 61 72 65 20 63 72 65 61 74 65 64  asks are created
35390 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69 73   for all pTabLis
353a0 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73 20 69  t->nSrc tables i
353b0 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c  n.  ** pTabList,
353c0 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69   not just the fi
353d0 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62  rst nTabList tab
353e0 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69  les.  nTabList i
353f0 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20  s normally.  ** 
35400 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73  equal to pTabLis
35410 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68  t->nSrc but migh
35420 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74  t be shortened t
35430 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  o 1 if the.  ** 
35440 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
35450 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2e  NLY flag is set.
35460 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
35470 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  ; ii<pTabList->n
35480 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Src; ii++){.    
35490 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b  createMask(pMask
354a0 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
354b0 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  [ii].iCursor);. 
354c0 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
354d0 47 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d 61 73  G.  {.    Bitmas
354e0 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b  k toTheLeft = 0;
354f0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
35500 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
35510 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  ; ii++){.      B
35520 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61  itmask m = getMa
35530 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
35540 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75  bList->a[ii].iCu
35550 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73  rsor);.      ass
35560 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68  ert( (m-1)==toTh
35570 65 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 74  eLeft );.      t
35580 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20  oTheLeft |= m;. 
35590 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
355a0 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c  .  /* Analyze al
355b0 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78 70 72  l of the subexpr
355c0 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74  essions.  Note t
355d0 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  hat exprAnalyze(
355e0 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64  ) might.  ** add
355f0 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
35600 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ms onto the end 
35610 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
35620 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a  use.  We do not.
35630 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61    ** want to ana
35640 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72 74 75  lyze these virtu
35650 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61  al terms, so sta
35660 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20  rt analyzing at 
35670 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64  the end.  ** and
35680 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f   work forward so
35690 20 74 68 61 74 20 74 68 65 20 61 64 64 65 64 20   that the added 
356a0 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72  virtual terms ar
356b0 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65  e never processe
356c0 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e  d..  */.  exprAn
356d0 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73  alyzeAll(pTabLis
356e0 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  t, &pWInfo->sWC)
356f0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
35700 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
35710 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
35720 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rror;.  }..  /* 
35730 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  If the ORDER BY 
35740 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c  (or GROUP BY) cl
35750 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 72 65  ause contains re
35760 66 65 72 65 6e 63 65 73 20 74 6f 20 67 65 6e 65  ferences to gene
35770 72 61 6c 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  ral.  ** express
35780 69 6f 6e 73 2c 20 74 68 65 6e 20 77 65 20 77 6f  ions, then we wo
35790 6e 27 74 20 62 65 20 61 62 6c 65 20 74 6f 20 73  n't be able to s
357a0 61 74 69 73 66 79 20 69 74 20 75 73 69 6e 67 20  atisfy it using 
357b0 69 6e 64 69 63 65 73 2c 20 73 6f 0a 20 20 2a 2a  indices, so.  **
357c0 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64 69   go ahead and di
357d0 73 61 62 6c 65 20 69 74 20 6e 6f 77 2e 0a 20 20  sable it now..  
357e0 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
357f0 79 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73  y && (wctrlFlags
35800 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
35810 53 54 49 4e 43 54 29 21 3d 30 20 29 7b 0a 20 20  STINCT)!=0 ){.  
35820 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
35830 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
35840 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70  ii++){.      Exp
35850 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74  r *pExpr = sqlit
35860 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
35870 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69  e(pOrderBy->a[ii
35880 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
35890 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
358a0 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
358b0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64      pWInfo->pOrd
358c0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 20  erBy = pOrderBy 
358d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 0;.        bre
358e0 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ak;.      }else 
358f0 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
35900 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
35910 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
35920 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
35930 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
35940 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
35950 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 44 69   ){.    if( isDi
35960 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28  stinctRedundant(
35970 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
35980 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  , &pWInfo->sWC, 
35990 70 52 65 73 75 6c 74 53 65 74 29 20 29 7b 0a 20  pResultSet) ){. 
359a0 20 20 20 20 20 2f 2a 20 54 68 65 20 44 49 53 54       /* The DIST
359b0 49 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69 73 20  INCT marking is 
359c0 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67 6e 6f  pointless.  Igno
359d0 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20  re it. */.      
359e0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
359f0 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
35a00 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  CT_UNIQUE;.    }
35a10 65 6c 73 65 20 69 66 28 20 70 4f 72 64 65 72 42  else if( pOrderB
35a20 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  y==0 ){.      /*
35a30 20 54 72 79 20 74 6f 20 4f 52 44 45 52 20 42 59   Try to ORDER BY
35a40 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
35a50 74 6f 20 6d 61 6b 65 20 64 69 73 74 69 6e 63 74  to make distinct
35a60 20 70 72 6f 63 65 73 73 69 6e 67 20 65 61 73 69   processing easi
35a70 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e  er */.      pWIn
35a80 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c  fo->wctrlFlags |
35a90 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
35aa0 42 59 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  BY;.      pWInfo
35ab0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 52 65  ->pOrderBy = pRe
35ac0 73 75 6c 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20  sultSet;.    }. 
35ad0 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75   }..  /* Constru
35ae0 63 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ct the WhereLoop
35af0 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 48   objects */.  WH
35b00 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c  ERETRACE(0xffff,
35b10 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
35b20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  Start ***\n"));.
35b30 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d    if( nTabList!=
35b40 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43  1 || whereShortC
35b50 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a  ut(&sWLB)==0 ){.
35b60 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
35b70 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b  opAddAll(&sWLB);
35b80 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
35b90 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
35ba0 6f 72 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 44 69  or;.  .    /* Di
35bb0 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68 65  splay all of the
35bc0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
35bd0 74 73 20 69 66 20 77 68 65 72 65 74 72 61 63 65  ts if wheretrace
35be0 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 23   is enabled */.#
35bf0 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
35c00 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28  _ENABLED.    if(
35c10 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
35c20 63 65 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  ce ){.      Wher
35c30 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20 20  eLoop *p;.      
35c40 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 74 61  int i;.      sta
35c50 74 69 63 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b  tic char zLabel[
35c60 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61  ] = "0123456789a
35c70 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
35c80 72 73 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20  rstuvwyxz".     
35c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35cb0 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d    "ABCDEFGHIJKLM
35cc0 4e 4f 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a  NOPQRSTUVWYXZ";.
35cd0 20 20 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e        for(p=pWIn
35ce0 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b  fo->pLoops, i=0;
35cf0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f   p; p=p->pNextLo
35d00 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  op, i++){.      
35d10 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65    p->cId = zLabe
35d20 6c 5b 69 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65  l[i%sizeof(zLabe
35d30 6c 29 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 65  l)];.        whe
35d40 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70  reLoopPrint(p, p
35d50 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  TabList);.      
35d60 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
35d70 20 0a 20 20 20 20 77 68 65 72 65 50 61 74 68 53   .    wherePathS
35d80 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 30 29  olver(pWInfo, 0)
35d90 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
35da0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
35db0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
35dc0 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  r;.    if( pWInf
35dd0 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  o->pOrderBy ){. 
35de0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 53        wherePathS
35df0 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 70 57  olver(pWInfo, pW
35e00 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29  Info->nRowOut+1)
35e10 3b 0a 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  ;.       if( db-
35e20 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
35e30 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
35e40 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
35e50 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
35e60 72 64 65 72 42 79 3d 3d 30 20 26 26 20 28 64 62  rderBy==0 && (db
35e70 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
35e80 5f 52 65 76 65 72 73 65 4f 72 64 65 72 29 21 3d  _ReverseOrder)!=
35e90 30 20 29 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f  0 ){.     pWInfo
35ea0 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 28 42 69 74  ->revMask = (Bit
35eb0 6d 61 73 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a 20  mask)(-1);.  }. 
35ec0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
35ed0 72 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d  r || NEVER(db->m
35ee0 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a  allocFailed) ){.
35ef0 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
35f00 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69  ginError;.  }.#i
35f10 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
35f20 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
35f30 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
35f40 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  ){.    int ii;. 
35f50 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
35f60 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75  rintf("---- Solu
35f70 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70  tion nRow=%d", p
35f80 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
35f90 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
35fa0 3e 62 4f 42 53 61 74 20 29 7b 0a 20 20 20 20 20  >bOBSat ){.     
35fb0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
35fc0 6e 74 66 28 22 20 4f 52 44 45 52 42 59 3d 30 78  ntf(" ORDERBY=0x
35fd0 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 72  %llx", pWInfo->r
35fe0 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20  evMask);.    }. 
35ff0 20 20 20 73 77 69 74 63 68 28 20 70 57 49 6e 66     switch( pWInf
36000 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 29 7b 0a  o->eDistinct ){.
36010 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
36020 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
36030 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
36040 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
36050 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 69 71 75    DISTINCT=uniqu
36060 65 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  e");.        bre
36070 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
36080 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
36090 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b  TINCT_ORDERED: {
360a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
360b0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44  DebugPrintf("  D
360c0 49 53 54 49 4e 43 54 3d 6f 72 64 65 72 65 64 22  ISTINCT=ordered"
360d0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
360e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
360f0 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
36100 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b  NCT_UNORDERED: {
36110 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
36120 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44  DebugPrintf("  D
36130 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65  ISTINCT=unordere
36140 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  d");.        bre
36150 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
36160 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
36170 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
36180 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
36190 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b  <pWInfo->nLevel;
361a0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68   ii++){.      wh
361b0 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49  ereLoopPrint(pWI
361c0 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f  nfo->a[ii].pWLoo
361d0 70 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20  p, pTabList);.  
361e0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
361f0 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f   /* Attempt to o
36200 6d 69 74 20 74 61 62 6c 65 73 20 66 72 6f 6d 20  mit tables from 
36210 74 68 65 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f  the join that do
36220 20 6e 6f 74 20 65 66 66 65 63 74 20 74 68 65 20   not effect the 
36230 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20  result */.  if( 
36240 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d  pWInfo->nLevel>=
36250 32 0a 20 20 20 26 26 20 70 52 65 73 75 6c 74 53  2.   && pResultS
36260 65 74 21 3d 30 0a 20 20 20 26 26 20 4f 70 74 69  et!=0.   && Opti
36270 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
36280 64 62 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e  db, SQLITE_OmitN
36290 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20  oopJoin).  ){.  
362a0 20 20 42 69 74 6d 61 73 6b 20 74 61 62 55 73 65    Bitmask tabUse
362b0 64 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c  d = exprListTabl
362c0 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
362d0 20 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20   pResultSet);.  
362e0 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72 64 65    if( sWLB.pOrde
362f0 72 42 79 20 29 20 74 61 62 55 73 65 64 20 7c 3d  rBy ) tabUsed |=
36300 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
36310 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 73 57  age(pMaskSet, sW
36320 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  LB.pOrderBy);.  
36330 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d    while( pWInfo-
36340 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20 20  >nLevel>=2 ){.  
36350 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
36360 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20  Term, *pEnd;.   
36370 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66     pLoop = pWInf
36380 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65  o->a[pWInfo->nLe
36390 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20  vel-1].pWLoop;. 
363a0 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f       if( (pWInfo
363b0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
363c0 6f 6f 70 2d 3e 69 54 61 62 5d 2e 6a 6f 69 6e 74  oop->iTab].joint
363d0 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d  ype & JT_LEFT)==
363e0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
363f0 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
36400 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
36410 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20 20 20 20  STINCT)==0.     
36420 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
36430 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
36440 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b  ROW)==0.      ){
36450 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
36460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
36470 28 20 28 74 61 62 55 73 65 64 20 26 20 70 4c 6f  ( (tabUsed & pLo
36480 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  op->maskSelf)!=0
36490 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
364a0 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57 43 2d  pEnd = sWLB.pWC-
364b0 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d 3e 6e  >a + sWLB.pWC->n
364c0 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  Term;.      for(
364d0 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e  pTerm=sWLB.pWC->
364e0 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70  a; pTerm<pEnd; p
364f0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
36500 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
36510 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e  reqAll & pLoop->
36520 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a 20 20 20  maskSelf)!=0.   
36530 20 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61        && !ExprHa
36540 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
36550 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
36560 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  oin).        ){.
36570 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
36580 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36590 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54 65   }.      if( pTe
365a0 72 6d 3c 70 45 6e 64 20 29 20 62 72 65 61 6b 3b  rm<pEnd ) break;
365b0 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
365c0 45 28 30 78 66 66 66 66 2c 20 28 22 2d 3e 20 64  E(0xffff, ("-> d
365d0 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f 74 20  rop loop %c not 
365e0 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e  used\n", pLoop->
365f0 63 49 64 29 29 3b 0a 20 20 20 20 20 20 70 57 49  cId));.      pWI
36600 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20  nfo->nLevel--;. 
36610 20 20 20 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b       nTabList--;
36620 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45  .    }.  }.  WHE
36630 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 28  RETRACE(0xffff,(
36640 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46  "*** Optimizer F
36650 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29  inished ***\n"))
36660 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  ;.  pWInfo->pPar
36670 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b  se->nQueryLoop +
36680 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  = pWInfo->nRowOu
36690 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  t;..  /* If the 
366a0 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50 44  caller is an UPD
366b0 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
366c0 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20  atement that is 
366d0 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20  requesting.  ** 
366e0 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61 73  to use a one-pas
366f0 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74  s algorithm, det
36700 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20 69  ermine if this i
36710 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20  s appropriate.. 
36720 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61 73 73   ** The one-pass
36730 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20   algorithm only 
36740 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57 48 45  works if the WHE
36750 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
36760 61 69 6e 73 0a 20 20 2a 2a 20 74 68 65 20 73 74  ains.  ** the st
36770 61 74 65 6d 65 6e 74 20 74 6f 20 75 70 64 61 74  atement to updat
36780 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a  e a single row..
36790 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
367a0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
367b0 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
367c0 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f  ED)==0 || pWInfo
367d0 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20  ->nLevel==1 );. 
367e0 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
367f0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
36800 5f 44 45 53 49 52 45 44 29 21 3d 30 20 0a 20 20  _DESIRED)!=0 .  
36810 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 61 5b 30   && (pWInfo->a[0
36820 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ].pWLoop->wsFlag
36830 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
36840 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e  )!=0 ){.    pWIn
36850 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20  fo->okOnePass = 
36860 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  1;.    pWInfo->a
36870 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  [0].pWLoop->wsFl
36880 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44  ags &= ~WHERE_ID
36890 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f  X_ONLY;.  }..  /
368a0 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65  * Open all table
368b0 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  s in the pTabLis
368c0 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65  t and any indice
368d0 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20  s selected for. 
368e0 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68   ** searching th
368f0 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  ose tables..  */
36900 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
36910 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
36920 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  (ii=0, pLevel=pW
36930 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62  Info->a; ii<nTab
36940 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76  List; ii++, pLev
36950 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  el++){.    Table
36960 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54   *pTab;     /* T
36970 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
36980 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20      int iDb;    
36990 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
369a0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
369b0 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78  ning table/index
369c0 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 53   */.    struct S
369d0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
369e0 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62  bItem;..    pTab
369f0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
36a00 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
36a10 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70  m];.    pTab = p
36a20 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
36a30 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
36a40 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
36a50 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
36a60 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ;.    pLoop = pL
36a70 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
36a80 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
36a90 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
36aa0 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62  eral)!=0 || pTab
36ab0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
36ac0 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
36ad0 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69   */.    }else.#i
36ae0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
36af0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
36b00 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
36b10 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
36b20 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
36b30 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
36b40 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f  har *pVTab = (co
36b50 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74  nst char *)sqlit
36b60 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20  e3GetVTable(db, 
36b70 70 54 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74  pTab);.      int
36b80 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
36b90 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
36ba0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
36bb0 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20  p4(v, OP_VOpen, 
36bc0 69 43 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61  iCur, 0, 0, pVTa
36bd0 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20  b, P4_VTAB);.   
36be0 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72   }else if( IsVir
36bf0 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
36c00 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20      /* noop */. 
36c10 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
36c20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
36c30 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
36c40 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20  IDX_ONLY)==0.   
36c50 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46        && (wctrlF
36c60 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49  lags & WHERE_OMI
36c70 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30  T_OPEN_CLOSE)==0
36c80 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   ){.      int op
36c90 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65   = pWInfo->okOne
36ca0 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72  Pass ? OP_OpenWr
36cb0 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61  ite : OP_OpenRea
36cc0 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  d;.      sqlite3
36cd0 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
36ce0 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
36cf0 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  sor, iDb, pTab, 
36d00 6f 70 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  op);.      testc
36d10 61 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b  ase( !pWInfo->ok
36d20 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62 2d  OnePass && pTab-
36d30 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a  >nCol==BMS-1 );.
36d40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
36d50 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
36d60 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  ss && pTab->nCol
36d70 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69  ==BMS );.      i
36d80 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  f( !pWInfo->okOn
36d90 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e  ePass && pTab->n
36da0 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20 20 20 20 20  Col<BMS ){.     
36db0 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70     Bitmask b = p
36dc0 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
36dd0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  ;.        int n 
36de0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
36df0 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b  (; b; b=b>>1, n+
36e00 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c  +){}.        sql
36e10 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
36e20 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
36e30 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
36e40 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
36e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
36e60 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
36e70 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  n), P4_INT32);. 
36e80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
36e90 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  <=pTab->nCol );.
36ea0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
36eb0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
36ec0 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
36ed0 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
36ee0 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
36ef0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
36f00 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
36f10 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
36f20 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   ){.      Index 
36f30 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  *pIx = pLoop->u.
36f40 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
36f50 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
36f60 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  y = sqlite3Index
36f70 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20  Keyinfo(pParse, 
36f80 70 49 78 29 3b 0a 20 20 20 20 20 20 2f 2a 20 46  pIx);.      /* F
36f90 49 58 4d 45 3a 20 20 41 73 20 61 6e 20 6f 70 74  IXME:  As an opt
36fa0 69 6d 69 7a 61 74 69 6f 6e 20 75 73 65 20 70 54  imization use pT
36fb0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  abItem->iCursor 
36fc0 69 66 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  if WHERE_IDX_ONL
36fd0 59 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  Y */.      int i
36fe0 49 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76 65  IndexCur = pLeve
36ff0 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49 64  l->iIdxCur = iId
37000 78 43 75 72 20 3f 20 69 49 64 78 43 75 72 20 3a  xCur ? iIdxCur :
37010 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
37020 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
37030 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  Ix->pSchema==pTa
37040 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
37050 20 20 20 20 61 73 73 65 72 74 28 20 69 49 6e 64      assert( iInd
37060 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20  exCur>=0 );.    
37070 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
37080 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Op4(v, OP_OpenRe
37090 61 64 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70  ad, iIndexCur, p
370a0 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20  Ix->tnum, iDb,. 
370b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
370c0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
370d0 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  ey, P4_KEYINFO_H
370e0 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 56  ANDOFF);.      V
370f0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
37100 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29  %s", pIx->zName)
37110 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
37120 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
37130 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
37140 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20  );.    notReady 
37150 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49  &= ~getMask(&pWI
37160 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
37170 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
37180 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d  );.  }.  pWInfo-
37190 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  >iTop = sqlite3V
371a0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
371b0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
371c0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
371d0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
371e0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
371f0 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20   the code to do 
37200 74 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63  the search.  Eac
37210 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  h iteration of t
37220 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70  he for.  ** loop
37230 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73   below generates
37240 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67   code for a sing
37250 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f  le nested loop o
37260 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72  f the VM.  ** pr
37270 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f  ogram..  */.  no
37280 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
37290 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30  sk)0;.  for(ii=0
372a0 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  ; ii<nTabList; i
372b0 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  i++){.    pLevel
372c0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69   = &pWInfo->a[ii
372d0 5d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ];.#ifndef SQLIT
372e0 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
372f0 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28  _INDEX.    if( (
37300 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e  pLevel->pWLoop->
37310 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
37320 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29  AUTO_INDEX)!=0 )
37330 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63  {.      construc
37340 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
37350 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d  pParse, &pWInfo-
37360 3e 73 57 43 2c 0a 20 20 20 20 20 20 20 20 20 20  >sWC,.          
37370 20 20 20 20 20 20 26 70 54 61 62 4c 69 73 74 2d        &pTabList-
37380 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
37390 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65  ], notReady, pLe
373a0 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  vel);.      if( 
373b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
373c0 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
373d0 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23  inError;.    }.#
373e0 65 6e 64 69 66 0a 20 20 20 20 65 78 70 6c 61 69  endif.    explai
373f0 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72 73 65 2c  nOneScan(pParse,
37400 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65   pTabList, pLeve
37410 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69  l, ii, pLevel->i
37420 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73  From, wctrlFlags
37430 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  );.    pLevel->a
37440 64 64 72 42 6f 64 79 20 3d 20 73 71 6c 69 74 65  ddrBody = sqlite
37450 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
37460 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64  (v);.    notRead
37470 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53  y = codeOneLoopS
37480 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c  tart(pWInfo, ii,
37490 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20   notReady);.    
374a0 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
374b0 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  e = pLevel->addr
374c0 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Cont;.  }..  /* 
374d0 44 6f 6e 65 2e 20 2a 2f 0a 20 20 72 65 74 75 72  Done. */.  retur
374e0 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20  n pWInfo;..  /* 
374f0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c  Jump here if mal
37500 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65  loc fails */.whe
37510 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20  reBeginError:.  
37520 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20  if( pWInfo ){.  
37530 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
37540 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
37550 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
37560 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65      whereInfoFre
37570 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
37580 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
37590 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
375a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
375b0 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65  WHERE loop.  See
375c0 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a   comments on .**
375d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
375e0 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  in() for additio
375f0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
37600 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
37610 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e  WhereEnd(WhereIn
37620 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50  fo *pWInfo){.  P
37630 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
37640 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
37650 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
37660 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
37670 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  i;.  WhereLevel 
37680 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65  *pLevel;.  Where
37690 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53  Loop *pLoop;.  S
376a0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
376b0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
376c0 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist;.  sqlite3 *
376d0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
376e0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
376f0 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e  loop termination
37700 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71   code..  */.  sq
37710 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
37720 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66  ear(pParse);.  f
37730 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65  or(i=pWInfo->nLe
37740 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  vel-1; i>=0; i--
37750 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  ){.    pLevel = 
37760 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20  &pWInfo->a[i];. 
37770 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
37780 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 73  l->pWLoop;.    s
37790 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
377a0 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
377b0 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20  ->addrCont);.   
377c0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21   if( pLevel->op!
377d0 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
377e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
377f0 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  Op2(v, pLevel->o
37800 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70  p, pLevel->p1, p
37810 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20  Level->p2);.    
37820 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
37830 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d  ngeP5(v, pLevel-
37840 3e 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >p5);.    }.    
37850 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
37860 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42  gs & WHERE_IN_AB
37870 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e  LE && pLevel->u.
37880 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20  in.nIn>0 ){.    
37890 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20    struct InLoop 
378a0 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20  *pIn;.      int 
378b0 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  j;.      sqlite3
378c0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
378d0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
378e0 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Nxt);.      for(
378f0 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  j=pLevel->u.in.n
37900 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d  In, pIn=&pLevel-
37910 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d  >u.in.aInLoop[j-
37920 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49  1]; j>0; j--, pI
37930 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71  n--){.        sq
37940 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
37950 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  e(v, pIn->addrIn
37960 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  Top+1);.        
37970 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
37980 32 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f  2(v, pIn->eEndLo
37990 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c  opOp, pIn->iCur,
379a0 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29   pIn->addrInTop)
379b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
379c0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
379d0 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d   pIn->addrInTop-
379e0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
379f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
37a00 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  db, pLevel->u.in
37a10 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d  .aInLoop);.    }
37a20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
37a30 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
37a40 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
37a50 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
37a60 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  ->iLeftJoin ){. 
37a70 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
37a80 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
37a90 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
37aa0 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65   OP_IfPos, pLeve
37ab0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
37ac0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
37ad0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
37ae0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
37af0 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
37b00 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
37b10 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
37b20 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
37b30 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
37b40 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
37b50 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
37b60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
37b70 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
37b80 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
37b90 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .iCursor);.     
37ba0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f   }.      if( pLo
37bb0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
37bc0 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
37bd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
37be0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
37bf0 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e  ullRow, pLevel->
37c00 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
37c10 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  }.      if( pLev
37c20 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72  el->op==OP_Retur
37c30 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  n ){.        sql
37c40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
37c50 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76  , OP_Gosub, pLev
37c60 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e  el->p1, pLevel->
37c70 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
37c80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
37c90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
37ca0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
37cb0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69  , pLevel->addrFi
37cc0 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rst);.      }.  
37cd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
37ce0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
37cf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
37d00 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f  * The "break" po
37d10 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73  int is here, jus
37d20 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  t past the end o
37d30 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70  f the outer loop
37d40 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20  ..  ** Set it.. 
37d50 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
37d60 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
37d70 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29   pWInfo->iBreak)
37d80 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
37d90 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73  l of the cursors
37da0 20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65   that were opene
37db0 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  d by sqlite3Wher
37dc0 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 61  eBegin..  */.  a
37dd0 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e  ssert( pWInfo->n
37de0 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74 2d  Level<=pTabList-
37df0 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69  >nSrc );.  for(i
37e00 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
37e10 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e  o->a; i<pWInfo->
37e20 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65  nLevel; i++, pLe
37e30 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65  vel++){.    Inde
37e40 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20  x *pIdx = 0;.   
37e50 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
37e60 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d  item *pTabItem =
37e70 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
37e80 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
37e90 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
37ea0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
37eb0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
37ec0 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  !=0 );.    pLoop
37ed0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
37ee0 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  p;.    if( (pTab
37ef0 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
37f00 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20  Ephemeral)==0.  
37f10 20 20 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c     && pTab->pSel
37f20 65 63 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28  ect==0.     && (
37f30 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
37f40 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f  gs & WHERE_OMIT_
37f50 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20  OPEN_CLOSE)==0. 
37f60 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20     ){.      int 
37f70 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  ws = pLoop->wsFl
37f80 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ags;.      if( !
37f90 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
37fa0 73 20 26 26 20 28 77 73 20 26 20 57 48 45 52 45  s && (ws & WHERE
37fb0 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _IDX_ONLY)==0 ){
37fc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
37fd0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
37fe0 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d  _Close, pTabItem
37ff0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
38000 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77    }.      if( (w
38010 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
38020 44 29 21 3d 30 20 26 26 20 28 77 73 20 26 20 28  D)!=0 && (ws & (
38030 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f  WHERE_IPK|WHERE_
38040 41 55 54 4f 5f 49 4e 44 45 58 29 29 3d 3d 30 20  AUTO_INDEX))==0 
38050 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
38060 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
38070 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c  OP_Close, pLevel
38080 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  ->iIdxCur);.    
38090 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
380a0 2a 20 49 66 20 74 68 69 73 20 73 63 61 6e 20 75  * If this scan u
380b0 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61  ses an index, ma
380c0 6b 65 20 56 44 42 45 20 63 6f 64 65 20 73 75 62  ke VDBE code sub
380d0 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65  stitutions to re
380e0 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66  ad data.    ** f
380f0 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e  rom the index in
38100 73 74 65 61 64 20 6f 66 20 66 72 6f 6d 20 74 68  stead of from th
38110 65 20 74 61 62 6c 65 20 77 68 65 72 65 20 70 6f  e table where po
38120 73 73 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65  ssible.  In some
38130 20 63 61 73 65 73 0a 20 20 20 20 2a 2a 20 74 68