/ Hex Artifact Content
Login

Artifact ee148dd577aaef8a4b5923f6046e3074a1ddf130:


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 43 6f 73 74 20 58 20 69 73 20 74 72 61 63 6b   Cost X is track
06b0: 65 64 20 61 73 20 31 30 2a 6c 6f 67 32 28 58 29  ed as 10*log2(X)
06c0: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 31 36 2d   stored in a 16-
06d0: 62 69 74 20 69 6e 74 65 67 65 72 2e 20 20 54 68  bit integer.  Th
06e0: 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 63 6f 73  e.** maximum cos
06f0: 74 20 66 6f 72 20 6f 72 64 69 6e 61 72 79 20 74  t for ordinary t
0700: 61 62 6c 65 73 20 69 73 20 36 34 2a 28 32 2a 2a  ables is 64*(2**
0710: 36 33 29 20 77 68 69 63 68 20 62 65 63 6f 6d 65  63) which become
0720: 73 20 36 39 30 30 2e 0a 2a 2a 20 28 56 69 72 74  s 6900..** (Virt
0730: 75 61 6c 20 74 61 62 6c 65 73 20 63 61 6e 20 72  ual tables can r
0740: 65 74 75 72 6e 20 61 20 6c 61 72 67 65 72 20 63  eturn a larger c
0750: 6f 73 74 2c 20 62 75 74 20 6c 65 74 27 73 20 61  ost, but let's a
0760: 73 73 75 6d 65 20 74 68 65 79 20 64 6f 20 6e 6f  ssume they do no
0770: 74 2e 29 0a 2a 2a 20 53 6f 20 61 6c 6c 20 63 6f  t.).** So all co
0780: 73 74 73 20 63 61 6e 20 62 65 20 73 74 6f 72 65  sts can be store
0790: 64 20 69 6e 20 61 20 31 36 2d 62 69 74 20 75 6e  d in a 16-bit un
07a0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 77  signed integer w
07b0: 69 74 68 6f 75 74 20 72 69 73 6b 0a 2a 2a 20 6f  ithout risk.** o
07c0: 66 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2a 0a 2a  f overflow..**.*
07d0: 2a 20 43 6f 73 74 73 20 61 72 65 20 65 73 74 69  * Costs are esti
07e0: 6d 61 74 65 73 2c 20 73 6f 20 6e 6f 20 65 66 66  mates, so no eff
07f0: 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  ort is made to c
0800: 6f 6d 70 75 74 65 20 31 30 2a 6c 6f 67 32 28 58  ompute 10*log2(X
0810: 29 20 65 78 61 63 74 6c 79 2e 0a 2a 2a 20 49 6e  ) exactly..** In
0820: 73 74 65 61 64 2c 20 61 20 63 6c 6f 73 65 20 65  stead, a close e
0830: 73 74 69 6d 61 74 65 20 69 73 20 75 73 65 64 2e  stimate is used.
0840: 20 20 41 6e 79 20 76 61 6c 75 65 20 6f 66 20 58    Any value of X
0850: 3c 3d 31 20 69 73 20 73 74 6f 72 65 64 20 61 73  <=1 is stored as
0860: 20 30 2e 0a 2a 2a 20 58 3d 32 20 69 73 20 31 30   0..** X=2 is 10
0870: 2e 20 20 58 3d 33 20 69 73 20 31 36 2e 20 20 58  .  X=3 is 16.  X
0880: 3d 31 30 30 30 20 69 73 20 39 39 2e 20 65 74 63  =1000 is 99. etc
0890: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 6f 6f 6c  ..**.** The tool
08a0: 2f 77 68 65 72 65 63 6f 73 74 74 65 73 74 2e 63  /wherecosttest.c
08b0: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 69 6d 70   source file imp
08c0: 6c 65 6d 65 6e 74 73 20 61 20 63 6f 6d 6d 61 6e  lements a comman
08d0: 64 2d 6c 69 6e 65 20 70 72 6f 67 72 61 6d 0a 2a  d-line program.*
08e0: 2a 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 6e 76  * that will conv
08f0: 65 72 74 20 57 68 65 72 65 43 6f 73 74 73 20 74  ert WhereCosts t
0900: 6f 20 69 6e 74 65 67 65 72 73 2c 20 63 6f 6e 76  o integers, conv
0910: 65 72 74 20 69 6e 74 65 67 65 72 73 20 74 6f 20  ert integers to 
0920: 57 68 65 72 65 43 6f 73 74 73 0a 2a 2a 20 61 6e  WhereCosts.** an
0930: 64 20 64 6f 20 61 64 64 69 74 69 6f 6e 20 61 6e  d do addition an
0940: 64 20 6d 75 6c 74 69 70 6c 69 63 61 74 69 6f 6e  d multiplication
0950: 20 6f 6e 20 57 68 65 72 65 43 6f 73 74 20 76 61   on WhereCost va
0960: 6c 75 65 73 2e 20 20 54 68 65 20 77 68 65 72 65  lues.  The where
0970: 63 6f 73 74 74 65 73 74 0a 2a 2a 20 63 6f 6d 6d  costtest.** comm
0980: 61 6e 64 2d 6c 69 6e 65 20 70 72 6f 67 72 61 6d  and-line program
0990: 20 69 73 20 61 20 75 73 65 66 75 6c 20 75 74 69   is a useful uti
09a0: 6c 69 74 79 20 74 6f 20 68 61 76 65 20 61 72 6f  lity to have aro
09b0: 75 6e 64 20 77 68 65 6e 20 77 6f 72 6b 69 6e 67  und when working
09c0: 20 77 69 74 68 0a 2a 2a 20 74 68 69 73 20 6d 6f   with.** this mo
09d0: 64 75 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  dule..*/.typedef
09e0: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
09f0: 69 6e 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a  int WhereCost;..
0a00: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6f 62 6a 65 63  /*.** This objec
0a10: 74 20 63 6f 6e 74 61 69 6e 73 20 69 6e 66 6f 72  t contains infor
0a20: 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f  mation needed to
0a30: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 73 69 6e   implement a sin
0a40: 67 6c 65 20 6e 65 73 74 65 64 0a 2a 2a 20 6c 6f  gle nested.** lo
0a50: 6f 70 20 69 6e 20 57 48 45 52 45 20 63 6c 61 75  op in WHERE clau
0a60: 73 65 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 74 72 61  se..**.** Contra
0a70: 73 74 20 74 68 69 73 20 6f 62 6a 65 63 74 20 77  st this object w
0a80: 69 74 68 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20  ith WhereLoop.  
0a90: 54 68 69 73 20 6f 62 6a 65 63 74 20 64 65 73 63  This object desc
0aa0: 72 69 62 65 73 20 74 68 65 0a 2a 2a 20 69 6d 70  ribes the.** imp
0ab0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ac0: 68 65 20 6c 6f 6f 70 2e 20 20 57 68 65 72 65 4c  he loop.  WhereL
0ad0: 6f 6f 70 20 64 65 73 63 72 69 62 65 73 20 74 68  oop describes th
0ae0: 65 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2a 20  e algorithm..** 
0af0: 54 68 69 73 20 6f 62 6a 65 63 74 20 63 6f 6e 74  This object cont
0b00: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
0b10: 6f 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  o the WhereLoop 
0b20: 61 6c 67 6f 72 69 74 68 6d 20 61 73 20 6f 6e 65  algorithm as one
0b30: 20 6f 66 0a 2a 2a 20 69 74 73 20 65 6c 65 6d 65   of.** its eleme
0b40: 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 57  nts..**.** The W
0b50: 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  hereInfo object 
0b60: 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c  contains a singl
0b70: 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
0b80: 69 73 20 6f 62 6a 65 63 74 20 66 6f 72 0a 2a 2a  is object for.**
0b90: 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68   each term in th
0ba0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 28 77  e FROM clause (w
0bb0: 68 69 63 68 20 69 73 20 74 6f 20 73 61 79 2c 20  hich is to say, 
0bc0: 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a  for each of the.
0bd0: 2a 2a 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  ** nested loops 
0be0: 61 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 29 2e  as implemented).
0bf0: 20 20 54 68 65 20 6f 72 64 65 72 20 6f 66 20 57    The order of W
0c00: 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74  hereLevel object
0c10: 73 20 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20  s determines.** 
0c20: 74 68 65 20 6c 6f 6f 70 20 6e 65 73 74 65 64 20  the loop nested 
0c30: 6f 72 64 65 72 2c 20 77 69 74 68 20 57 68 65 72  order, with Wher
0c40: 65 49 6e 66 6f 2e 61 5b 30 5d 20 62 65 69 6e 67  eInfo.a[0] being
0c50: 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20   the outer loop 
0c60: 61 6e 64 0a 2a 2a 20 57 68 65 72 65 49 6e 66 6f  and.** WhereInfo
0c70: 2e 61 5b 57 68 65 72 65 49 6e 66 6f 2e 6e 4c 65  .a[WhereInfo.nLe
0c80: 76 65 6c 2d 31 5d 20 62 65 69 6e 67 20 74 68 65  vel-1] being the
0c90: 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 0a 2a 2f 0a   inner loop..*/.
0ca0: 73 74 72 75 63 74 20 57 68 65 72 65 4c 65 76 65  struct WhereLeve
0cb0: 6c 20 7b 0a 20 20 69 6e 74 20 69 4c 65 66 74 4a  l {.  int iLeftJ
0cc0: 6f 69 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  oin;        /* M
0cd0: 65 6d 6f 72 79 20 63 65 6c 6c 20 75 73 65 64 20  emory cell used 
0ce0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 45 46  to implement LEF
0cf0: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 2a 2f 0a  T OUTER JOIN */.
0d00: 20 20 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20    int iTabCur;  
0d10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
0d20: 44 42 45 20 63 75 72 73 6f 72 20 75 73 65 64 20  DBE cursor used 
0d30: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 74 61  to access the ta
0d40: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ble */.  int iId
0d50: 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 2f  xCur;          /
0d60: 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
0d70: 72 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  r used to access
0d80: 20 70 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 61   pIdx */.  int a
0d90: 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20  ddrBrk;         
0da0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
0db0: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
0dc0: 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  e loop */.  int 
0dd0: 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20  addrNxt;        
0de0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
0df0: 6f 20 73 74 61 72 74 20 74 68 65 20 6e 65 78 74  o start the next
0e00: 20 49 4e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20   IN combination 
0e10: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
0e20: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t;         /* Ju
0e30: 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
0e40: 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
0e50: 74 20 6c 6f 6f 70 20 63 79 63 6c 65 20 2a 2f 0a  t loop cycle */.
0e60: 20 20 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b    int addrFirst;
0e70: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
0e80: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20   instruction of 
0e90: 69 6e 74 65 72 69 6f 72 20 6f 66 20 74 68 65 20  interior of the 
0ea0: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
0eb0: 64 72 42 6f 64 79 3b 20 20 20 20 20 20 20 20 20  drBody;         
0ec0: 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20  /* Beginning of 
0ed0: 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 69 73  the body of this
0ee0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75 38 20 69 46   loop */.  u8 iF
0ef0: 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  rom;            
0f00: 20 2f 2a 20 57 68 69 63 68 20 65 6e 74 72 79 20   /* Which entry 
0f10: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
0f20: 73 65 20 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 70  se */.  u8 op, p
0f30: 35 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  5;            /*
0f40: 20 4f 70 63 6f 64 65 20 61 6e 64 20 50 35 20 6f   Opcode and P5 o
0f50: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 74 68 61  f the opcode tha
0f60: 74 20 65 6e 64 73 20 74 68 65 20 6c 6f 6f 70 20  t ends the loop 
0f70: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 70 32 3b  */.  int p1, p2;
0f80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
0f90: 65 72 61 6e 64 73 20 6f 66 20 74 68 65 20 6f 70  erands of the op
0fa0: 63 6f 64 65 20 75 73 65 64 20 74 6f 20 65 6e 64  code used to end
0fb0: 73 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  s the loop */.  
0fc0: 75 6e 69 6f 6e 20 7b 20 20 20 20 20 20 20 20 20  union {         
0fd0: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
0fe0: 74 69 6f 6e 20 74 68 61 74 20 64 65 70 65 6e 64  tion that depend
0ff0: 73 20 6f 6e 20 70 57 4c 6f 6f 70 2d 3e 77 73 46  s on pWLoop->wsF
1000: 6c 61 67 73 20 2a 2f 0a 20 20 20 20 73 74 72 75  lags */.    stru
1010: 63 74 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ct {.      int n
1020: 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  In;             
1030: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
1040: 74 72 69 65 73 20 69 6e 20 61 49 6e 4c 6f 6f 70  tries in aInLoop
1050: 5b 5d 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  [] */.      stru
1060: 63 74 20 49 6e 4c 6f 6f 70 20 7b 0a 20 20 20 20  ct InLoop {.    
1070: 20 20 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20      int iCur;   
1080: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1090: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 75 73  e VDBE cursor us
10a0: 65 64 20 62 79 20 74 68 69 73 20 49 4e 20 6f 70  ed by this IN op
10b0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
10c0: 20 20 69 6e 74 20 61 64 64 72 49 6e 54 6f 70 3b    int addrInTop;
10d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
10e0: 6f 66 20 74 68 65 20 49 4e 20 6c 6f 6f 70 20 2a  of the IN loop *
10f0: 2f 0a 20 20 20 20 20 20 20 20 75 38 20 65 45 6e  /.        u8 eEn
1100: 64 4c 6f 6f 70 4f 70 3b 20 20 20 20 20 20 20 20  dLoopOp;        
1110: 20 2f 2a 20 49 4e 20 4c 6f 6f 70 20 74 65 72 6d   /* IN Loop term
1120: 69 6e 61 74 6f 72 2e 20 4f 50 5f 4e 65 78 74 20  inator. OP_Next 
1130: 6f 72 20 4f 50 5f 50 72 65 76 20 2a 2f 0a 20 20  or OP_Prev */.  
1140: 20 20 20 20 7d 20 2a 61 49 6e 4c 6f 6f 70 3b 20      } *aInLoop; 
1150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
1160: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 65  ormation about e
1170: 61 63 68 20 6e 65 73 74 65 64 20 49 4e 20 6f 70  ach nested IN op
1180: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 20  erator */.    } 
1190: 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
11a0: 20 20 20 20 2f 2a 20 55 73 65 64 20 77 68 65 6e      /* Used when
11b0: 20 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   pWLoop->wsFlags
11c0: 26 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 2a  &WHERE_IN_ABLE *
11d0: 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f  /.    Index *pCo
11e0: 76 69 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 50  vidx;       /* P
11f0: 6f 73 73 69 62 6c 65 20 63 6f 76 65 72 69 6e 67  ossible covering
1200: 20 69 6e 64 65 78 20 66 6f 72 20 57 48 45 52 45   index for WHERE
1210: 5f 4d 55 4c 54 49 5f 4f 52 20 2a 2f 0a 20 20 7d  _MULTI_OR */.  }
1220: 20 75 3b 0a 20 20 73 74 72 75 63 74 20 57 68 65   u;.  struct Whe
1230: 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20  reLoop *pWLoop; 
1240: 20 2f 2a 20 54 68 65 20 73 65 6c 65 63 74 65 64   /* The selected
1250: 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1260: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45  t */.};../*.** E
1270: 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ach instance of 
1280: 74 68 69 73 20 6f 62 6a 65 63 74 20 72 65 70 72  this object repr
1290: 65 73 65 6e 74 73 20 61 6e 20 61 6c 67 6f 72 69  esents an algori
12a0: 74 68 6d 20 66 6f 72 20 65 76 61 6c 75 61 74 69  thm for evaluati
12b0: 6e 67 20 6f 6e 65 0a 2a 2a 20 74 65 72 6d 20 6f  ng one.** term o
12c0: 66 20 61 20 6a 6f 69 6e 2e 20 20 45 76 65 72 79  f a join.  Every
12d0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
12e0: 4d 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 68 61  M clause will ha
12f0: 76 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f  ve at least.** o
1300: 6e 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ne corresponding
1310: 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1320: 74 20 28 75 6e 6c 65 73 73 20 49 4e 44 45 58 45  t (unless INDEXE
1330: 44 20 42 59 20 63 6f 6e 73 74 72 61 69 6e 74 73  D BY constraints
1340: 0a 2a 2a 20 70 72 65 76 65 6e 74 20 61 20 71 75  .** prevent a qu
1350: 65 72 79 20 73 6f 6c 75 74 69 6f 6e 20 2d 20 77  ery solution - w
1360: 68 69 63 68 20 69 73 20 61 6e 20 65 72 72 6f 72  hich is an error
1370: 29 20 61 6e 64 20 6d 61 6e 79 20 74 65 72 6d 73  ) and many terms
1380: 20 6f 66 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20   of the.** FROM 
1390: 63 6c 61 75 73 65 20 77 69 6c 6c 20 68 61 76 65  clause will have
13a0: 20 6d 75 6c 74 69 70 6c 65 20 57 68 65 72 65 4c   multiple WhereL
13b0: 6f 6f 70 20 6f 62 6a 65 63 74 73 2c 20 65 61 63  oop objects, eac
13c0: 68 20 64 65 73 63 72 69 62 69 6e 67 20 61 0a 2a  h describing a.*
13d0: 2a 20 70 6f 74 65 6e 74 69 61 6c 20 77 61 79 20  * potential way 
13e0: 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  of implementing 
13f0: 74 68 61 74 20 46 52 4f 4d 2d 63 6c 61 75 73 65  that FROM-clause
1400: 20 74 65 72 6d 2c 20 74 6f 67 65 74 68 65 72 20   term, together 
1410: 77 69 74 68 0a 2a 2a 20 64 65 70 65 6e 64 65 6e  with.** dependen
1420: 63 69 65 73 20 61 6e 64 20 63 6f 73 74 20 65 73  cies and cost es
1430: 74 69 6d 61 74 65 73 20 66 6f 72 20 75 73 69 6e  timates for usin
1440: 67 20 74 68 65 20 63 68 6f 73 65 6e 20 61 6c 67  g the chosen alg
1450: 6f 72 69 74 68 6d 2e 0a 2a 2a 0a 2a 2a 20 51 75  orithm..**.** Qu
1460: 65 72 79 20 70 6c 61 6e 6e 69 6e 67 20 63 6f 6e  ery planning con
1470: 73 69 73 74 73 20 6f 66 20 62 75 69 6c 64 69 6e  sists of buildin
1480: 67 20 75 70 20 61 20 63 6f 6c 6c 65 63 74 69 6f  g up a collectio
1490: 6e 20 6f 66 20 74 68 65 73 65 20 57 68 65 72 65  n of these Where
14a0: 4c 6f 6f 70 0a 2a 2a 20 6f 62 6a 65 63 74 73 2c  Loop.** objects,
14b0: 20 74 68 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20   then computing 
14c0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 73 65 71  a particular seq
14d0: 75 65 6e 63 65 20 6f 66 20 57 68 65 72 65 4c 6f  uence of WhereLo
14e0: 6f 70 20 6f 62 6a 65 63 74 73 2c 20 77 69 74 68  op objects, with
14f0: 0a 2a 2a 20 6f 6e 65 20 57 68 65 72 65 4c 6f 6f  .** one WhereLoo
1500: 70 20 6f 62 6a 65 63 74 20 70 65 72 20 46 52 4f  p object per FRO
1510: 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2c 20 74  M clause term, t
1520: 68 61 74 20 73 61 74 69 73 66 79 20 61 6c 6c 20  hat satisfy all 
1530: 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 2a 2a 20  dependencies.** 
1540: 61 6e 64 20 74 68 61 74 20 6d 69 6e 69 6d 69 7a  and that minimiz
1550: 65 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 63 6f  e the overall co
1560: 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68  st..*/.struct Wh
1570: 65 72 65 4c 6f 6f 70 20 7b 0a 20 20 42 69 74 6d  ereLoop {.  Bitm
1580: 61 73 6b 20 70 72 65 72 65 71 3b 20 20 20 20 20  ask prereq;     
1590: 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20    /* Bitmask of 
15a0: 6f 74 68 65 72 20 6c 6f 6f 70 73 20 74 68 61 74  other loops that
15b0: 20 6d 75 73 74 20 72 75 6e 20 66 69 72 73 74 20   must run first 
15c0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  */.  Bitmask mas
15d0: 6b 53 65 6c 66 3b 20 20 20 20 20 2f 2a 20 42 69  kSelf;     /* Bi
15e0: 74 6d 61 73 6b 20 69 64 65 6e 74 69 66 79 69 6e  tmask identifyin
15f0: 67 20 74 61 62 6c 65 20 69 54 61 62 20 2a 2f 0a  g table iTab */.
1600: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1610: 42 55 47 0a 20 20 63 68 61 72 20 63 49 64 3b 20  BUG.  char cId; 
1620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1630: 79 6d 62 6f 6c 69 63 20 49 44 20 6f 66 20 74 68  ymbolic ID of th
1640: 69 73 20 6c 6f 6f 70 20 66 6f 72 20 64 65 62 75  is loop for debu
1650: 67 67 69 6e 67 20 75 73 65 20 2a 2f 0a 23 65 6e  gging use */.#en
1660: 64 69 66 0a 20 20 75 38 20 69 54 61 62 3b 20 20  dif.  u8 iTab;  
1670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1680: 6f 73 69 74 69 6f 6e 20 69 6e 20 46 52 4f 4d 20  osition in FROM 
1690: 63 6c 61 75 73 65 20 6f 66 20 74 61 62 6c 65 20  clause of table 
16a0: 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f  for this loop */
16b0: 0a 20 20 75 38 20 69 53 6f 72 74 49 64 78 3b 20  .  u8 iSortIdx; 
16c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74           /* Sort
16d0: 69 6e 67 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ing index number
16e0: 2e 20 20 30 3d 3d 4e 6f 6e 65 20 2a 2f 0a 20 20  .  0==None */.  
16f0: 57 68 65 72 65 43 6f 73 74 20 72 53 65 74 75 70  WhereCost rSetup
1700: 3b 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d  ;     /* One-tim
1710: 65 20 73 65 74 75 70 20 63 6f 73 74 20 28 65 78  e setup cost (ex
1720: 3a 20 63 72 65 61 74 65 20 74 72 61 6e 73 69 65  : create transie
1730: 6e 74 20 69 6e 64 65 78 29 20 2a 2f 0a 20 20 57  nt index) */.  W
1740: 68 65 72 65 43 6f 73 74 20 72 52 75 6e 3b 20 20  hereCost rRun;  
1750: 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20       /* Cost of 
1760: 72 75 6e 6e 69 6e 67 20 65 61 63 68 20 6c 6f 6f  running each loo
1770: 70 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  p */.  WhereCost
1780: 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 2f 2a 20   nOut;       /* 
1790: 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  Estimated number
17a0: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
17b0: 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  */.  union {.   
17c0: 20 73 74 72 75 63 74 20 7b 20 20 20 20 20 20 20   struct {       
17d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72          /* Infor
17e0: 6d 61 74 69 6f 6e 20 66 6f 72 20 69 6e 74 65 72  mation for inter
17f0: 6e 61 6c 20 62 74 72 65 65 20 74 61 62 6c 65 73  nal btree tables
1800: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45   */.      int nE
1810: 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
1820: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 71   /* Number of eq
1830: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1840: 74 73 20 2a 2f 0a 20 20 20 20 20 20 49 6e 64 65  ts */.      Inde
1850: 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
1860: 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64     /* Index used
1870: 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20  , or NULL */.   
1880: 20 7d 20 62 74 72 65 65 3b 0a 20 20 20 20 73 74   } btree;.    st
1890: 72 75 63 74 20 7b 20 20 20 20 20 20 20 20 20 20  ruct {          
18a0: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
18b0: 69 6f 6e 20 66 6f 72 20 76 69 72 74 75 61 6c 20  ion for virtual 
18c0: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20  tables */.      
18d0: 69 6e 74 20 69 64 78 4e 75 6d 3b 20 20 20 20 20  int idxNum;     
18e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
18f0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20  number */.      
1900: 75 38 20 6e 65 65 64 46 72 65 65 3b 20 20 20 20  u8 needFree;    
1910: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1920: 66 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 69  f sqlite3_free(i
1930: 64 78 53 74 72 29 20 69 73 20 6e 65 65 64 65 64  dxStr) is needed
1940: 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 69 73 4f   */.      u8 isO
1950: 72 64 65 72 65 64 3b 20 20 20 20 20 20 20 20 20  rdered;         
1960: 20 2f 2a 20 54 72 75 65 20 69 66 20 73 61 74 69   /* True if sati
1970: 73 66 69 65 73 20 4f 52 44 45 52 20 42 59 20 2a  sfies ORDER BY *
1980: 2f 0a 20 20 20 20 20 20 75 31 36 20 6f 6d 69 74  /.      u16 omit
1990: 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  Mask;          /
19a0: 2a 20 54 65 72 6d 73 20 74 68 61 74 20 6d 61 79  * Terms that may
19b0: 20 62 65 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20   be omitted */. 
19c0: 20 20 20 20 20 63 68 61 72 20 2a 69 64 78 53 74       char *idxSt
19d0: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  r;          /* I
19e0: 6e 64 65 78 20 69 64 65 6e 74 69 66 69 65 72 20  ndex identifier 
19f0: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 20  string */.    } 
1a00: 76 74 61 62 3b 0a 20 20 7d 20 75 3b 0a 20 20 75  vtab;.  } u;.  u
1a10: 33 32 20 77 73 46 6c 61 67 73 3b 20 20 20 20 20  32 wsFlags;     
1a20: 20 20 20 20 20 2f 2a 20 57 48 45 52 45 5f 2a 20       /* WHERE_* 
1a30: 66 6c 61 67 73 20 64 65 73 63 72 69 62 69 6e 67  flags describing
1a40: 20 74 68 65 20 70 6c 61 6e 20 2a 2f 0a 20 20 75   the plan */.  u
1a50: 31 36 20 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20  16 nLTerm;      
1a60: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a70: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 4c 54  f entries in aLT
1a80: 65 72 6d 5b 5d 20 2a 2f 0a 20 20 2f 2a 2a 2a 2a  erm[] */.  /****
1a90: 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 29   whereLoopXfer()
1aa0: 20 63 6f 70 69 65 73 20 66 69 65 6c 64 73 20 61   copies fields a
1ab0: 62 6f 76 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  bove ***********
1ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 20  ************/.# 
1ad0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4c 4f 4f  define WHERE_LOO
1ae0: 50 5f 58 46 45 52 5f 53 5a 20 6f 66 66 73 65 74  P_XFER_SZ offset
1af0: 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2c 6e 4c 53  of(WhereLoop,nLS
1b00: 6c 6f 74 29 0a 20 20 75 31 36 20 6e 4c 53 6c 6f  lot).  u16 nLSlo
1b10: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
1b20: 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20  Number of slots 
1b30: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4c  allocated for aL
1b40: 54 65 72 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  Term[] */.  Wher
1b50: 65 54 65 72 6d 20 2a 2a 61 4c 54 65 72 6d 3b 20  eTerm **aLTerm; 
1b60: 20 20 2f 2a 20 57 68 65 72 65 54 65 72 6d 73 20    /* WhereTerms 
1b70: 75 73 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  used */.  WhereL
1b80: 6f 6f 70 20 2a 70 4e 65 78 74 4c 6f 6f 70 3b 20  oop *pNextLoop; 
1b90: 2f 2a 20 4e 65 78 74 20 57 68 65 72 65 4c 6f 6f  /* Next WhereLoo
1ba0: 70 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20  p object in the 
1bb0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 2f 0a 20  WhereClause */. 
1bc0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 4c 54 65   WhereTerm *aLTe
1bd0: 72 6d 53 70 61 63 65 5b 34 5d 3b 20 20 2f 2a 20  rmSpace[4];  /* 
1be0: 49 6e 69 74 69 61 6c 20 61 4c 54 65 72 6d 5b 5d  Initial aLTerm[]
1bf0: 20 73 70 61 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   space */.};../*
1c00: 20 54 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c   This object hol
1c10: 64 73 20 74 68 65 20 70 72 65 72 65 71 75 69 73  ds the prerequis
1c20: 69 74 65 73 20 61 6e 64 20 74 68 65 20 63 6f 73  ites and the cos
1c30: 74 20 6f 66 20 72 75 6e 6e 69 6e 67 20 61 0a 2a  t of running a.*
1c40: 2a 20 73 75 62 71 75 65 72 79 20 6f 6e 20 6f 6e  * subquery on on
1c50: 65 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20  e operand of an 
1c60: 4f 52 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 74  OR operator in t
1c70: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
1c80: 0a 2a 2a 20 53 65 65 20 57 68 65 72 65 4f 72 53  .** See WhereOrS
1c90: 65 74 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  et for additiona
1ca0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 0a 2a  l information .*
1cb0: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4f 72  /.struct WhereOr
1cc0: 43 6f 73 74 20 7b 0a 20 20 42 69 74 6d 61 73 6b  Cost {.  Bitmask
1cd0: 20 70 72 65 72 65 71 3b 20 20 20 20 20 2f 2a 20   prereq;     /* 
1ce0: 50 72 65 72 65 71 75 69 73 69 74 65 73 20 2a 2f  Prerequisites */
1cf0: 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72 52 75  .  WhereCost rRu
1d00: 6e 3b 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f  n;     /* Cost o
1d10: 66 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 73  f running this s
1d20: 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 57 68 65  ubquery */.  Whe
1d30: 72 65 43 6f 73 74 20 6e 4f 75 74 3b 20 20 20 20  reCost nOut;    
1d40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
1d50: 74 70 75 74 73 20 66 6f 72 20 74 68 69 73 20 73  tputs for this s
1d60: 75 62 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a 0a 2f  ubquery */.};../
1d70: 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74  * The WhereOrSet
1d80: 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73 20 61 20   object holds a 
1d90: 73 65 74 20 6f 66 20 70 6f 73 73 69 62 6c 65 20  set of possible 
1da0: 57 68 65 72 65 4f 72 43 6f 73 74 73 20 74 68 61  WhereOrCosts tha
1db0: 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20  t.** correspond 
1dc0: 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 28  to the subquery(
1dd0: 73 29 20 6f 66 20 4f 52 2d 63 6c 61 75 73 65 20  s) of OR-clause 
1de0: 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 4f 6e 6c  processing.  Onl
1df0: 79 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 4e 5f  y the.** best N_
1e00: 4f 52 5f 43 4f 53 54 20 65 6c 65 6d 65 6e 74 73  OR_COST elements
1e10: 20 61 72 65 20 72 65 74 61 69 6e 65 64 2e 0a 2a   are retained..*
1e20: 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 4f 52 5f 43  /.#define N_OR_C
1e30: 4f 53 54 20 33 0a 73 74 72 75 63 74 20 57 68 65  OST 3.struct Whe
1e40: 72 65 4f 72 53 65 74 20 7b 0a 20 20 75 31 36 20  reOrSet {.  u16 
1e50: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1e60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e70: 72 20 6f 66 20 76 61 6c 69 64 20 61 5b 5d 20 65  r of valid a[] e
1e80: 6e 74 72 69 65 73 20 2a 2f 0a 20 20 57 68 65 72  ntries */.  Wher
1e90: 65 4f 72 43 6f 73 74 20 61 5b 4e 5f 4f 52 5f 43  eOrCost a[N_OR_C
1ea0: 4f 53 54 5d 3b 20 20 20 2f 2a 20 53 65 74 20 6f  OST];   /* Set o
1eb0: 66 20 62 65 73 74 20 63 6f 73 74 73 20 2a 2f 0a  f best costs */.
1ec0: 7d 3b 0a 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  };.../* Forward 
1ed0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20 6d  declaration of m
1ee0: 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63  ethods */.static
1ef0: 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65   int whereLoopRe
1f00: 73 69 7a 65 28 73 71 6c 69 74 65 33 2a 2c 20 57  size(sqlite3*, W
1f10: 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e 74 29 3b  hereLoop*, int);
1f20: 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73  ../*.** Each ins
1f30: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
1f40: 6a 65 63 74 20 68 6f 6c 64 73 20 61 20 73 65 71  ject holds a seq
1f50: 75 65 6e 63 65 20 6f 66 20 57 68 65 72 65 4c 6f  uence of WhereLo
1f60: 6f 70 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 74 68  op objects.** th
1f70: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 73 6f 6d  at implement som
1f80: 65 20 6f 72 20 61 6c 6c 20 6f 66 20 61 20 71 75  e or all of a qu
1f90: 65 72 79 20 70 6c 61 6e 2e 0a 2a 2a 0a 2a 2a 20  ery plan..**.** 
1fa0: 54 68 69 6e 6b 20 6f 66 20 65 61 63 68 20 57 68  Think of each Wh
1fb0: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 61  ereLoop object a
1fc0: 73 20 61 20 6e 6f 64 65 20 69 6e 20 61 20 67 72  s a node in a gr
1fd0: 61 70 68 20 77 69 74 68 20 61 72 63 73 0a 2a 2a  aph with arcs.**
1fe0: 20 73 68 6f 77 69 6e 67 20 64 65 70 65 6e 64 65   showing depende
1ff0: 6e 63 65 73 20 61 6e 64 20 63 6f 73 74 73 20 66  nces and costs f
2000: 6f 72 20 74 72 61 76 65 6c 6c 69 6e 67 20 62 65  or travelling be
2010: 74 77 65 65 6e 20 6e 6f 64 65 73 2e 20 20 28 54  tween nodes.  (T
2020: 68 61 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 61 20  hat is.** not a 
2030: 63 6f 6d 70 6c 65 74 65 6c 79 20 61 63 63 75 72  completely accur
2040: 61 74 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ate description 
2050: 62 65 63 61 75 73 65 20 57 68 65 72 65 4c 6f 6f  because WhereLoo
2060: 70 20 63 6f 73 74 73 20 61 72 65 20 61 0a 2a 2a  p costs are a.**
2070: 20 76 65 63 74 6f 72 2c 20 6e 6f 74 20 61 20 73   vector, not a s
2080: 63 61 6c 61 72 2c 20 61 6e 64 20 62 65 63 61 75  calar, and becau
2090: 73 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20 61  se dependences a
20a0: 72 65 20 6d 61 6e 79 2d 74 6f 2d 6f 6e 65 2c 20  re many-to-one, 
20b0: 6e 6f 74 0a 2a 2a 20 6f 6e 65 2d 74 6f 2d 6f 6e  not.** one-to-on
20c0: 65 20 61 73 20 61 72 65 20 67 72 61 70 68 20 6e  e as are graph n
20d0: 6f 64 65 73 2e 20 20 42 75 74 20 69 74 20 69 73  odes.  But it is
20e0: 20 61 20 75 73 65 66 75 6c 20 76 69 73 75 61 6c   a useful visual
20f0: 69 7a 61 74 69 6f 6e 20 61 69 64 2e 29 0a 2a 2a  ization aid.).**
2100: 20 54 68 65 6e 20 61 20 57 68 65 72 65 50 61 74   Then a WherePat
2110: 68 20 6f 62 6a 65 63 74 20 69 73 20 61 20 70 61  h object is a pa
2120: 74 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 67  th through the g
2130: 72 61 70 68 20 74 68 61 74 20 76 69 73 69 74 73  raph that visits
2140: 20 73 6f 6d 65 0a 2a 2a 20 6f 72 20 61 6c 6c 20   some.** or all 
2150: 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
2160: 20 6f 62 6a 65 63 74 73 20 6f 6e 63 65 2e 0a 2a   objects once..*
2170: 2a 0a 2a 2a 20 54 68 65 20 22 73 6f 6c 76 65 72  *.** The "solver
2180: 22 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74  " works by creat
2190: 69 6e 67 20 74 68 65 20 4e 20 62 65 73 74 20 57  ing the N best W
21a0: 68 65 72 65 50 61 74 68 20 6f 62 6a 65 63 74 73  herePath objects
21b0: 20 6f 66 20 6c 65 6e 67 74 68 0a 2a 2a 20 31 2e   of length.** 1.
21c0: 20 20 54 68 65 6e 20 75 73 69 6e 67 20 74 68 6f    Then using tho
21d0: 73 65 20 61 73 20 61 20 62 61 73 69 73 20 74 6f  se as a basis to
21e0: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 4e 20 62   compute the N b
21f0: 65 73 74 20 57 68 65 72 65 50 61 74 68 20 6f 62  est WherePath ob
2200: 6a 65 63 74 73 0a 2a 2a 20 6f 66 20 6c 65 6e 67  jects.** of leng
2210: 74 68 20 32 2e 20 20 41 6e 64 20 73 6f 20 66 6f  th 2.  And so fo
2220: 72 74 68 20 75 6e 74 69 6c 20 74 68 65 20 6c 65  rth until the le
2230: 6e 67 74 68 20 6f 66 20 57 68 65 72 65 50 61 74  ngth of WherePat
2240: 68 73 20 65 71 75 61 6c 73 20 74 68 65 0a 2a 2a  hs equals the.**
2250: 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 64 65 73   number of nodes
2260: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2270: 75 73 65 2e 20 20 54 68 65 20 62 65 73 74 20 28  use.  The best (
2280: 6c 6f 77 65 73 74 20 63 6f 73 74 29 20 57 68 65  lowest cost) Whe
2290: 72 65 50 61 74 68 0a 2a 2a 20 61 74 20 74 68 65  rePath.** at the
22a0: 20 65 6e 64 20 69 73 20 74 68 65 20 63 68 6f 6f   end is the choo
22b0: 73 65 6e 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a  sen query plan..
22c0: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 50  */.struct WhereP
22d0: 61 74 68 20 7b 0a 20 20 42 69 74 6d 61 73 6b 20  ath {.  Bitmask 
22e0: 6d 61 73 6b 4c 6f 6f 70 3b 20 20 20 20 20 2f 2a  maskLoop;     /*
22f0: 20 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20   Bitmask of all 
2300: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2310: 73 20 69 6e 20 74 68 69 73 20 70 61 74 68 20 2a  s in this path *
2320: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4c  /.  Bitmask revL
2330: 6f 6f 70 3b 20 20 20 20 20 20 2f 2a 20 61 4c 6f  oop;      /* aLo
2340: 6f 70 5b 5d 73 20 74 68 61 74 20 73 68 6f 75 6c  op[]s that shoul
2350: 64 20 62 65 20 72 65 76 65 72 73 65 64 20 66 6f  d be reversed fo
2360: 72 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20  r ORDER BY */.  
2370: 57 68 65 72 65 43 6f 73 74 20 6e 52 6f 77 3b 20  WhereCost nRow; 
2380: 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74        /* Estimat
2390: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ed number of row
23a0: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  s generated by t
23b0: 68 69 73 20 70 61 74 68 20 2a 2f 0a 20 20 57 68  his path */.  Wh
23c0: 65 72 65 43 6f 73 74 20 72 43 6f 73 74 3b 20 20  ereCost rCost;  
23d0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63 6f 73      /* Total cos
23e0: 74 20 6f 66 20 74 68 69 73 20 70 61 74 68 20 2a  t of this path *
23f0: 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72 65 64  /.  u8 isOrdered
2400: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
2410: 65 20 69 66 20 74 68 69 73 20 70 61 74 68 20 73  e if this path s
2420: 61 74 69 73 66 69 65 73 20 4f 52 44 45 52 20 42  atisfies ORDER B
2430: 59 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65  Y */.  u8 isOrde
2440: 72 65 64 56 61 6c 69 64 3b 20 20 20 20 2f 2a 20  redValid;    /* 
2450: 54 72 75 65 20 69 66 20 74 68 65 20 69 73 4f 72  True if the isOr
2460: 64 65 72 65 64 20 66 69 65 6c 64 20 69 73 20 76  dered field is v
2470: 61 6c 69 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  alid */.  WhereL
2480: 6f 6f 70 20 2a 2a 61 4c 6f 6f 70 3b 20 20 20 20  oop **aLoop;    
2490: 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 68 65 72  /* Array of Wher
24a0: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69 6d  eLoop objects im
24b0: 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  plementing this 
24c0: 70 61 74 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  path */.};../*.*
24d0: 2a 20 54 68 65 20 71 75 65 72 79 20 67 65 6e 65  * The query gene
24e0: 72 61 74 6f 72 20 75 73 65 73 20 61 6e 20 61 72  rator uses an ar
24f0: 72 61 79 20 6f 66 20 69 6e 73 74 61 6e 63 65 73  ray of instances
2500: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
2510: 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70 20 69 74  re to.** help it
2520: 20 61 6e 61 6c 79 7a 65 20 74 68 65 20 73 75 62   analyze the sub
2530: 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
2540: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
2550: 20 20 45 61 63 68 20 57 48 45 52 45 0a 2a 2a 20    Each WHERE.** 
2560: 63 6c 61 75 73 65 20 73 75 62 65 78 70 72 65 73  clause subexpres
2570: 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65  sion is separate
2580: 64 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  d from the other
2590: 73 20 62 79 20 41 4e 44 20 6f 70 65 72 61 74 6f  s by AND operato
25a0: 72 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c 79 2c 20  rs,.** usually, 
25b0: 6f 72 20 73 6f 6d 65 74 69 6d 65 73 20 73 75 62  or sometimes sub
25c0: 65 78 70 72 65 73 73 69 6f 6e 73 20 73 65 70 61  expressions sepa
25d0: 72 61 74 65 64 20 62 79 20 4f 52 2e 0a 2a 2a 0a  rated by OR..**.
25e0: 2a 2a 20 41 6c 6c 20 57 68 65 72 65 54 65 72 6d  ** All WhereTerm
25f0: 73 20 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 20  s are collected 
2600: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68  into a single Wh
2610: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
2620: 75 72 65 2e 20 20 0a 2a 2a 20 54 68 65 20 66 6f  ure.  .** The fo
2630: 6c 6c 6f 77 69 6e 67 20 69 64 65 6e 74 69 74 79  llowing identity
2640: 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   holds:.**.**   
2650: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 70       WhereTerm.p
2660: 57 43 2d 3e 61 5b 57 68 65 72 65 54 65 72 6d 2e  WC->a[WhereTerm.
2670: 69 64 78 5d 20 3d 3d 20 57 68 65 72 65 54 65 72  idx] == WhereTer
2680: 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 74  m.**.** When a t
2690: 65 72 6d 20 69 73 20 6f 66 20 74 68 65 20 66 6f  erm is of the fo
26a0: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  rm:.**.**       
26b0: 20 20 20 20 20 20 20 58 20 3c 6f 70 3e 20 3c 65         X <op> <e
26c0: 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  xpr>.**.** where
26d0: 20 58 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6e   X is a column n
26e0: 61 6d 65 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20  ame and <op> is 
26f0: 6f 6e 65 20 6f 66 20 63 65 72 74 61 69 6e 20 6f  one of certain o
2700: 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 74 68 65  perators,.** the
2710: 6e 20 57 68 65 72 65 54 65 72 6d 2e 6c 65 66 74  n WhereTerm.left
2720: 43 75 72 73 6f 72 20 61 6e 64 20 57 68 65 72 65  Cursor and Where
2730: 54 65 72 6d 2e 75 2e 6c 65 66 74 43 6f 6c 75 6d  Term.u.leftColum
2740: 6e 20 72 65 63 6f 72 64 20 74 68 65 0a 2a 2a 20  n record the.** 
2750: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 61 6e  cursor number an
2760: 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  d column number 
2770: 66 6f 72 20 58 2e 20 20 57 68 65 72 65 54 65 72  for X.  WhereTer
2780: 6d 2e 65 4f 70 65 72 61 74 6f 72 20 72 65 63 6f  m.eOperator reco
2790: 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f 70 3e 20  rds.** the <op> 
27a0: 75 73 69 6e 67 20 61 20 62 69 74 6d 61 73 6b 20  using a bitmask 
27b0: 65 6e 63 6f 64 69 6e 67 20 64 65 66 69 6e 65 64  encoding defined
27c0: 20 62 79 20 57 4f 5f 78 78 78 20 62 65 6c 6f 77   by WO_xxx below
27d0: 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65 20 6f 66  .  The.** use of
27e0: 20 61 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64   a bitmask encod
27f0: 69 6e 67 20 66 6f 72 20 74 68 65 20 6f 70 65 72  ing for the oper
2800: 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75 73 20 74  ator allows us t
2810: 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71 75 69 63  o search.** quic
2820: 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73 20 74 68  kly for terms th
2830: 61 74 20 6d 61 74 63 68 20 61 6e 79 20 6f 66 20  at match any of 
2840: 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e  several differen
2850: 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a  t operators..**.
2860: 2a 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20 6d  ** A WhereTerm m
2870: 69 67 68 74 20 61 6c 73 6f 20 62 65 20 74 77 6f  ight also be two
2880: 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d   or more subterm
2890: 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f  s connected by O
28a0: 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  R:.**.**        
28b0: 20 28 74 31 2e 58 20 3c 6f 70 3e 20 3c 65 78 70   (t1.X <op> <exp
28c0: 72 3e 29 20 4f 52 20 28 74 31 2e 59 20 3c 6f 70  r>) OR (t1.Y <op
28d0: 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 2e 2e 2e  > <expr>) OR ...
28e0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ..**.** In this 
28f0: 73 65 63 6f 6e 64 20 63 61 73 65 2c 20 77 74 46  second case, wtF
2900: 6c 61 67 20 68 61 73 20 74 68 65 20 54 45 52 4d  lag has the TERM
2910: 5f 4f 52 49 4e 46 4f 20 62 69 74 20 73 65 74 20  _ORINFO bit set 
2920: 61 6e 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57  and eOperator==W
2930: 4f 5f 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65 20  O_OR.** and the 
2940: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49  WhereTerm.u.pOrI
2950: 6e 66 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74 73  nfo field points
2960: 20 74 6f 20 61 75 78 69 6c 69 61 72 79 20 69 6e   to auxiliary in
2970: 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a 2a  formation that.*
2980: 2a 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 61  * is collected a
2990: 62 6f 75 74 20 74 68 65 20 4f 52 20 63 6c 61 75  bout the OR clau
29a0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  se..**.** If a t
29b0: 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
29c0: 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
29d0: 20 6d 61 74 63 68 20 65 69 74 68 65 72 20 6f 66   match either of
29e0: 20 74 68 65 20 74 77 6f 20 70 72 65 76 69 6f 75   the two previou
29f0: 73 0a 2a 2a 20 63 61 74 65 67 6f 72 69 65 73 2c  s.** categories,
2a00: 20 74 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 3d   then eOperator=
2a10: 3d 30 2e 20 20 54 68 65 20 57 68 65 72 65 54 65  =0.  The WhereTe
2a20: 72 6d 2e 70 45 78 70 72 20 66 69 65 6c 64 20 69  rm.pExpr field i
2a30: 73 20 73 74 69 6c 6c 20 73 65 74 0a 2a 2a 20 74  s still set.** t
2a40: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73  o the original s
2a50: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e  ubexpression con
2a60: 74 65 6e 74 20 61 6e 64 20 77 74 46 6c 61 67 73  tent and wtFlags
2a70: 20 69 73 20 73 65 74 20 75 70 20 61 70 70 72 6f   is set up appro
2a80: 70 72 69 61 74 65 6c 79 0a 2a 2a 20 62 75 74 20  priately.** but 
2a90: 6e 6f 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  no other fields 
2aa0: 69 6e 20 74 68 65 20 57 68 65 72 65 54 65 72 6d  in the WhereTerm
2ab0: 20 6f 62 6a 65 63 74 20 61 72 65 20 6d 65 61 6e   object are mean
2ac0: 69 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20 57 68  ingful..**.** Wh
2ad0: 65 6e 20 65 4f 70 65 72 61 74 6f 72 21 3d 30 2c  en eOperator!=0,
2ae0: 20 70 72 65 72 65 71 52 69 67 68 74 20 61 6e 64   prereqRight and
2af0: 20 70 72 65 72 65 71 41 6c 6c 20 72 65 63 6f 72   prereqAll recor
2b00: 64 20 73 65 74 73 20 6f 66 20 63 75 72 73 6f 72  d sets of cursor
2b10: 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20 62 75 74   numbers,.** but
2b20: 20 74 68 65 79 20 64 6f 20 73 6f 20 69 6e 64 69   they do so indi
2b30: 72 65 63 74 6c 79 2e 20 20 41 20 73 69 6e 67 6c  rectly.  A singl
2b40: 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73  e WhereMaskSet s
2b50: 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 6c 61  tructure transla
2b60: 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75  tes.** cursor nu
2b70: 6d 62 65 72 20 69 6e 74 6f 20 62 69 74 73 20 61  mber into bits a
2b80: 6e 64 20 74 68 65 20 74 72 61 6e 73 6c 61 74 65  nd the translate
2b90: 64 20 62 69 74 20 69 73 20 73 74 6f 72 65 64 20  d bit is stored 
2ba0: 69 6e 20 74 68 65 20 70 72 65 72 65 71 0a 2a 2a  in the prereq.**
2bb0: 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20 74 72   fields.  The tr
2bc0: 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75 73 65  anslation is use
2bd0: 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  d in order to ma
2be0: 78 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d 62 65  ximize the numbe
2bf0: 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74 68 61  r of.** bits tha
2c00: 74 20 77 69 6c 6c 20 66 69 74 20 69 6e 20 61 20  t will fit in a 
2c10: 42 69 74 6d 61 73 6b 2e 20 20 54 68 65 20 56 44  Bitmask.  The VD
2c20: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
2c30: 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 73 70  s might be.** sp
2c40: 72 65 61 64 20 6f 75 74 20 6f 76 65 72 20 74 68  read out over th
2c50: 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  e non-negative i
2c60: 6e 74 65 67 65 72 73 2e 20 20 46 6f 72 20 65 78  ntegers.  For ex
2c70: 61 6d 70 6c 65 2c 20 74 68 65 20 63 75 72 73 6f  ample, the curso
2c80: 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d 69 67  r.** numbers mig
2c90: 68 74 20 62 65 20 33 2c 20 38 2c 20 39 2c 20 31  ht be 3, 8, 9, 1
2ca0: 30 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c 20 61  0, 20, 23, 41, a
2cb0: 6e 64 20 34 35 2e 20 20 54 68 65 20 57 68 65 72  nd 45.  The Wher
2cc0: 65 4d 61 73 6b 53 65 74 0a 2a 2a 20 74 72 61 6e  eMaskSet.** tran
2cd0: 73 6c 61 74 65 73 20 74 68 65 73 65 20 73 70 61  slates these spa
2ce0: 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  rse cursor numbe
2cf0: 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74  rs into consecut
2d00: 69 76 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20  ive integers.** 
2d10: 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30  beginning with 0
2d20: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
2d30: 65 20 74 68 65 20 62 65 73 74 20 70 6f 73 73 69  e the best possi
2d40: 62 6c 65 20 75 73 65 20 6f 66 20 74 68 65 20 61  ble use of the a
2d50: 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62 69 74 73  vailable.** bits
2d60: 20 69 6e 20 74 68 65 20 42 69 74 6d 61 73 6b 2e   in the Bitmask.
2d70: 20 20 53 6f 2c 20 69 6e 20 74 68 65 20 65 78 61    So, in the exa
2d80: 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20  mple above, the 
2d90: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 0a 2a  cursor numbers.*
2da0: 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61 70 70 65  * would be mappe
2db0: 64 20 69 6e 74 6f 20 69 6e 74 65 67 65 72 73 20  d into integers 
2dc0: 30 20 74 68 72 6f 75 67 68 20 37 2e 0a 2a 2a 0a  0 through 7..**.
2dd0: 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
2de0: 20 74 65 72 6d 73 20 69 6e 20 61 20 6a 6f 69 6e   terms in a join
2df0: 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74   is limited by t
2e00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
2e10: 73 0a 2a 2a 20 69 6e 20 70 72 65 72 65 71 52 69  s.** in prereqRi
2e20: 67 68 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c  ght and prereqAl
2e30: 6c 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  l.  The default 
2e40: 69 73 20 36 34 20 62 69 74 73 2c 20 68 65 6e 63  is 64 bits, henc
2e50: 65 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73 20 6f  e SQLite.** is o
2e60: 6e 6c 79 20 61 62 6c 65 20 74 6f 20 70 72 6f 63  nly able to proc
2e70: 65 73 73 20 6a 6f 69 6e 73 20 77 69 74 68 20 36  ess joins with 6
2e80: 34 20 6f 72 20 66 65 77 65 72 20 74 61 62 6c 65  4 or fewer table
2e90: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  s..*/.struct Whe
2ea0: 72 65 54 65 72 6d 20 7b 0a 20 20 45 78 70 72 20  reTerm {.  Expr 
2eb0: 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  *pExpr;         
2ec0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2ed0: 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
2ee0: 6f 6e 20 74 68 61 74 20 69 73 20 74 68 69 73 20  on that is this 
2ef0: 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 50  term */.  int iP
2f00: 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  arent;          
2f10: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 70 57 43    /* Disable pWC
2f20: 2d 3e 61 5b 69 50 61 72 65 6e 74 5d 20 77 68 65  ->a[iParent] whe
2f30: 6e 20 74 68 69 73 20 74 65 72 6d 20 64 69 73 61  n this term disa
2f40: 62 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  bled */.  int le
2f50: 66 74 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20  ftCursor;       
2f60: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
2f70: 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f  er of X in "X <o
2f80: 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20  p> <expr>" */.  
2f90: 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 69 6e 74 20  union {.    int 
2fa0: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  leftColumn;     
2fb0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75      /* Column nu
2fc0: 6d 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20  mber of X in "X 
2fd0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a  <op> <expr>" */.
2fe0: 20 20 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20      WhereOrInfo 
2ff0: 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 2f 2a 20 45  *pOrInfo;   /* E
3000: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
3010: 20 69 66 20 28 65 4f 70 65 72 61 74 6f 72 20 26   if (eOperator &
3020: 20 57 4f 5f 4f 52 29 21 3d 30 20 2a 2f 0a 20 20   WO_OR)!=0 */.  
3030: 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a    WhereAndInfo *
3040: 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78 74  pAndInfo; /* Ext
3050: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ra information i
3060: 66 20 28 65 4f 70 65 72 61 74 6f 72 26 20 57 4f  f (eOperator& WO
3070: 5f 41 4e 44 29 21 3d 30 20 2a 2f 0a 20 20 7d 20  _AND)!=0 */.  } 
3080: 75 3b 0a 20 20 75 31 36 20 65 4f 70 65 72 61 74  u;.  u16 eOperat
3090: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or;          /* 
30a0: 41 20 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65  A WO_xx value de
30b0: 73 63 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f  scribing <op> */
30c0: 0a 20 20 75 38 20 77 74 46 6c 61 67 73 3b 20 20  .  u8 wtFlags;  
30d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 45             /* TE
30e0: 52 4d 5f 78 78 78 20 62 69 74 20 66 6c 61 67 73  RM_xxx bit flags
30f0: 2e 20 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a  .  See below */.
3100: 20 20 75 38 20 6e 43 68 69 6c 64 3b 20 20 20 20    u8 nChild;    
3110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3120: 62 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20  ber of children 
3130: 74 68 61 74 20 6d 75 73 74 20 64 69 73 61 62 6c  that must disabl
3140: 65 20 75 73 20 2a 2f 0a 20 20 57 68 65 72 65 43  e us */.  WhereC
3150: 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20  lause *pWC;     
3160: 20 20 2f 2a 20 54 68 65 20 63 6c 61 75 73 65 20    /* The clause 
3170: 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72  this term is par
3180: 74 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73  t of */.  Bitmas
3190: 6b 20 70 72 65 72 65 71 52 69 67 68 74 3b 20 20  k prereqRight;  
31a0: 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20    /* Bitmask of 
31b0: 74 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 70  tables used by p
31c0: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 2a 2f 0a  Expr->pRight */.
31d0: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
31e0: 41 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74  All;      /* Bit
31f0: 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72  mask of tables r
3200: 65 66 65 72 65 6e 63 65 64 20 62 79 20 70 45 78  eferenced by pEx
3210: 70 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  pr */.};../*.** 
3220: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f  Allowed values o
3230: 66 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c  f WhereTerm.wtFl
3240: 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54  ags.*/.#define T
3250: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20 30  ERM_DYNAMIC    0
3260: 78 30 31 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  x01   /* Need to
3270: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70   call sqlite3Exp
3280: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
3290: 72 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45  r) */.#define TE
32a0: 52 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78  RM_VIRTUAL    0x
32b0: 30 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62 79  02   /* Added by
32c0: 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20   the optimizer. 
32d0: 20 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a   Do not code */.
32e0: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44  #define TERM_COD
32f0: 45 44 20 20 20 20 20 20 30 78 30 34 20 20 20 2f  ED      0x04   /
3300: 2a 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 61  * This term is a
3310: 6c 72 65 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a  lready coded */.
3320: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50  #define TERM_COP
3330: 49 45 44 20 20 20 20 20 30 78 30 38 20 20 20 2f  IED     0x08   /
3340: 2a 20 48 61 73 20 61 20 63 68 69 6c 64 20 2a 2f  * Has a child */
3350: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52  .#define TERM_OR
3360: 49 4e 46 4f 20 20 20 20 20 30 78 31 30 20 20 20  INFO     0x10   
3370: 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20  /* Need to free 
3380: 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  the WhereTerm.u.
3390: 70 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a  pOrInfo object *
33a0: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 41  /.#define TERM_A
33b0: 4e 44 49 4e 46 4f 20 20 20 20 30 78 32 30 20 20  NDINFO    0x20  
33c0: 20 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65   /* Need to free
33d0: 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75   the WhereTerm.u
33e0: 2e 70 41 6e 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f  .pAndInfo obj */
33f0: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52  .#define TERM_OR
3400: 5f 4f 4b 20 20 20 20 20 20 30 78 34 30 20 20 20  _OK      0x40   
3410: 2f 2a 20 55 73 65 64 20 64 75 72 69 6e 67 20 4f  /* Used during O
3420: 52 2d 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  R-clause process
3430: 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ing */.#ifdef SQ
3440: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
3450: 33 0a 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d  3.#  define TERM
3460: 5f 56 4e 55 4c 4c 20 20 20 20 30 78 38 30 20 20  _VNULL    0x80  
3470: 20 2f 2a 20 4d 61 6e 75 66 61 63 74 75 72 65 64   /* Manufactured
3480: 20 78 3e 4e 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55   x>NULL or x<=NU
3490: 4c 4c 20 74 65 72 6d 20 2a 2f 0a 23 65 6c 73 65  LL term */.#else
34a0: 0a 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f  .#  define TERM_
34b0: 56 4e 55 4c 4c 20 20 20 20 30 78 30 30 20 20 20  VNULL    0x00   
34c0: 2f 2a 20 44 69 73 61 62 6c 65 64 20 69 66 20 6e  /* Disabled if n
34d0: 6f 74 20 75 73 69 6e 67 20 73 74 61 74 33 20 2a  ot using stat3 *
34e0: 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
34f0: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
3500: 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f 62 6a  he WhereScan obj
3510: 65 63 74 20 69 73 20 75 73 65 64 20 61 73 20 61  ect is used as a
3520: 6e 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 6c  n iterator for l
3530: 6f 63 61 74 69 6e 67 0a 2a 2a 20 74 65 72 6d 73  ocating.** terms
3540: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
3550: 61 75 73 65 20 74 68 61 74 20 61 72 65 20 75 73  ause that are us
3560: 65 66 75 6c 20 74 6f 20 74 68 65 20 71 75 65 72  eful to the quer
3570: 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74  y planner..*/.st
3580: 72 75 63 74 20 57 68 65 72 65 53 63 61 6e 20 7b  ruct WhereScan {
3590: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
35a0: 70 4f 72 69 67 57 43 3b 20 20 20 20 20 20 2f 2a  pOrigWC;      /*
35b0: 20 4f 72 69 67 69 6e 61 6c 2c 20 69 6e 6e 65 72   Original, inner
35c0: 6d 6f 73 74 20 57 68 65 72 65 43 6c 61 75 73 65  most WhereClause
35d0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
35e0: 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
35f0: 20 2f 2a 20 57 68 65 72 65 43 6c 61 75 73 65 20   /* WhereClause 
3600: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
3610: 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 63 68 61  scanned */.  cha
3620: 72 20 2a 7a 43 6f 6c 6c 4e 61 6d 65 3b 20 20 20  r *zCollName;   
3630: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
3640: 72 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  red collating se
3650: 71 75 65 6e 63 65 2c 20 69 66 20 6e 6f 74 20 4e  quence, if not N
3660: 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 69 64  ULL */.  char id
3670: 78 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  xaff;           
3680: 20 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61 74 63      /* Must matc
3690: 68 20 74 68 69 73 20 61 66 66 69 6e 69 74 79 2c  h this affinity,
36a0: 20 69 66 20 7a 43 6f 6c 6c 4e 61 6d 65 21 3d 4e   if zCollName!=N
36b0: 55 4c 4c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ULL */.  unsigne
36c0: 64 20 63 68 61 72 20 6e 45 71 75 69 76 3b 20 20  d char nEquiv;  
36d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
36e0: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 45 71 75   entries in aEqu
36f0: 69 76 5b 5d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  iv[] */.  unsign
3700: 65 64 20 63 68 61 72 20 69 45 71 75 69 76 3b 20  ed char iEquiv; 
3710: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75       /* Next unu
3720: 73 65 64 20 73 6c 6f 74 20 69 6e 20 61 45 71 75  sed slot in aEqu
3730: 69 76 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 6f 70  iv[] */.  u32 op
3740: 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
3750: 20 20 20 20 20 2f 2a 20 41 63 63 65 70 74 61 62       /* Acceptab
3760: 6c 65 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  le operators */.
3770: 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20    int k;        
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3790: 52 65 73 75 6d 65 20 73 63 61 6e 6e 69 6e 67 20  Resume scanning 
37a0: 61 74 20 74 68 69 73 2d 3e 70 57 43 2d 3e 61 5b  at this->pWC->a[
37b0: 74 68 69 73 2d 3e 6b 5d 20 2a 2f 0a 20 20 69 6e  this->k] */.  in
37c0: 74 20 61 45 71 75 69 76 5b 32 32 5d 3b 20 20 20  t aEquiv[22];   
37d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
37e0: 6f 72 2c 43 6f 6c 75 6d 6e 20 70 61 69 72 73 20  or,Column pairs 
37f0: 66 6f 72 20 65 71 75 69 76 61 6c 65 6e 63 65 20  for equivalence 
3800: 63 6c 61 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f  classes */.};../
3810: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
3820: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
3830: 67 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64  g structure hold
3840: 73 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  s all informatio
3850: 6e 20 61 62 6f 75 74 20 61 0a 2a 2a 20 57 48 45  n about a.** WHE
3860: 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 6f 73 74  RE clause.  Most
3870: 6c 79 20 74 68 69 73 20 69 73 20 61 20 63 6f 6e  ly this is a con
3880: 74 61 69 6e 65 72 20 66 6f 72 20 6f 6e 65 20 6f  tainer for one o
3890: 72 20 6d 6f 72 65 20 57 68 65 72 65 54 65 72 6d  r more WhereTerm
38a0: 73 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 6c 61 6e 61  s..**.** Explana
38b0: 74 69 6f 6e 20 6f 66 20 70 4f 75 74 65 72 3a 20  tion of pOuter: 
38c0: 20 46 6f 72 20 61 20 57 48 45 52 45 20 63 6c 61   For a WHERE cla
38d0: 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a  use of the form.
38e0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
38f0: 61 20 41 4e 44 20 28 28 62 20 41 4e 44 20 63 29  a AND ((b AND c)
3900: 20 4f 52 20 28 64 20 41 4e 44 20 65 29 29 20 41   OR (d AND e)) A
3910: 4e 44 20 66 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ND f.**.** There
3920: 20 61 72 65 20 73 65 70 61 72 61 74 65 20 57 68   are separate Wh
3930: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
3940: 73 20 66 6f 72 20 74 68 65 20 77 68 6f 6c 65 20  s for the whole 
3950: 63 6c 61 75 73 65 20 61 6e 64 20 66 6f 72 0a 2a  clause and for.*
3960: 2a 20 74 68 65 20 73 75 62 63 6c 61 75 73 65 73  * the subclauses
3970: 20 22 28 62 20 41 4e 44 20 63 29 22 20 61 6e 64   "(b AND c)" and
3980: 20 22 28 64 20 41 4e 44 20 65 29 22 2e 20 20 54   "(d AND e)".  T
3990: 68 65 20 70 4f 75 74 65 72 20 66 69 65 6c 64 20  he pOuter field 
39a0: 6f 66 20 74 68 65 0a 2a 2a 20 73 75 62 63 6c 61  of the.** subcla
39b0: 75 73 65 73 20 70 6f 69 6e 74 73 20 74 6f 20 74  uses points to t
39c0: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  he WhereClause o
39d0: 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 77 68  bject for the wh
39e0: 6f 6c 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73  ole clause..*/.s
39f0: 74 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73  truct WhereClaus
3a00: 65 20 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  e {.  WhereInfo 
3a10: 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 2f  *pWInfo;       /
3a20: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  * WHERE clause p
3a30: 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78  rocessing contex
3a40: 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
3a50: 73 65 20 2a 70 4f 75 74 65 72 3b 20 20 20 20 20  se *pOuter;     
3a60: 2f 2a 20 4f 75 74 65 72 20 63 6f 6e 6a 75 6e 63  /* Outer conjunc
3a70: 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6f 70 3b  tion */.  u8 op;
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a90: 20 20 20 2f 2a 20 53 70 6c 69 74 20 6f 70 65 72     /* Split oper
3aa0: 61 74 6f 72 2e 20 20 54 4b 5f 41 4e 44 20 6f 72  ator.  TK_AND or
3ab0: 20 54 4b 5f 4f 52 20 2a 2f 0a 20 20 69 6e 74 20   TK_OR */.  int 
3ac0: 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nTerm;          
3ad0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3ae0: 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  f terms */.  int
3af0: 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20   nSlot;         
3b00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3b10: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 5b  of entries in a[
3b20: 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  ] */.  WhereTerm
3b30: 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20   *a;            
3b40: 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64 65 73 63  /* Each a[] desc
3b50: 72 69 62 65 73 20 61 20 74 65 72 6d 20 6f 66 20  ribes a term of 
3b60: 74 68 65 20 57 48 45 52 45 20 63 6c 75 61 73 65  the WHERE cluase
3b70: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
3b80: 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f 53 54 41  SQLITE_SMALL_STA
3b90: 43 4b 29 0a 20 20 57 68 65 72 65 54 65 72 6d 20  CK).  WhereTerm 
3ba0: 61 53 74 61 74 69 63 5b 31 5d 3b 20 20 20 20 2f  aStatic[1];    /
3bb0: 2a 20 49 6e 69 74 69 61 6c 20 73 74 61 74 69 63  * Initial static
3bc0: 20 73 70 61 63 65 20 66 6f 72 20 61 5b 5d 20 2a   space for a[] *
3bd0: 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65 72 65 54  /.#else.  WhereT
3be0: 65 72 6d 20 61 53 74 61 74 69 63 5b 38 5d 3b 20  erm aStatic[8]; 
3bf0: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74     /* Initial st
3c00: 61 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61  atic space for a
3c10: 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  [] */.#endif.};.
3c20: 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65  ./*.** A WhereTe
3c30: 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74 6f  rm with eOperato
3c40: 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20 69 74 73  r==WO_OR has its
3c50: 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f 69 6e 74   u.pOrInfo point
3c60: 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61 20 64  er set to.** a d
3c70: 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
3c80: 61 74 65 64 20 69 6e 73 74 61 6e 63 65 20 6f 66  ated instance of
3c90: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
3ca0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
3cb0: 75 63 74 20 57 68 65 72 65 4f 72 49 6e 66 6f 20  uct WhereOrInfo 
3cc0: 7b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  {.  WhereClause 
3cd0: 77 63 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  wc;          /* 
3ce0: 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 69 6e  Decomposition in
3cf0: 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20  to subterms */. 
3d00: 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62   Bitmask indexab
3d10: 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74  le;       /* Bit
3d20: 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69 6e 64 65  mask of all inde
3d30: 78 61 62 6c 65 20 74 61 62 6c 65 73 20 69 6e 20  xable tables in 
3d40: 74 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 7d 3b  the clause */.};
3d50: 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54  ../*.** A WhereT
3d60: 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74  erm with eOperat
3d70: 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61 73 20 69  or==WO_AND has i
3d80: 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f 20 70 6f  ts u.pAndInfo po
3d90: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
3da0: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
3db0: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
3dc0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
3dd0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
3de0: 73 74 72 75 63 74 20 57 68 65 72 65 41 6e 64 49  struct WhereAndI
3df0: 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61  nfo {.  WhereCla
3e00: 75 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20  use wc;         
3e10: 20 2f 2a 20 54 68 65 20 73 75 62 65 78 70 72 65   /* The subexpre
3e20: 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20 6f 75 74  ssion broken out
3e30: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e   */.};../*.** An
3e40: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3e50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
3e60: 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b  ture keeps track
3e70: 20 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a   of a mapping.**
3e80: 20 62 65 74 77 65 65 6e 20 56 44 42 45 20 63 75   between VDBE cu
3e90: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e 64  rsor numbers and
3ea0: 20 62 69 74 73 20 6f 66 20 74 68 65 20 62 69 74   bits of the bit
3eb0: 6d 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54 65  masks in WhereTe
3ec0: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  rm..**.** The VD
3ed0: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
3ee0: 73 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65  s are small inte
3ef0: 67 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  gers contained i
3f00: 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69 74  n .** SrcList_it
3f10: 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20 45  em.iCursor and E
3f20: 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64  xpr.iTable field
3f30: 73 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76 65  s.  For any give
3f40: 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75  n WHERE .** clau
3f50: 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e  se, the cursor n
3f60: 75 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f 74  umbers might not
3f70: 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e   begin with 0 an
3f80: 64 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a 20  d they might.** 
3f90: 63 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e 20  contain gaps in 
3fa0: 74 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73 65  the numbering se
3fb0: 71 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65 20  quence.  But we 
3fc0: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61 78  want to make max
3fd0: 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20 74  imum.** use of t
3fe0: 68 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20 62  he bits in our b
3ff0: 69 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20 73  itmasks.  This s
4000: 74 72 75 63 74 75 72 65 20 70 72 6f 76 69 64 65  tructure provide
4010: 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 66  s a mapping.** f
4020: 72 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20 63  rom the sparse c
4030: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e  ursor numbers in
4040: 74 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69  to consecutive i
4050: 6e 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69 6e  ntegers beginnin
4060: 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a 0a  g.** with 0..**.
4070: 2a 2a 20 49 66 20 57 68 65 72 65 4d 61 73 6b 53  ** If WhereMaskS
4080: 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d  et.ix[A]==B it m
4090: 65 61 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d  eans that The A-
40a0: 74 68 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d  th bit of a Bitm
40b0: 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ask.** correspon
40c0: 64 73 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  ds VDBE cursor n
40d0: 75 6d 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d  umber B.  The A-
40e0: 74 68 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d  th bit of a bitm
40f0: 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a  ask is 1<<A..**.
4100: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
4110: 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
4120: 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75  use expression u
4130: 73 65 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a  sed these VDBE.*
4140: 2a 20 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35  * cursors:  4, 5
4150: 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e  , 8, 29, 57, 73.
4160: 20 20 54 68 65 6e 20 74 68 65 20 20 57 68 65 72    Then the  Wher
4170: 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
4180: 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20  re.** would map 
4190: 74 68 6f 73 65 20 63 75 72 73 6f 72 20 6e 75 6d  those cursor num
41a0: 62 65 72 73 20 69 6e 74 6f 20 62 69 74 73 20 30  bers into bits 0
41b0: 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a   through 5..**.*
41c0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
41d0: 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e  mapping is not n
41e0: 65 63 65 73 73 61 72 69 6c 79 20 6f 72 64 65 72  ecessarily order
41f0: 65 64 2e 20 20 49 6e 20 74 68 65 20 65 78 61 6d  ed.  In the exam
4200: 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68  ple.** above, th
4210: 65 20 6d 61 70 70 69 6e 67 20 6d 69 67 68 74 20  e mapping might 
4220: 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 34  go like this:  4
4230: 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c  ->3, 5->1, 8->2,
4240: 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35   29->0,.** 57->5
4250: 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65  , 73->4.  Or one
4260: 20 6f 66 20 37 31 39 20 6f 74 68 65 72 20 63 6f   of 719 other co
4270: 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74  mbinations might
4280: 20 62 65 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20   be used. It.** 
4290: 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  does not really 
42a0: 6d 61 74 74 65 72 2e 20 20 57 68 61 74 20 69 73  matter.  What is
42b0: 20 69 6d 70 6f 72 74 61 6e 74 20 69 73 20 74 68   important is th
42c0: 61 74 20 73 70 61 72 73 65 20 63 75 72 73 6f 72  at sparse cursor
42d0: 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20  .** numbers all 
42e0: 67 65 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  get mapped into 
42f0: 62 69 74 20 6e 75 6d 62 65 72 73 20 74 68 61 74  bit numbers that
4300: 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e   begin with 0 an
4310: 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20  d contain.** no 
4320: 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  gaps..*/.struct 
4330: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 7b 0a 20  WhereMaskSet {. 
4340: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4360: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 73 73 69  * Number of assi
4370: 67 6e 65 64 20 63 75 72 73 6f 72 20 76 61 6c 75  gned cursor valu
4380: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 78 5b 42  es */.  int ix[B
4390: 4d 53 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  MS];            
43a0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
43b0: 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63 68  assigned to each
43c0: 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a   bit */.};../*.*
43d0: 2a 20 54 68 69 73 20 6f 62 6a 65 63 74 20 69 73  * This object is
43e0: 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77   a convenience w
43f0: 72 61 70 70 65 72 20 68 6f 6c 64 69 6e 67 20 61  rapper holding a
4400: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e  ll information n
4410: 65 65 64 65 64 0a 2a 2a 20 74 6f 20 63 6f 6e 73  eeded.** to cons
4420: 74 72 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 20  truct WhereLoop 
4430: 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 70 61  objects for a pa
4440: 72 74 69 63 75 6c 61 72 20 71 75 65 72 79 2e 0a  rticular query..
4450: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4c  */.struct WhereL
4460: 6f 6f 70 42 75 69 6c 64 65 72 20 7b 0a 20 20 57  oopBuilder {.  W
4470: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
4480: 3b 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f  ;        /* Info
4490: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
44a0: 69 73 20 57 48 45 52 45 20 2a 2f 0a 20 20 57 68  is WHERE */.  Wh
44b0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
44c0: 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
44d0: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f   clause terms */
44e0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
44f0: 64 65 72 42 79 3b 20 20 20 20 20 20 20 2f 2a 20  derBy;       /* 
4500: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
4510: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
4520: 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 2f  pNew;          /
4530: 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65  * Template Where
4540: 4c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4f  Loop */.  WhereO
4550: 72 53 65 74 20 2a 70 4f 72 53 65 74 3b 20 20 20  rSet *pOrSet;   
4560: 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 62 65      /* Record be
4570: 73 74 20 6c 6f 6f 70 73 20 68 65 72 65 2c 20 69  st loops here, i
4580: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 7d 3b  f not NULL */.};
4590: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 57 48 45 52  ../*.** The WHER
45a0: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
45b0: 69 6e 67 20 72 6f 75 74 69 6e 65 20 68 61 73 20  ing routine has 
45c0: 74 77 6f 20 68 61 6c 76 65 73 2e 20 20 54 68 65  two halves.  The
45d0: 0a 2a 2a 20 66 69 72 73 74 20 70 61 72 74 20 64  .** first part d
45e0: 6f 65 73 20 74 68 65 20 73 74 61 72 74 20 6f 66  oes the start of
45f0: 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 20   the WHERE loop 
4600: 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a  and the second.*
4610: 2a 20 68 61 6c 66 20 64 6f 65 73 20 74 68 65 20  * half does the 
4620: 74 61 69 6c 20 6f 66 20 74 68 65 20 57 48 45 52  tail of the WHER
4630: 45 20 6c 6f 6f 70 2e 20 20 41 6e 20 69 6e 73 74  E loop.  An inst
4640: 61 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20  ance of.** this 
4650: 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65 74  structure is ret
4660: 75 72 6e 65 64 20 62 79 20 74 68 65 20 66 69 72  urned by the fir
4670: 73 74 20 68 61 6c 66 20 61 6e 64 20 70 61 73 73  st half and pass
4680: 65 64 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73  ed.** into the s
4690: 65 63 6f 6e 64 20 68 61 6c 66 20 74 6f 20 67 69  econd half to gi
46a0: 76 65 20 73 6f 6d 65 20 63 6f 6e 74 69 6e 75 69  ve some continui
46b0: 74 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 73  ty..**.** An ins
46c0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
46d0: 6a 65 63 74 20 68 6f 6c 64 73 20 74 68 65 20 63  ject holds the c
46e0: 6f 6d 70 6c 65 74 65 20 73 74 61 74 65 20 6f 66  omplete state of
46f0: 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 70 6c   the query.** pl
4700: 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 72 75 63 74  anner..*/.struct
4710: 20 57 68 65 72 65 49 6e 66 6f 20 7b 0a 20 20 50   WhereInfo {.  P
4720: 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
4730: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
4740: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
4750: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
4760: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
4770: 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 2f  abList;        /
4780: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
4790: 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   in the join */.
47a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
47b0: 65 72 42 79 3b 20 20 20 20 20 20 20 2f 2a 20 54  erBy;       /* T
47c0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
47d0: 73 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  se or NULL */.  
47e0: 45 78 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c  ExprList *pResul
47f0: 74 53 65 74 3b 20 20 20 20 20 2f 2a 20 52 65 73  tSet;     /* Res
4800: 75 6c 74 20 73 65 74 2e 20 44 49 53 54 49 4e 43  ult set. DISTINC
4810: 54 20 6f 70 65 72 61 74 65 73 20 6f 6e 20 74 68  T operates on th
4820: 65 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ese */.  WhereLo
4830: 6f 70 20 2a 70 4c 6f 6f 70 73 3b 20 20 20 20 20  op *pLoops;     
4840: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
4850: 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  l WhereLoop obje
4860: 63 74 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  cts */.  Bitmask
4870: 20 72 65 76 4d 61 73 6b 3b 20 20 20 20 20 20 20   revMask;       
4880: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52     /* Mask of OR
4890: 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61  DER BY terms tha
48a0: 74 20 6e 65 65 64 20 72 65 76 65 72 73 69 6e 67  t need reversing
48b0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
48c0: 6e 52 6f 77 4f 75 74 3b 20 20 20 20 20 20 20 20  nRowOut;        
48d0: 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d  /* Estimated num
48e0: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
48f0: 77 73 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  ws */.  u16 wctr
4900: 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  lFlags;         
4910: 20 20 2f 2a 20 46 6c 61 67 73 20 6f 72 69 67 69    /* Flags origi
4920: 6e 61 6c 6c 79 20 70 61 73 73 65 64 20 74 6f 20  nally passed to 
4930: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
4940: 6e 28 29 20 2a 2f 0a 20 20 75 38 20 62 4f 42 53  n() */.  u8 bOBS
4950: 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
4960: 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 73     /* ORDER BY s
4970: 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64 69  atisfied by indi
4980: 63 65 73 20 2a 2f 0a 20 20 75 38 20 6f 6b 4f 6e  ces */.  u8 okOn
4990: 65 50 61 73 73 3b 20 20 20 20 20 20 20 20 20 20  ePass;          
49a0: 20 20 20 2f 2a 20 4f 6b 20 74 6f 20 75 73 65 20     /* Ok to use 
49b0: 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
49c0: 68 6d 20 66 6f 72 20 55 50 44 41 54 45 2f 44 45  hm for UPDATE/DE
49d0: 4c 45 54 45 20 2a 2f 0a 20 20 75 38 20 75 6e 74  LETE */.  u8 unt
49e0: 65 73 74 65 64 54 65 72 6d 73 3b 20 20 20 20 20  estedTerms;     
49f0: 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 20 57      /* Not all W
4a00: 48 45 52 45 20 74 65 72 6d 73 20 72 65 73 6f 6c  HERE terms resol
4a10: 76 65 64 20 62 79 20 6f 75 74 65 72 20 6c 6f 6f  ved by outer loo
4a20: 70 20 2a 2f 0a 20 20 75 38 20 65 44 69 73 74 69  p */.  u8 eDisti
4a30: 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nct;            
4a40: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57   /* One of the W
4a50: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20  HERE_DISTINCT_* 
4a60: 76 61 6c 75 65 73 20 62 65 6c 6f 77 20 2a 2f 0a  values below */.
4a70: 20 20 75 38 20 6e 4c 65 76 65 6c 3b 20 20 20 20    u8 nLevel;    
4a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4a90: 75 6d 62 65 72 20 6f 66 20 6e 65 73 74 65 64 20  umber of nested 
4aa0: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 54  loop */.  int iT
4ab0: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
4ac0: 20 20 20 20 2f 2a 20 54 68 65 20 76 65 72 79 20      /* The very 
4ad0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
4ae0: 20 57 48 45 52 45 20 6c 6f 6f 70 20 2a 2f 0a 20   WHERE loop */. 
4af0: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 20   int iContinue; 
4b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
4b10: 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
4b20: 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 65  nue with next re
4b30: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 42  cord */.  int iB
4b40: 72 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20 20  reak;           
4b50: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
4b60: 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
4b70: 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
4b80: 6e 74 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  nt savedNQueryLo
4b90: 6f 70 3b 20 20 20 20 20 20 2f 2a 20 70 50 61 72  op;      /* pPar
4ba0: 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 6f  se->nQueryLoop o
4bb0: 75 74 73 69 64 65 20 74 68 65 20 57 48 45 52 45  utside the WHERE
4bc0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65   loop */.  Where
4bd0: 4d 61 73 6b 53 65 74 20 73 4d 61 73 6b 53 65 74  MaskSet sMaskSet
4be0: 3b 20 20 20 20 2f 2a 20 4d 61 70 20 63 75 72 73  ;    /* Map curs
4bf0: 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69  or numbers to bi
4c00: 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 57 68 65 72  tmasks */.  Wher
4c10: 65 43 6c 61 75 73 65 20 73 57 43 3b 20 20 20 20  eClause sWC;    
4c20: 20 20 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f        /* Decompo
4c30: 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 57 48  sition of the WH
4c40: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
4c50: 57 68 65 72 65 4c 65 76 65 6c 20 61 5b 31 5d 3b  WhereLevel a[1];
4c60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
4c70: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 65  ormation about e
4c80: 61 63 68 20 6e 65 73 74 20 6c 6f 6f 70 20 69 6e  ach nest loop in
4c90: 20 57 48 45 52 45 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   WHERE */.};../*
4ca0: 0a 2a 2a 20 42 69 74 6d 61 73 6b 73 20 66 6f 72  .** Bitmasks for
4cb0: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 6f   the operators o
4cc0: 6e 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65  n WhereTerm obje
4cd0: 63 74 73 2e 20 20 54 68 65 73 65 20 61 72 65 20  cts.  These are 
4ce0: 61 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 73  all.** operators
4cf0: 20 74 68 61 74 20 61 72 65 20 6f 66 20 69 6e 74   that are of int
4d00: 65 72 65 73 74 20 74 6f 20 74 68 65 20 71 75 65  erest to the que
4d10: 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 41 6e 0a  ry planner.  An.
4d20: 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61  ** OR-ed combina
4d30: 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61  tion of these va
4d40: 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73 65 64  lues can be used
4d50: 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20   when searching 
4d60: 66 6f 72 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61  for.** particula
4d70: 72 20 57 68 65 72 65 54 65 72 6d 73 20 77 69 74  r WhereTerms wit
4d80: 68 69 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73  hin a WhereClaus
4d90: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  e..*/.#define WO
4da0: 5f 49 4e 20 20 20 20 20 30 78 30 30 31 0a 23 64  _IN     0x001.#d
4db0: 65 66 69 6e 65 20 57 4f 5f 45 51 20 20 20 20 20  efine WO_EQ     
4dc0: 30 78 30 30 32 0a 23 64 65 66 69 6e 65 20 57 4f  0x002.#define WO
4dd0: 5f 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c  _LT     (WO_EQ<<
4de0: 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23  (TK_LT-TK_EQ)).#
4df0: 64 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20  define WO_LE    
4e00: 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d   (WO_EQ<<(TK_LE-
4e10: 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20  TK_EQ)).#define 
4e20: 57 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51  WO_GT     (WO_EQ
4e30: 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29  <<(TK_GT-TK_EQ))
4e40: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20  .#define WO_GE  
4e50: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47     (WO_EQ<<(TK_G
4e60: 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e  E-TK_EQ)).#defin
4e70: 65 20 57 4f 5f 4d 41 54 43 48 20 20 30 78 30 34  e WO_MATCH  0x04
4e80: 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e  0.#define WO_ISN
4e90: 55 4c 4c 20 30 78 30 38 30 0a 23 64 65 66 69 6e  ULL 0x080.#defin
4ea0: 65 20 57 4f 5f 4f 52 20 20 20 20 20 30 78 31 30  e WO_OR     0x10
4eb0: 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f  0       /* Two o
4ec0: 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63  r more OR-connec
4ed0: 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65  ted terms */.#de
4ee0: 66 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20 30  fine WO_AND    0
4ef0: 78 32 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77  x200       /* Tw
4f00: 6f 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d 63 6f  o or more AND-co
4f10: 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f  nnected terms */
4f20: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 55 49  .#define WO_EQUI
4f30: 56 20 20 30 78 34 30 30 20 20 20 20 20 20 20 2f  V  0x400       /
4f40: 2a 20 4f 66 20 74 68 65 20 66 6f 72 6d 20 41 3d  * Of the form A=
4f50: 3d 42 2c 20 62 6f 74 68 20 63 6f 6c 75 6d 6e 73  =B, both columns
4f60: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4e   */.#define WO_N
4f70: 4f 4f 50 20 20 20 30 78 38 30 30 20 20 20 20 20  OOP   0x800     
4f80: 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 64    /* This term d
4f90: 6f 65 73 20 6e 6f 74 20 72 65 73 74 72 69 63 74  oes not restrict
4fa0: 20 73 65 61 72 63 68 20 73 70 61 63 65 20 2a 2f   search space */
4fb0: 0a 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4c 4c  ..#define WO_ALL
4fc0: 20 20 20 20 30 78 66 66 66 20 20 20 20 20 20 20      0xfff       
4fd0: 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 70  /* Mask of all p
4fe0: 6f 73 73 69 62 6c 65 20 57 4f 5f 2a 20 76 61 6c  ossible WO_* val
4ff0: 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ues */.#define W
5000: 4f 5f 53 49 4e 47 4c 45 20 30 78 30 66 66 20 20  O_SINGLE 0x0ff  
5010: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
5020: 61 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64  all non-compound
5030: 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a   WO_* values */.
5040: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  ./*.** These are
5050: 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20   definitions of 
5060: 62 69 74 73 20 69 6e 20 74 68 65 20 57 68 65 72  bits in the Wher
5070: 65 4c 6f 6f 70 2e 77 73 46 6c 61 67 73 20 66 69  eLoop.wsFlags fi
5080: 65 6c 64 2e 0a 2a 2a 20 54 68 65 20 70 61 72 74  eld..** The part
5090: 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69  icular combinati
50a0: 6f 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 65 61  on of bits in ea
50b0: 63 68 20 57 68 65 72 65 4c 6f 6f 70 20 68 65 6c  ch WhereLoop hel
50c0: 70 20 74 6f 0a 2a 2a 20 64 65 74 65 72 6d 69 6e  p to.** determin
50d0: 65 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20  e the algorithm 
50e0: 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 72  that WhereLoop r
50f0: 65 70 72 65 73 65 6e 74 73 2e 0a 2a 2f 0a 23 64  epresents..*/.#d
5100: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
5110: 4d 4e 5f 45 51 20 20 20 20 30 78 30 30 30 30 30  MN_EQ    0x00000
5120: 30 30 31 20 20 2f 2a 20 78 3d 45 58 50 52 20 2a  001  /* x=EXPR *
5130: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
5140: 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30 78 30  COLUMN_RANGE 0x0
5150: 30 30 30 30 30 30 32 20 20 2f 2a 20 78 3c 45 58  0000002  /* x<EX
5160: 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52  PR and/or x>EXPR
5170: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
5180: 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 30  E_COLUMN_IN    0
5190: 78 30 30 30 30 30 30 30 34 20 20 2f 2a 20 78 20  x00000004  /* x 
51a0: 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66  IN (...) */.#def
51b0: 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ine WHERE_COLUMN
51c0: 5f 4e 55 4c 4c 20 20 30 78 30 30 30 30 30 30 30  _NULL  0x0000000
51d0: 38 20 20 2f 2a 20 78 20 49 53 20 4e 55 4c 4c 20  8  /* x IS NULL 
51e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
51f0: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20 20 30 78  _CONSTRAINT   0x
5200: 30 30 30 30 30 30 30 66 20 20 2f 2a 20 41 6e 79  0000000f  /* Any
5210: 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 43 4f   of the WHERE_CO
5220: 4c 55 4d 4e 5f 78 78 78 20 76 61 6c 75 65 73 20  LUMN_xxx values 
5230: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
5240: 5f 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20 30 78  _TOP_LIMIT    0x
5250: 30 30 30 30 30 30 31 30 20 20 2f 2a 20 78 3c 45  00000010  /* x<E
5260: 58 50 52 20 6f 72 20 78 3c 3d 45 58 50 52 20 63  XPR or x<=EXPR c
5270: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65  onstraint */.#de
5280: 66 69 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c  fine WHERE_BTM_L
5290: 49 4d 49 54 20 20 20 20 30 78 30 30 30 30 30 30  IMIT    0x000000
52a0: 32 30 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72  20  /* x>EXPR or
52b0: 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72 61   x>=EXPR constra
52c0: 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  int */.#define W
52d0: 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20  HERE_BOTH_LIMIT 
52e0: 20 20 30 78 30 30 30 30 30 30 33 30 20 20 2f 2a    0x00000030  /*
52f0: 20 42 6f 74 68 20 78 3e 45 58 50 52 20 61 6e 64   Both x>EXPR and
5300: 20 78 3c 45 58 50 52 20 2a 2f 0a 23 64 65 66 69   x<EXPR */.#defi
5310: 6e 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  ne WHERE_IDX_ONL
5320: 59 20 20 20 20 20 30 78 30 30 30 30 30 30 34 30  Y     0x00000040
5330: 20 20 2f 2a 20 55 73 65 20 69 6e 64 65 78 20 6f    /* Use index o
5340: 6e 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65  nly - omit table
5350: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
5360: 45 5f 49 50 4b 20 20 20 20 20 20 20 20 20 20 30  E_IPK          0
5370: 78 30 30 30 30 30 31 30 30 20 20 2f 2a 20 78 20  x00000100  /* x 
5380: 69 73 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  is the INTEGER P
5390: 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 23 64  RIMARY KEY */.#d
53a0: 65 66 69 6e 65 20 57 48 45 52 45 5f 49 4e 44 45  efine WHERE_INDE
53b0: 58 45 44 20 20 20 20 20 20 30 78 30 30 30 30 30  XED      0x00000
53c0: 32 30 30 20 20 2f 2a 20 57 68 65 72 65 4c 6f 6f  200  /* WhereLoo
53d0: 70 2e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  p.u.btree.pIndex
53e0: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 23 64 65   is valid */.#de
53f0: 66 69 6e 65 20 57 48 45 52 45 5f 56 49 52 54 55  fine WHERE_VIRTU
5400: 41 4c 54 41 42 4c 45 20 30 78 30 30 30 30 30 34  ALTABLE 0x000004
5410: 30 30 20 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70  00  /* WhereLoop
5420: 2e 75 2e 76 74 61 62 20 69 73 20 76 61 6c 69 64  .u.vtab is valid
5430: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
5440: 45 5f 49 4e 5f 41 42 4c 45 20 20 20 20 20 20 30  E_IN_ABLE      0
5450: 78 30 30 30 30 30 38 30 30 20 20 2f 2a 20 41 62  x00000800  /* Ab
5460: 6c 65 20 74 6f 20 73 75 70 70 6f 72 74 20 61 6e  le to support an
5470: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
5480: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4f 4e  #define WHERE_ON
5490: 45 52 4f 57 20 20 20 20 20 20 20 30 78 30 30 30  EROW       0x000
54a0: 30 31 30 30 30 20 20 2f 2a 20 53 65 6c 65 63 74  01000  /* Select
54b0: 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s no more than o
54c0: 6e 65 20 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e  ne row */.#defin
54d0: 65 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  e WHERE_MULTI_OR
54e0: 20 20 20 20 20 30 78 30 30 30 30 32 30 30 30 20       0x00002000 
54f0: 20 2f 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75 6c   /* OR using mul
5500: 74 69 70 6c 65 20 69 6e 64 69 63 65 73 20 2a 2f  tiple indices */
5510: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 41  .#define WHERE_A
5520: 55 54 4f 5f 49 4e 44 45 58 20 20 20 30 78 30 30  UTO_INDEX   0x00
5530: 30 30 34 30 30 30 20 20 2f 2a 20 55 73 65 73 20  004000  /* Uses 
5540: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
5550: 65 78 20 2a 2f 0a 0a 0a 2f 2a 20 43 6f 6e 76 65  ex */.../* Conve
5560: 72 74 20 61 20 57 68 65 72 65 43 6f 73 74 20 76  rt a WhereCost v
5570: 61 6c 75 65 20 28 31 30 20 74 69 6d 65 73 20 6c  alue (10 times l
5580: 6f 67 32 28 58 29 29 20 69 6e 74 6f 20 69 74 73  og2(X)) into its
5590: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 58   integer value X
55a0: 2e 0a 2a 2a 20 41 20 72 6f 75 67 68 20 61 70 70  ..** A rough app
55b0: 72 6f 78 69 6d 61 74 69 6f 6e 20 69 73 20 75 73  roximation is us
55c0: 65 64 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72  ed.  The value r
55d0: 65 74 75 72 6e 65 64 20 69 73 20 6e 6f 74 20 65  eturned is not e
55e0: 78 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  xact..*/.static 
55f0: 75 36 34 20 77 68 65 72 65 43 6f 73 74 54 6f 49  u64 whereCostToI
5600: 6e 74 28 57 68 65 72 65 43 6f 73 74 20 78 29 7b  nt(WhereCost x){
5610: 0a 20 20 75 36 34 20 6e 3b 0a 20 20 69 66 28 20  .  u64 n;.  if( 
5620: 78 3c 31 30 20 29 20 72 65 74 75 72 6e 20 31 3b  x<10 ) return 1;
5630: 0a 20 20 6e 20 3d 20 78 25 31 30 3b 0a 20 20 78  .  n = x%10;.  x
5640: 20 2f 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 3e   /= 10;.  if( n>
5650: 3d 35 20 29 20 6e 20 2d 3d 20 32 3b 0a 20 20 65  =5 ) n -= 2;.  e
5660: 6c 73 65 20 69 66 28 20 6e 3e 3d 31 20 29 20 6e  lse if( n>=1 ) n
5670: 20 2d 3d 20 31 3b 0a 20 20 69 66 28 20 78 3e 3d   -= 1;.  if( x>=
5680: 33 20 29 20 72 65 74 75 72 6e 20 28 6e 2b 38 29  3 ) return (n+8)
5690: 3c 3c 28 78 2d 33 29 3b 0a 20 20 72 65 74 75 72  <<(x-3);.  retur
56a0: 6e 20 28 6e 2b 38 29 3e 3e 28 33 2d 78 29 3b 0a  n (n+8)>>(3-x);.
56b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
56c0: 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  the estimated nu
56d0: 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
56e0: 6f 77 73 20 66 72 6f 6d 20 61 20 57 48 45 52 45  ows from a WHERE
56f0: 20 63 6c 61 75 73 65 0a 2a 2f 0a 75 36 34 20 73   clause.*/.u64 s
5700: 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75  qlite3WhereOutpu
5710: 74 52 6f 77 43 6f 75 6e 74 28 57 68 65 72 65 49  tRowCount(WhereI
5720: 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
5730: 72 65 74 75 72 6e 20 77 68 65 72 65 43 6f 73 74  return whereCost
5740: 54 6f 49 6e 74 28 70 57 49 6e 66 6f 2d 3e 6e 52  ToInt(pWInfo->nR
5750: 6f 77 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  owOut);.}../*.**
5760: 20 52 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74   Return one of t
5770: 68 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  he WHERE_DISTINC
5780: 54 5f 78 78 78 78 78 20 76 61 6c 75 65 73 20 74  T_xxxxx values t
5790: 6f 20 69 6e 64 69 63 61 74 65 20 68 6f 77 20 74  o indicate how t
57a0: 68 69 73 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  his.** WHERE cla
57b0: 75 73 65 20 72 65 74 75 72 6e 73 20 6f 75 74 70  use returns outp
57c0: 75 74 73 20 66 6f 72 20 44 49 53 54 49 4e 43 54  uts for DISTINCT
57d0: 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a   processing..*/.
57e0: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
57f0: 49 73 44 69 73 74 69 6e 63 74 28 57 68 65 72 65  IsDistinct(Where
5800: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
5810: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
5820: 65 44 69 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a  eDistinct;.}../*
5830: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
5840: 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
5850: 75 73 65 20 72 65 74 75 72 6e 73 20 72 6f 77 73  use returns rows
5860: 20 69 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 64   in ORDER BY ord
5870: 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41  er..** Return FA
5880: 4c 53 45 20 69 66 20 74 68 65 20 6f 75 74 70 75  LSE if the outpu
5890: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 6f  t needs to be so
58a0: 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rted..*/.int sql
58b0: 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72  ite3WhereIsOrder
58c0: 65 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ed(WhereInfo *pW
58d0: 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20  Info){.  return 
58e0: 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 21 3d  pWInfo->bOBSat!=
58f0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
5900: 72 6e 20 74 68 65 20 56 44 42 45 20 61 64 64 72  rn the VDBE addr
5910: 65 73 73 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20  ess or label to 
5920: 6a 75 6d 70 20 74 6f 20 69 6e 20 6f 72 64 65 72  jump to in order
5930: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20   to continue.** 
5940: 69 6d 6d 65 64 69 61 74 65 6c 79 20 77 69 74 68  immediately with
5950: 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66   the next row of
5960: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
5970: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
5980: 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65  hereContinueLabe
5990: 6c 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  l(WhereInfo *pWI
59a0: 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  nfo){.  return p
59b0: 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
59c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
59d0: 6e 20 74 68 65 20 56 44 42 45 20 61 64 64 72 65  n the VDBE addre
59e0: 73 73 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a  ss or label to j
59f0: 75 6d 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20  ump to in order 
5a00: 74 6f 20 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20  to break.** out 
5a10: 6f 66 20 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e  of a WHERE loop.
5a20: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
5a30: 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 57  hereBreakLabel(W
5a40: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
5a50: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  ){.  return pWIn
5a60: 66 6f 2d 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f  fo->iBreak;.}../
5a70: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
5a80: 20 69 66 20 61 6e 20 55 50 44 41 54 45 20 6f 72   if an UPDATE or
5a90: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
5aa0: 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 64 69  t can operate di
5ab0: 72 65 63 74 6c 79 20 6f 6e 0a 2a 2a 20 74 68 65  rectly on.** the
5ac0: 20 72 6f 77 69 64 73 20 72 65 74 75 72 6e 65 64   rowids returned
5ad0: 20 62 79 20 61 20 57 48 45 52 45 20 63 6c 61 75   by a WHERE clau
5ae0: 73 65 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  se.  Return FALS
5af0: 45 20 69 66 20 64 6f 69 6e 67 20 61 6e 0a 2a 2a  E if doing an.**
5b00: 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
5b10: 45 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 73  E might change s
5b20: 75 62 73 65 71 75 65 6e 74 20 57 48 45 52 45 20  ubsequent WHERE 
5b30: 63 6c 61 75 73 65 20 72 65 73 75 6c 74 73 2e 0a  clause results..
5b40: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
5b50: 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68 65  ereOkOnePass(Whe
5b60: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
5b70: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
5b80: 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b 0a 7d 0a 0a  ->okOnePass;.}..
5b90: 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
5ba0: 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72 63 20 69  ontent of pSrc i
5bb0: 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a 73 74 61  nto pDest.*/.sta
5bc0: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72  tic void whereOr
5bd0: 4d 6f 76 65 28 57 68 65 72 65 4f 72 53 65 74 20  Move(WhereOrSet 
5be0: 2a 70 44 65 73 74 2c 20 57 68 65 72 65 4f 72 53  *pDest, WhereOrS
5bf0: 65 74 20 2a 70 53 72 63 29 7b 0a 20 20 70 44 65  et *pSrc){.  pDe
5c00: 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d 3e 6e 3b  st->n = pSrc->n;
5c10: 0a 20 20 6d 65 6d 63 70 79 28 70 44 65 73 74 2d  .  memcpy(pDest-
5c20: 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20 70 44 65  >a, pSrc->a, pDe
5c30: 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28 70 44 65  st->n*sizeof(pDe
5c40: 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d 0a 0a 2f  st->a[0]));.}../
5c50: 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69 6e 73 65  *.** Try to inse
5c60: 72 74 20 61 20 6e 65 77 20 70 72 65 72 65 71 75  rt a new prerequ
5c70: 69 73 69 74 65 2f 63 6f 73 74 20 65 6e 74 72 79  isite/cost entry
5c80: 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72 65 4f   into the WhereO
5c90: 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a 0a 2a 2a  rSet pSet..**.**
5ca0: 20 54 68 65 20 6e 65 77 20 65 6e 74 72 79 20 6d   The new entry m
5cb0: 69 67 68 74 20 6f 76 65 72 77 72 69 74 65 20 61  ight overwrite a
5cc0: 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
5cd0: 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  , or it might be
5ce0: 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c 20 6f 72  .** appended, or
5cf0: 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 69 73   it might be dis
5d00: 63 61 72 64 65 64 2e 20 20 44 6f 20 77 68 61 74  carded.  Do what
5d10: 65 76 65 72 20 69 73 20 74 68 65 20 72 69 67 68  ever is the righ
5d20: 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f 20 74 68  t thing.** so th
5d30: 61 74 20 70 53 65 74 20 6b 65 65 70 73 20 74 68  at pSet keeps th
5d40: 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62 65 73 74  e N_OR_COST best
5d50: 20 65 6e 74 72 69 65 73 20 73 65 65 6e 20 73 6f   entries seen so
5d60: 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   far..*/.static 
5d70: 69 6e 74 20 77 68 65 72 65 4f 72 49 6e 73 65 72  int whereOrInser
5d80: 74 28 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20  t(.  WhereOrSet 
5d90: 2a 70 53 65 74 2c 20 20 20 20 20 20 2f 2a 20 54  *pSet,      /* T
5da0: 68 65 20 57 68 65 72 65 4f 72 53 65 74 20 74 6f  he WhereOrSet to
5db0: 20 62 65 20 75 70 64 61 74 65 64 20 2a 2f 0a 20   be updated */. 
5dc0: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 2c   Bitmask prereq,
5dd0: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65          /* Prere
5de0: 71 75 69 73 69 74 65 73 20 6f 66 20 74 68 65 20  quisites of the 
5df0: 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20 57  new entry */.  W
5e00: 68 65 72 65 43 6f 73 74 20 72 52 75 6e 2c 20 20  hereCost rRun,  
5e10: 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d 63 6f 73        /* Run-cos
5e20: 74 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74  t of the new ent
5e30: 72 79 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  ry */.  WhereCos
5e40: 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 2f  t nOut         /
5e50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  * Number of outp
5e60: 75 74 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20  uts for the new 
5e70: 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 31  entry */.){.  u1
5e80: 36 20 69 3b 0a 20 20 57 68 65 72 65 4f 72 43 6f  6 i;.  WhereOrCo
5e90: 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 70  st *p;.  for(i=p
5ea0: 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65 74 2d 3e  Set->n, p=pSet->
5eb0: 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 2b 2b  a; i>0; i--, p++
5ec0: 29 7b 0a 20 20 20 20 69 66 28 20 72 52 75 6e 3c  ){.    if( rRun<
5ed0: 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28 70 72 65  =p->rRun && (pre
5ee0: 72 65 71 20 26 20 70 2d 3e 70 72 65 72 65 71 29  req & p->prereq)
5ef0: 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20 20 20 20  ==prereq ){.    
5f00: 20 20 67 6f 74 6f 20 77 68 65 72 65 4f 72 49 6e    goto whereOrIn
5f10: 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d  sert_done;.    }
5f20: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e  .    if( p->rRun
5f30: 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d 3e 70 72  <=rRun && (p->pr
5f40: 65 72 65 71 20 26 20 70 72 65 72 65 71 29 3d 3d  ereq & prereq)==
5f50: 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a 20 20 20  p->prereq ){.   
5f60: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
5f70: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65   }.  }.  if( pSe
5f80: 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53 54 20 29  t->n<N_OR_COST )
5f90: 7b 0a 20 20 20 20 70 20 3d 20 26 70 53 65 74 2d  {.    p = &pSet-
5fa0: 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d 3b 0a 20  >a[pSet->n++];. 
5fb0: 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75     p->nOut = nOu
5fc0: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
5fd0: 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a 20 20 20  p = pSet->a;.   
5fe0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 53 65 74   for(i=1; i<pSet
5ff0: 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ->n; i++){.     
6000: 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e 70 53 65   if( p->rRun>pSe
6010: 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20 29 20 70  t->a[i].rRun ) p
6020: 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20 69 3b 0a   = pSet->a + i;.
6030: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
6040: 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29 20 72 65  >rRun<=rRun ) re
6050: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77 68 65 72  turn 0;.  }.wher
6060: 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3a 0a  eOrInsert_done:.
6070: 20 20 70 2d 3e 70 72 65 72 65 71 20 3d 20 70 72    p->prereq = pr
6080: 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52 75 6e 20  ereq;.  p->rRun 
6090: 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28 20 70 2d  = rRun;.  if( p-
60a0: 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20 70 2d 3e  >nOut>nOut ) p->
60b0: 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 72  nOut = nOut;.  r
60c0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
60d0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 70  * Initialize a p
60e0: 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  reallocated Wher
60f0: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
6100: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
6110: 64 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69  d whereClauseIni
6120: 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  t(.  WhereClause
6130: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 2f 2a   *pWC,        /*
6140: 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   The WhereClause
6150: 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   to be initializ
6160: 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  ed */.  WhereInf
6170: 6f 20 2a 70 57 49 6e 66 6f 20 20 20 20 20 20 20  o *pWInfo       
6180: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 70 72   /* The WHERE pr
6190: 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74  ocessing context
61a0: 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 57   */.){.  pWC->pW
61b0: 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20  Info = pWInfo;. 
61c0: 20 70 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 30   pWC->pOuter = 0
61d0: 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20 3d  ;.  pWC->nTerm =
61e0: 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f 74   0;.  pWC->nSlot
61f0: 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70 57 43   = ArraySize(pWC
6200: 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20 20 70 57  ->aStatic);.  pW
6210: 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74 61  C->a = pWC->aSta
6220: 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  tic;.}../* Forwa
6230: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
6240: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
6250: 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65  eClauseClear(Whe
6260: 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a 2f 2a 0a  reClause*);../*.
6270: 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c  ** Deallocate al
6280: 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  l memory associa
6290: 74 65 64 20 77 69 74 68 20 61 20 57 68 65 72 65  ted with a Where
62a0: 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a  OrInfo object..*
62b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
62c0: 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28  ereOrInfoDelete(
62d0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
62e0: 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b 0a 20 20  reOrInfo *p){.  
62f0: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
6300: 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69  (&p->wc);.  sqli
6310: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
6320: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
6330: 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79  ocate all memory
6340: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6350: 20 61 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20   a WhereAndInfo 
6360: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
6370: 63 20 76 6f 69 64 20 77 68 65 72 65 41 6e 64 49  c void whereAndI
6380: 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65  nfoDelete(sqlite
6390: 33 20 2a 64 62 2c 20 57 68 65 72 65 41 6e 64 49  3 *db, WhereAndI
63a0: 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65  nfo *p){.  where
63b0: 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e  ClauseClear(&p->
63c0: 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  wc);.  sqlite3Db
63d0: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
63e0: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
63f0: 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73   a WhereClause s
6400: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 57  tructure.  The W
6410: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
6420: 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69  ture.** itself i
6430: 73 20 6e 6f 74 20 66 72 65 65 64 2e 20 20 54 68  s not freed.  Th
6440: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
6450: 65 20 69 6e 76 65 72 73 65 20 6f 66 20 77 68 65  e inverse of whe
6460: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a  reClauseInit()..
6470: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
6480: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
6490: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
64a0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  ){.  int i;.  Wh
64b0: 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20 73 71  ereTerm *a;.  sq
64c0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d  lite3 *db = pWC-
64d0: 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  >pWInfo->pParse-
64e0: 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43  >db;.  for(i=pWC
64f0: 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43  ->nTerm-1, a=pWC
6500: 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  ->a; i>=0; i--, 
6510: 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d  a++){.    if( a-
6520: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
6530: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20  DYNAMIC ){.     
6540: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
6550: 74 65 28 64 62 2c 20 61 2d 3e 70 45 78 70 72 29  te(db, a->pExpr)
6560: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6570: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  a->wtFlags & TER
6580: 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20 20 20  M_ORINFO ){.    
6590: 20 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c    whereOrInfoDel
65a0: 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 4f 72  ete(db, a->u.pOr
65b0: 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Info);.    }else
65c0: 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20   if( a->wtFlags 
65d0: 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20 29  & TERM_ANDINFO )
65e0: 7b 0a 20 20 20 20 20 20 77 68 65 72 65 41 6e 64  {.      whereAnd
65f0: 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61  InfoDelete(db, a
6600: 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b 0a 20  ->u.pAndInfo);. 
6610: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
6620: 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74 61  WC->a!=pWC->aSta
6630: 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tic ){.    sqlit
6640: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 43  e3DbFree(db, pWC
6650: 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ->a);.  }.}../*.
6660: 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20  ** Add a single 
6670: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 65 6e  new WhereTerm en
6680: 74 72 79 20 74 6f 20 74 68 65 20 57 68 65 72 65  try to the Where
6690: 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57  Clause object pW
66a0: 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20 57 68  C..** The new Wh
66b0: 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 69  ereTerm object i
66c0: 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20 66 72  s constructed fr
66d0: 6f 6d 20 45 78 70 72 20 70 20 61 6e 64 20 77 69  om Expr p and wi
66e0: 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a 2a 20 54  th wtFlags..** T
66f0: 68 65 20 69 6e 64 65 78 20 69 6e 20 70 57 43 2d  he index in pWC-
6700: 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65 77 20  >a[] of the new 
6710: 57 68 65 72 65 54 65 72 6d 20 69 73 20 72 65 74  WhereTerm is ret
6720: 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
6730: 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74 75 72 6e  ..** 0 is return
6740: 65 64 20 69 66 20 74 68 65 20 6e 65 77 20 57 68  ed if the new Wh
6750: 65 72 65 54 65 72 6d 20 63 6f 75 6c 64 20 6e 6f  ereTerm could no
6760: 74 20 62 65 20 61 64 64 65 64 20 64 75 65 20 74  t be added due t
6770: 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c  o a memory.** al
6780: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2e 20  location error. 
6790: 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   The memory allo
67a0: 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 77  cation failure w
67b0: 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20  ill be recorded 
67c0: 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d 3e 6d 61  in.** the db->ma
67d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
67e0: 73 6f 20 74 68 61 74 20 68 69 67 68 65 72 2d 6c  so that higher-l
67f0: 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e 73 20 63  evel functions c
6800: 61 6e 20 64 65 74 65 63 74 20 69 74 2e 0a 2a 2a  an detect it..**
6810: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6820: 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74   will increase t
6830: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  he size of the p
6840: 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 20 61 73  WC->a[] array as
6850: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
6860: 2a 20 49 66 20 74 68 65 20 77 74 46 6c 61 67 73  * If the wtFlags
6870: 20 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c 75 64   argument includ
6880: 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 2c  es TERM_DYNAMIC,
6890: 20 74 68 65 6e 20 72 65 73 70 6f 6e 73 69 62 69   then responsibi
68a0: 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72 65 65  lity.** for free
68b0: 69 6e 67 20 74 68 65 20 65 78 70 72 65 73 73 69  ing the expressi
68c0: 6f 6e 20 70 20 69 73 20 61 73 73 75 6d 65 64 20  on p is assumed 
68d0: 62 79 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  by the WhereClau
68e0: 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a  se object pWC..*
68f0: 2a 20 54 68 69 73 20 69 73 20 74 72 75 65 20 65  * This is true e
6900: 76 65 6e 20 69 66 20 74 68 69 73 20 72 6f 75 74  ven if this rout
6910: 69 6e 65 20 66 61 69 6c 73 20 74 6f 20 61 6c 6c  ine fails to all
6920: 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72  ocate a new Wher
6930: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41 52  eTerm..**.** WAR
6940: 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f 75 74  NING:  This rout
6950: 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c 6c 6f  ine might reallo
6960: 63 61 74 65 20 74 68 65 20 73 70 61 63 65 20 75  cate the space u
6970: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20  sed to store.** 
6980: 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41 6c 6c  WhereTerms.  All
6990: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57 68 65   pointers to Whe
69a0: 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64 20 62  reTerms should b
69b0: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 66  e invalidated af
69c0: 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74  ter.** calling t
69d0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 53 75  his routine.  Su
69e0: 63 68 20 70 6f 69 6e 74 65 72 73 20 6d 61 79 20  ch pointers may 
69f0: 62 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64  be reinitialized
6a00: 20 62 79 20 72 65 66 65 72 65 6e 63 69 6e 67 0a   by referencing.
6a10: 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20  ** the pWC->a[] 
6a20: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
6a30: 20 69 6e 74 20 77 68 65 72 65 43 6c 61 75 73 65   int whereClause
6a40: 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c 61 75  Insert(WhereClau
6a50: 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70  se *pWC, Expr *p
6a60: 2c 20 75 38 20 77 74 46 6c 61 67 73 29 7b 0a 20  , u8 wtFlags){. 
6a70: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
6a80: 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  m;.  int idx;.  
6a90: 74 65 73 74 63 61 73 65 28 20 77 74 46 6c 61 67  testcase( wtFlag
6aa0: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
6ab0: 20 29 3b 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e   );.  if( pWC->n
6ac0: 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74  Term>=pWC->nSlot
6ad0: 20 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72   ){.    WhereTer
6ae0: 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61  m *pOld = pWC->a
6af0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
6b00: 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d  b = pWC->pWInfo-
6b10: 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20  >pParse->db;.   
6b20: 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c 69 74 65   pWC->a = sqlite
6b30: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
6b40: 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30   sizeof(pWC->a[0
6b50: 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20  ])*pWC->nSlot*2 
6b60: 29 3b 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e  );.    if( pWC->
6b70: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  a==0 ){.      if
6b80: 28 20 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ( wtFlags & TERM
6b90: 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20  _DYNAMIC ){.    
6ba0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6bb0: 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20  elete(db, p);.  
6bc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 43 2d      }.      pWC-
6bd0: 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20  >a = pOld;.     
6be0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
6bf0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 57 43 2d  .    memcpy(pWC-
6c00: 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66  >a, pOld, sizeof
6c10: 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d  (pWC->a[0])*pWC-
6c20: 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28  >nTerm);.    if(
6c30: 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61   pOld!=pWC->aSta
6c40: 74 69 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  tic ){.      sql
6c50: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
6c60: 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Old);.    }.    
6c70: 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c  pWC->nSlot = sql
6c80: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65  ite3DbMallocSize
6c90: 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f 73 69 7a  (db, pWC->a)/siz
6ca0: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a  eof(pWC->a[0]);.
6cb0: 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70    }.  pTerm = &p
6cc0: 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70 57 43 2d  WC->a[idx = pWC-
6cd0: 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20 70 54 65  >nTerm++];.  pTe
6ce0: 72 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69  rm->pExpr = sqli
6cf0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
6d00: 74 65 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e  te(p);.  pTerm->
6d10: 77 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67  wtFlags = wtFlag
6d20: 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20  s;.  pTerm->pWC 
6d30: 3d 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e  = pWC;.  pTerm->
6d40: 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20  iParent = -1;.  
6d50: 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f  return idx;.}../
6d60: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6d70: 65 20 69 64 65 6e 74 69 66 69 65 73 20 73 75 62  e identifies sub
6d80: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
6d90: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
6da0: 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75  where.** each su
6db0: 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
6dc0: 65 70 61 72 61 74 65 64 20 62 79 20 74 68 65 20  eparated by the 
6dd0: 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  AND operator or 
6de0: 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70  some other.** op
6df0: 65 72 61 74 6f 72 20 73 70 65 63 69 66 69 65 64  erator specified
6e00: 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d   in the op param
6e10: 65 74 65 72 2e 20 20 54 68 65 20 57 68 65 72 65  eter.  The Where
6e20: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
6e30: 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69  .** is filled wi
6e40: 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73  th pointers to s
6e50: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  ubexpressions.  
6e60: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
6e70: 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d  **    WHERE  a==
6e80: 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c  'hello' AND coal
6e90: 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e  esce(b,11)<10 AN
6ea0: 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d  D (c+12!=d OR c=
6eb0: 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =22).**         
6ec0: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20    \________/    
6ed0: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
6ee0: 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  _/     \________
6ef0: 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
6f00: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20          slot[0] 
6f10: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
6f20: 31 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1]              
6f30: 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54   slot[2].**.** T
6f40: 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52  he original WHER
6f50: 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70  E clause in pExp
6f60: 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20  r is unaltered. 
6f70: 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e   All this routin
6f80: 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b  e.** does is mak
6f90: 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73  e slot[] entries
6fa0: 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72   point to substr
6fb0: 75 63 74 75 72 65 20 77 69 74 68 69 6e 20 70 45  ucture within pE
6fc0: 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  xpr..**.** In th
6fd0: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
6fe0: 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64  nce and in the d
6ff0: 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22  iagram, "slot[]"
7000: 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68   refers to.** th
7010: 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b  e WhereClause.a[
7020: 5d 20 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c  ] array.  The sl
7030: 6f 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73  ot[] array grows
7040: 20 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f   as needed to co
7050: 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72  ntain.** all ter
7060: 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
7070: 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  clause..*/.stati
7080: 63 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69  c void whereSpli
7090: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
70a0: 57 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  WC, Expr *pExpr,
70b0: 20 75 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e   u8 op){.  pWC->
70c0: 6f 70 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70  op = op;.  if( p
70d0: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
70e0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
70f0: 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65  p!=op ){.    whe
7100: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
7110: 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  WC, pExpr, 0);. 
7120: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72   }else{.    wher
7130: 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70  eSplit(pWC, pExp
7140: 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20  r->pLeft, op);. 
7150: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57     whereSplit(pW
7160: 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  C, pExpr->pRight
7170: 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  , op);.  }.}../*
7180: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
7190: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62   WhereMaskSet ob
71a0: 6a 65 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ject.*/.#define 
71b0: 69 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20  initMaskSet(P)  
71c0: 28 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20  (P)->n=0../*.** 
71d0: 52 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61  Return the bitma
71e0: 73 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  sk for the given
71f0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20   cursor number. 
7200: 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20   Return 0 if.** 
7210: 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69  iCursor is not i
7220: 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74  n the set..*/.st
7230: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74  atic Bitmask get
7240: 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65  Mask(WhereMaskSe
7250: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74  t *pMaskSet, int
7260: 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74   iCursor){.  int
7270: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   i;.  assert( pM
7280: 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29  askSet->n<=(int)
7290: 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a  sizeof(Bitmask)*
72a0: 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  8 );.  for(i=0; 
72b0: 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69  i<pMaskSet->n; i
72c0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61  ++){.    if( pMa
72d0: 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43  skSet->ix[i]==iC
72e0: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72  ursor ){.      r
72f0: 65 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29  eturn MASKBIT(i)
7300: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
7310: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
7320: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61   Create a new ma
7330: 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43  sk for cursor iC
7340: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
7350: 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72  re is one cursor
7360: 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68   per table in th
7370: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
7380: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  The number of.**
7390: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
73a0: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
73b0: 6d 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20  mited by a test 
73c0: 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20  early in the.** 
73d0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
73e0: 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f  n() routine.  So
73f0: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
7400: 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d  e pMaskSet->ix[]
7410: 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e  .** array will n
7420: 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a  ever overflow..*
7430: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72  /.static void cr
7440: 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61  eateMask(WhereMa
7450: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
7460: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
7470: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
7480: 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65  t->n < ArraySize
7490: 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29  (pMaskSet->ix) )
74a0: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  ;.  pMaskSet->ix
74b0: 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20  [pMaskSet->n++] 
74c0: 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a  = iCursor;.}../*
74d0: 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
74e0: 65 73 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69  es walk (recursi
74f0: 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73  vely) an express
7500: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e  ion tree and gen
7510: 65 72 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61  erate.** a bitma
7520: 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68  sk indicating wh
7530: 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75  ich tables are u
7540: 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72  sed in that expr
7550: 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a  ession.** tree..
7560: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
7570: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
7580: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
7590: 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  t*, ExprList*);.
75a0: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
75b0: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
75c0: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
75d0: 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61  *, Select*);.sta
75e0: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
75f0: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
7600: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
7610: 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42  t, Expr *p){.  B
7620: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
7630: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
7640: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
7650: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
7660: 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74  {.    mask = get
7670: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
7680: 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72  ->iTable);.    r
7690: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a  eturn mask;.  }.
76a0: 20 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62    mask = exprTab
76b0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
76c0: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
76d0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
76e0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
76f0: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66   p->pLeft);.  if
7700: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
7710: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
7720: 74 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c  t) ){.    mask |
7730: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
7740: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
7750: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a   p->x.pSelect);.
7760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73    }else{.    mas
7770: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
7780: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
7790: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  , p->x.pList);. 
77a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
77b0: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
77c0: 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  sk exprListTable
77d0: 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53  Usage(WhereMaskS
77e0: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78  et *pMaskSet, Ex
77f0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
7800: 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61    int i;.  Bitma
7810: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69  sk mask = 0;.  i
7820: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
7830: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
7840: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
7850: 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70       mask |= exp
7860: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
7870: 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  kSet, pList->a[i
7880: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ].pExpr);.    }.
7890: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73    }.  return mas
78a0: 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d  k;.}.static Bitm
78b0: 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61  ask exprSelectTa
78c0: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
78d0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
78e0: 20 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20   Select *pS){.  
78f0: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30  Bitmask mask = 0
7900: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b  ;.  while( pS ){
7910: 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
7920: 72 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  rc = pS->pSrc;. 
7930: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
7940: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
7950: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69  askSet, pS->pELi
7960: 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  st);.    mask |=
7970: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
7980: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
7990: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
79a0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
79b0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
79c0: 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72  kSet, pS->pOrder
79d0: 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  By);.    mask |=
79e0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
79f0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57  pMaskSet, pS->pW
7a00: 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20  here);.    mask 
7a10: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
7a20: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
7a30: 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66  pHaving);.    if
7a40: 28 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30  ( ALWAYS(pSrc!=0
7a50: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
7a60: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
7a70: 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69   i<pSrc->nSrc; i
7a80: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73  ++){.        mas
7a90: 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54  k |= exprSelectT
7aa0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
7ab0: 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  et, pSrc->a[i].p
7ac0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
7ad0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
7ae0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
7af0: 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e  , pSrc->a[i].pOn
7b00: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7b10: 0a 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50  .    pS = pS->pP
7b20: 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rior;.  }.  retu
7b30: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn mask;.}../*.*
7b40: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
7b50: 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61   the given opera
7b60: 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  tor is one of th
7b70: 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  e operators that
7b80: 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66   is.** allowed f
7b90: 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20  or an indexable 
7ba0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
7bb0: 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20  m.  The allowed 
7bc0: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a  operators are.**
7bd0: 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20   "=", "<", ">", 
7be0: 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22  "<=", ">=", "IN"
7bf0: 2c 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a  , and "IS NULL".
7c00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
7c10: 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b  lowedOp(int op){
7c20: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54  .  assert( TK_GT
7c30: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c  >TK_EQ && TK_GT<
7c40: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
7c50: 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26  t( TK_LT>TK_EQ &
7c60: 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b  & TK_LT<TK_GE );
7c70: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45  .  assert( TK_LE
7c80: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c  >TK_EQ && TK_LE<
7c90: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
7ca0: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b  t( TK_GE==TK_EQ+
7cb0: 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70  4 );.  return op
7cc0: 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d  ==TK_IN || (op>=
7cd0: 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f  TK_EQ && op<=TK_
7ce0: 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53  GE) || op==TK_IS
7cf0: 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  NULL;.}../*.** S
7d00: 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20  wap two objects 
7d10: 6f 66 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f  of type TYPE..*/
7d20: 0a 23 64 65 66 69 6e 65 20 53 57 41 50 28 54 59  .#define SWAP(TY
7d30: 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d  PE,A,B) {TYPE t=
7d40: 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f  A; A=B; B=t;}../
7d50: 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63  *.** Commute a c
7d60: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
7d70: 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73  or.  Expressions
7d80: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
7d90: 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e  op Y".** are con
7da0: 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f  verted into "Y o
7db0: 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c  p X"..**.** If l
7dc0: 65 66 74 2f 72 69 67 68 74 20 70 72 65 63 65 64  eft/right preced
7dd0: 65 6e 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20  ence rules come 
7de0: 69 6e 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64  into play when d
7df0: 65 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a  etermining the.*
7e00: 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * collating sequ
7e10: 65 6e 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c 41  ence, then COLLA
7e20: 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65  TE operators are
7e30: 20 61 64 6a 75 73 74 65 64 20 74 6f 20 65 6e 73   adjusted to ens
7e40: 75 72 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ure.** that the 
7e50: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
7e60: 63 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e  ce does not chan
7e70: 67 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ge.  For example
7e80: 3a 0a 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65 20  :.** "Y collate 
7e90: 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62 65 63  NOCASE op X" bec
7ea0: 6f 6d 65 73 20 22 58 20 6f 70 20 59 22 20 62 65  omes "X op Y" be
7eb0: 63 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74  cause any collat
7ec0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a  ion sequence on.
7ed0: 2a 2a 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64  ** the left hand
7ee0: 20 73 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61   side of a compa
7ef0: 72 69 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  rison overrides 
7f00: 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  any collation se
7f10: 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63  quence .** attac
7f20: 68 65 64 20 74 6f 20 74 68 65 20 72 69 67 68 74  hed to the right
7f30: 2e 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72  . For the same r
7f40: 65 61 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c  eason the EP_Col
7f50: 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20  late flag.** is 
7f60: 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f  not commuted..*/
7f70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
7f80: 72 43 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a  rCommute(Parse *
7f90: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
7fa0: 78 70 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52  xpr){.  u16 expR
7fb0: 69 67 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70  ight = (pExpr->p
7fc0: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
7fd0: 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31  P_Collate);.  u1
7fe0: 36 20 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78  6 expLeft = (pEx
7ff0: 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73  pr->pLeft->flags
8000: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a   & EP_Collate);.
8010: 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65    assert( allowe
8020: 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26  dOp(pExpr->op) &
8030: 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  & pExpr->op!=TK_
8040: 49 4e 20 29 3b 0a 20 20 69 66 28 20 65 78 70 52  IN );.  if( expR
8050: 69 67 68 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b  ight==expLeft ){
8060: 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 58  .    /* Either X
8070: 20 61 6e 64 20 59 20 62 6f 74 68 20 68 61 76 65   and Y both have
8080: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
8090: 72 20 6f 72 20 6e 65 69 74 68 65 72 20 64 6f 20  r or neither do 
80a0: 2a 2f 0a 20 20 20 20 69 66 28 20 65 78 70 52 69  */.    if( expRi
80b0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ght ){.      /* 
80c0: 42 6f 74 68 20 58 20 61 6e 64 20 59 20 68 61 76  Both X and Y hav
80d0: 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  e COLLATE operat
80e0: 6f 72 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ors.  Make sure 
80f0: 58 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20  X is always.    
8100: 20 20 2a 2a 20 75 73 65 64 20 62 79 20 63 6c 65    ** used by cle
8110: 61 72 69 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c  aring the EP_Col
8120: 6c 61 74 65 20 66 6c 61 67 20 66 72 6f 6d 20 59  late flag from Y
8130: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72  . */.      pExpr
8140: 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ->pRight->flags 
8150: 26 3d 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a  &= ~EP_Collate;.
8160: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
8170: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
8180: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
8190: 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20  pLeft)!=0 ){.   
81a0: 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 58 20     /* Neither X 
81b0: 6e 6f 72 20 59 20 68 61 76 65 20 43 4f 4c 4c 41  nor Y have COLLA
81c0: 54 45 20 6f 70 65 72 61 74 6f 72 73 2c 20 62 75  TE operators, bu
81d0: 74 20 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65  t X has a non-de
81e0: 66 61 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63  fault.      ** c
81f0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
8200: 65 2e 20 20 53 6f 20 61 64 64 20 74 68 65 20 45  e.  So add the E
8210: 50 5f 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72  P_Collate marker
8220: 20 6f 6e 20 58 20 74 6f 20 63 61 75 73 65 0a 20   on X to cause. 
8230: 20 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65       ** it to be
8240: 20 73 65 61 72 63 68 65 64 20 66 69 72 73 74 2e   searched first.
8250: 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
8260: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d  >pLeft->flags |=
8270: 20 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20   EP_Collate;.   
8280: 20 7d 0a 20 20 7d 0a 20 20 53 57 41 50 28 45 78   }.  }.  SWAP(Ex
8290: 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68  pr*,pExpr->pRigh
82a0: 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  t,pExpr->pLeft);
82b0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
82c0: 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61  >=TK_GT ){.    a
82d0: 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b  ssert( TK_LT==TK
82e0: 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73  _GT+2 );.    ass
82f0: 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c  ert( TK_GE==TK_L
8300: 45 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  E+2 );.    asser
8310: 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29  t( TK_GT>TK_EQ )
8320: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
8330: 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  _GT<TK_LE );.   
8340: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
8350: 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78  op>=TK_GT && pEx
8360: 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b  pr->op<=TK_GE );
8370: 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
8380: 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f   ((pExpr->op-TK_
8390: 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20  GT)^2)+TK_GT;.  
83a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  }.}../*.** Trans
83b0: 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20  late from TK_xx 
83c0: 6f 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78  operator to WO_x
83d0: 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74  x bitmask..*/.st
83e0: 61 74 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f  atic u16 operato
83f0: 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20  rMask(int op){. 
8400: 20 75 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74   u16 c;.  assert
8410: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20  ( allowedOp(op) 
8420: 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
8430: 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f  IN ){.    c = WO
8440: 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _IN;.  }else if(
8450: 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
8460: 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e  {.    c = WO_ISN
8470: 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
8480: 20 20 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51    assert( (WO_EQ
8490: 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20  <<(op-TK_EQ)) < 
84a0: 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20  0x7fff );.    c 
84b0: 3d 20 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28  = (u16)(WO_EQ<<(
84c0: 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a  op-TK_EQ));.  }.
84d0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
84e0: 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f  _ISNULL || c==WO
84f0: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73  _ISNULL );.  ass
8500: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c  ert( op!=TK_IN |
8510: 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20  | c==WO_IN );.  
8520: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45  assert( op!=TK_E
8530: 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b  Q || c==WO_EQ );
8540: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
8550: 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54  K_LT || c==WO_LT
8560: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
8570: 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f  !=TK_LE || c==WO
8580: 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _LE );.  assert(
8590: 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d   op!=TK_GT || c=
85a0: 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65  =WO_GT );.  asse
85b0: 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c  rt( op!=TK_GE ||
85c0: 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72   c==WO_GE );.  r
85d0: 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn c;.}../*.*
85e0: 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65  * Advance to the
85f0: 20 6e 65 78 74 20 57 68 65 72 65 54 65 72 6d 20   next WhereTerm 
8600: 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 63 63  that matches acc
8610: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72  ording to the cr
8620: 69 74 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c  iteria.** establ
8630: 69 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 70  ished when the p
8640: 53 63 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20  Scan object was 
8650: 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77  initialized by w
8660: 68 65 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a  hereScanInit()..
8670: 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
8680: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  f there are no m
8690: 6f 72 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65  ore matching Whe
86a0: 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74  reTerms..*/.stat
86b0: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68  ic WhereTerm *wh
86c0: 65 72 65 53 63 61 6e 4e 65 78 74 28 57 68 65 72  ereScanNext(Wher
86d0: 65 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20  eScan *pScan){. 
86e0: 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
86f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
8700: 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f  sor on the LHS o
8710: 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20  f the term */.  
8720: 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  int iColumn;    
8730: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75       /* The colu
8740: 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66  mn on the LHS of
8750: 20 74 68 65 20 74 65 72 6d 2e 20 20 2d 31 20 66   the term.  -1 f
8760: 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72  or IPK */.  Expr
8770: 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
8780: 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f   /* An expressio
8790: 6e 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a  n being tested *
87a0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
87b0: 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72  *pWC;    /* Shor
87c0: 74 68 61 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d  thand for pScan-
87d0: 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65 72 65 54  >pWC */.  WhereT
87e0: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f  erm *pTerm;    /
87f0: 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67  * The term being
8800: 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74   tested */.  int
8810: 20 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20   k = pScan->k;  
8820: 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74    /* Where to st
8830: 61 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a  art scanning */.
8840: 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d  .  while( pScan-
8850: 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e  >iEquiv<=pScan->
8860: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43  nEquiv ){.    iC
8870: 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75  ur = pScan->aEqu
8880: 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  iv[pScan->iEquiv
8890: 2d 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e  -2];.    iColumn
88a0: 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76   = pScan->aEquiv
88b0: 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31  [pScan->iEquiv-1
88c0: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70  ];.    while( (p
88d0: 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29  WC = pScan->pWC)
88e0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  !=0 ){.      for
88f0: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b  (pTerm=pWC->a+k;
8900: 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b   k<pWC->nTerm; k
8910: 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
8920: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
8930: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
8940: 72 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  r && pTerm->u.le
8950: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
8960: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
8970: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
8980: 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 29  ator & WO_EQUIV)
8990: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  !=0.           &
89a0: 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c  & pScan->nEquiv<
89b0: 41 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e 2d  ArraySize(pScan-
89c0: 3e 61 45 71 75 69 76 29 0a 20 20 20 20 20 20 20  >aEquiv).       
89d0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
89e0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
89f0: 20 20 20 20 20 70 58 20 3d 20 73 71 6c 69 74 65       pX = sqlite
8a00: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
8a10: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  (pTerm->pExpr->p
8a20: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
8a30: 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e      assert( pX->
8a40: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
8a50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
8a60: 28 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e  (j=0; j<pScan->n
8a70: 45 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20  Equiv; j+=2){.  
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
8a90: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d  pScan->aEquiv[j]
8aa0: 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20  ==pX->iTable.   
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
8ac0: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31  Scan->aEquiv[j+1
8ad0: 5d 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29  ]==pX->iColumn )
8ae0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
8af0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8b00: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8b10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8b20: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 53 63 61       if( j==pSca
8b30: 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20  n->nEquiv ){.   
8b40: 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e             pScan
8b50: 2d 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58  ->aEquiv[j] = pX
8b60: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
8b70: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
8b80: 45 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d  Equiv[j+1] = pX-
8b90: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
8ba0: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e          pScan->n
8bb0: 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20  Equiv += 2;.    
8bc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8bd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8be0: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
8bf0: 72 61 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f  rator & pScan->o
8c00: 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20  pMask)!=0 ){.   
8c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69           /* Veri
8c20: 66 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  fy the affinity 
8c30: 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
8c40: 71 75 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a  quence match */.
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
8c60: 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65  pScan->zCollName
8c70: 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65   && (pTerm->eOpe
8c80: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
8c90: 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  L)==0 ){.       
8ca0: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
8cb0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  pColl;.         
8cc0: 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72       Parse *pPar
8cd0: 73 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  se = pWC->pWInfo
8ce0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
8cf0: 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 54 65          pX = pTe
8d00: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
8d10: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71           if( !sq
8d20: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
8d30: 74 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e  tyOk(pX, pScan->
8d40: 69 64 78 61 66 66 29 20 29 7b 0a 20 20 20 20 20  idxaff) ){.     
8d50: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
8d60: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
8d70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
8d80: 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c     assert(pX->pL
8d90: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eft);.          
8da0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
8db0: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
8dc0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 0a  CollSeq(pParse,.
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e00: 20 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d    pX->pLeft, pX-
8e10: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
8e20: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
8e30: 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70  l==0 ) pColl = p
8e40: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
8e50: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
8e60: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
8e70: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
8e80: 61 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  ame, pScan->zCol
8e90: 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  lName) ){.      
8ea0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
8eb0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
8ec0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
8ed0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
8ee0: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
8ef0: 74 6f 72 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a  tor & WO_EQ)!=0.
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
8f10: 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  (pX = pTerm->pEx
8f20: 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d  pr->pRight)->op=
8f30: 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20  =TK_COLUMN.     
8f40: 20 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69          && pX->i
8f50: 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45  Table==pScan->aE
8f60: 71 75 69 76 5b 30 5d 0a 20 20 20 20 20 20 20 20  quiv[0].        
8f70: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c       && pX->iCol
8f80: 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75  umn==pScan->aEqu
8f90: 69 76 5b 31 5d 0a 20 20 20 20 20 20 20 20 20 20  iv[1].          
8fa0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
8fb0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
8fc0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8fd0: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20         pScan->k 
8fe0: 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  = k+1;.         
8ff0: 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b     return pTerm;
9000: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
9010: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9020: 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20       pScan->pWC 
9030: 3d 20 70 53 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f  = pScan->pWC->pO
9040: 75 74 65 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20  uter;.      k = 
9050: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63  0;.    }.    pSc
9060: 61 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d  an->pWC = pScan-
9070: 3e 70 4f 72 69 67 57 43 3b 0a 20 20 20 20 6b 20  >pOrigWC;.    k 
9080: 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e  = 0;.    pScan->
9090: 69 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d  iEquiv += 2;.  }
90a0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
90b0: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
90c0: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
90d0: 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20  scanner object. 
90e0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
90f0: 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73  r to the.** firs
9100: 74 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72 6e  t match.  Return
9110: 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61   NULL if there a
9120: 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a  re no matches..*
9130: 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65 72  *.** The scanner
9140: 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 69   will be searchi
9150: 6e 67 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ng the WHERE cla
9160: 75 73 65 20 70 57 43 2e 20 20 49 74 20 77 69 6c  use pWC.  It wil
9170: 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65  l look.** for te
9180: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rms of the form 
9190: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20  "X <op> <expr>" 
91a0: 77 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75 6d  where X is colum
91b0: 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  n iColumn of tab
91c0: 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54 68 65  le.** iCur.  The
91d0: 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e   <op> must be on
91e0: 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f  e of the operato
91f0: 72 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20  rs described by 
9200: 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  opMask..**.** If
9210: 20 74 68 65 20 73 65 61 72 63 68 20 69 73 20 66   the search is f
9220: 6f 72 20 58 20 61 6e 64 20 74 68 65 20 57 48 45  or X and the WHE
9230: 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  RE clause contai
9240: 6e 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  ns terms of the.
9250: 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e  ** form X=Y then
9260: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
9270: 67 68 74 20 61 6c 73 6f 20 72 65 74 75 72 6e 20  ght also return 
9280: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  terms of the for
9290: 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78  m.** "Y <op> <ex
92a0: 70 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62 65  pr>".  The numbe
92b0: 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20 74  r of levels of t
92c0: 72 61 6e 73 69 74 69 76 69 74 79 20 69 73 20 6c  ransitivity is l
92d0: 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69  imited,.** but i
92e0: 73 20 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64  s enough to hand
92f0: 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79  le most commonly
9300: 20 6f 63 63 75 72 72 69 6e 67 20 53 51 4c 20 73   occurring SQL s
9310: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a  tatements..**.**
9320: 20 49 66 20 58 20 69 73 20 6e 6f 74 20 74 68 65   If X is not the
9330: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
9340: 20 4b 45 59 20 74 68 65 6e 20 58 20 6d 75 73 74   KEY then X must
9350: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
9360: 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64  ith.** index pId
9370: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  x..*/.static Whe
9380: 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61  reTerm *whereSca
9390: 6e 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53 63  nInit(.  WhereSc
93a0: 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20  an *pScan,      
93b0: 20 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63 61   /* The WhereSca
93c0: 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 69  n object being i
93d0: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
93e0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
93f0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57  ,       /* The W
9400: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
9410: 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69  e scanned */.  i
9420: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
9430: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
9440: 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a   to scan for */.
9450: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
9460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
9470: 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72 20  umn to scan for 
9480: 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c  */.  u32 opMask,
9490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
94a0: 4f 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20 73  Operator(s) to s
94b0: 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64  can for */.  Ind
94c0: 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
94d0: 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
94e0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
94f0: 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b  this index */.){
9500: 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20  .  int j;..  /* 
9510: 6d 65 6d 73 65 74 28 70 53 63 61 6e 2c 20 30 2c  memset(pScan, 0,
9520: 20 73 69 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29   sizeof(*pScan))
9530: 3b 20 2a 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f  ; */.  pScan->pO
9540: 72 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20 70  rigWC = pWC;.  p
9550: 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b  Scan->pWC = pWC;
9560: 0a 20 20 69 66 28 20 70 49 64 78 20 26 26 20 69  .  if( pIdx && i
9570: 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
9580: 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d   pScan->idxaff =
9590: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
95a0: 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66  Col[iColumn].aff
95b0: 69 6e 69 74 79 3b 0a 20 20 20 20 66 6f 72 28 6a  inity;.    for(j
95c0: 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  =0; pIdx->aiColu
95d0: 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20  mn[j]!=iColumn; 
95e0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
95f0: 4e 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e  NEVER(j>=pIdx->n
9600: 43 6f 6c 75 6d 6e 29 20 29 20 72 65 74 75 72 6e  Column) ) return
9610: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53   0;.    }.    pS
9620: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d  can->zCollName =
9630: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
9640: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
9650: 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30  Scan->idxaff = 0
9660: 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f  ;.    pScan->zCo
9670: 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  llName = 0;.  }.
9680: 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20    pScan->opMask 
9690: 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61  = opMask;.  pSca
96a0: 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61  n->k = 0;.  pSca
96b0: 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d 20 69  n->aEquiv[0] = i
96c0: 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45  Cur;.  pScan->aE
96d0: 71 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d  quiv[1] = iColum
96e0: 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75  n;.  pScan->nEqu
96f0: 69 76 20 3d 20 32 3b 0a 20 20 70 53 63 61 6e 2d  iv = 2;.  pScan-
9700: 3e 69 45 71 75 69 76 20 3d 20 32 3b 0a 20 20 72  >iEquiv = 2;.  r
9710: 65 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e 4e  eturn whereScanN
9720: 65 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f  ext(pScan);.}../
9730: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
9740: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
9750: 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
9760: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
9770: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a  X <op> <expr>".*
9780: 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20 72  * where X is a r
9790: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
97a0: 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65  iColumn of table
97b0: 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69   iCur and <op> i
97c0: 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20  s one of.** the 
97d0: 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63  WO_xx operator c
97e0: 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62  odes specified b
97f0: 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  y the op paramet
9800: 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  er..** Return a 
9810: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74  pointer to the t
9820: 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69  erm.  Return 0 i
9830: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
9840: 2a 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74 75  ** The term retu
9850: 72 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59 3d  rned might by Y=
9860: 3c 65 78 70 72 3e 20 69 66 20 74 68 65 72 65 20  <expr> if there 
9870: 69 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74  is another const
9880: 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20  raint in.** the 
9890: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
98a0: 74 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74  t specifies that
98b0: 20 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68 20   X=Y.  Any such 
98c0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c  constraints will
98d0: 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65   be.** identifie
98e0: 64 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55 49  d by the WO_EQUI
98f0: 56 20 62 69 74 20 69 6e 20 74 68 65 20 70 54 65  V bit in the pTe
9900: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66 69  rm->eOperator fi
9910: 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45 71  eld.  The.** aEq
9920: 75 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64  uiv[] array hold
9930: 73 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  s X and all its 
9940: 65 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69 74  equivalents, wit
9950: 68 20 65 61 63 68 20 53 51 4c 20 76 61 72 69 61  h each SQL varia
9960: 62 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75 70  ble.** taking up
9970: 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61 45   two slots in aE
9980: 71 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69 72  quiv[].  The fir
9990: 73 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20 74  st slot is for t
99a0: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
99b0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63 6f  .** and the seco
99c0: 6e 64 20 69 73 20 66 6f 72 20 74 68 65 20 63 6f  nd is for the co
99d0: 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68  lumn number.  Th
99e0: 65 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74 73  ere are 22 slots
99f0: 20 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a 20   in aEquiv[].** 
9a00: 73 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  so that means we
9a10: 20 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20   can look for X 
9a20: 70 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f 74  plus up to 10 ot
9a30: 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76  her equivalent v
9a40: 61 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65 20  alues..** Hence 
9a50: 61 20 73 65 61 72 63 68 20 66 6f 72 20 58 20 77  a search for X w
9a60: 69 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70 72  ill return <expr
9a70: 3e 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41 31  > if X=A1 and A1
9a80: 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a 2a  =A2 and A2=A3.**
9a90: 20 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d   and ... and A9=
9aa0: 41 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78 70  A10 and A10=<exp
9ab0: 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  r>..**.** If the
9ac0: 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20  re are multiple 
9ad0: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45  terms in the WHE
9ae0: 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
9af0: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
9b00: 78 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72  xpr>".** then tr
9b10: 79 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77 69  y for the one wi
9b20: 74 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69  th no dependenci
9b30: 65 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69  es on <expr> - i
9b40: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77 68  n other words wh
9b50: 65 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73  ere.** <expr> is
9b60: 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72   a constant expr
9b70: 65 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b  ession of some k
9b80: 69 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72  ind.  Only retur
9b90: 6e 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20  n entries of.** 
9ba0: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
9bb0: 20 59 22 20 77 68 65 72 65 20 59 20 69 73 20 61   Y" where Y is a
9bc0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68   column in anoth
9bd0: 65 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20 74  er table if no t
9be0: 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66  erms of.** the f
9bf0: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e  orm "X <op> <con
9c00: 73 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74 2e  st-expr>" exist.
9c10: 20 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20 77     If no terms w
9c20: 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 52  ith a constant R
9c30: 48 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72 79  HS.** exist, try
9c40: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65 72   to return a ter
9c50: 6d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  m that does not 
9c60: 75 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f  use WO_EQUIV..*/
9c70: 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72  .static WhereTer
9c80: 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57  m *findTerm(.  W
9c90: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
9ca0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
9cb0: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
9cc0: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74  earched */.  int
9cd0: 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
9ce0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
9cf0: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
9d00: 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
9d10: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
9d20: 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f  number of LHS */
9d30: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
9d40: 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20  ady,     /* RHS 
9d50: 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70  must not overlap
9d60: 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20   with this mask 
9d70: 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20  */.  u32 op,    
9d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
9d90: 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75  sk of WO_xx valu
9da0: 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70  es describing op
9db0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  erator */.  Inde
9dc0: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
9dd0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
9de0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
9df0: 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20  s index, if not 
9e00: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  NULL */.){.  Whe
9e10: 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20  reTerm *pResult 
9e20: 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  = 0;.  WhereTerm
9e30: 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e   *p;.  WhereScan
9e40: 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68   scan;..  p = wh
9e50: 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61  ereScanInit(&sca
9e60: 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43  n, pWC, iCur, iC
9e70: 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29  olumn, op, pIdx)
9e80: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
9e90: 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
9ea0: 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61  eqRight & notRea
9eb0: 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)==0 ){.      
9ec0: 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69 67  if( p->prereqRig
9ed0: 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70  ht==0 && (p->eOp
9ee0: 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30  erator&WO_EQ)!=0
9ef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
9f00: 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn p;.      }.  
9f10: 20 20 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d      if( pResult=
9f20: 3d 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70  =0 ) pResult = p
9f30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
9f40: 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73  whereScanNext(&s
9f50: 63 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  can);.  }.  retu
9f60: 72 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f  rn pResult;.}../
9f70: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
9f80: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nce */.static vo
9f90: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53  id exprAnalyze(S
9fa0: 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6c  rcList*, WhereCl
9fb0: 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a  ause*, int);../*
9fc0: 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61  .** Call exprAna
9fd0: 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  lyze on all term
9fe0: 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61  s in a WHERE cla
9ff0: 75 73 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  use.  .*/.static
a000: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
a010: 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20  eAll(.  SrcList 
a020: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
a030: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
a040: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
a050: 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 20  ause *pWC       
a060: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
a070: 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c  lause to be anal
a080: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  yzed */.){.  int
a090: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d   i;.  for(i=pWC-
a0a0: 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  >nTerm-1; i>=0; 
a0b0: 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e  i--){.    exprAn
a0c0: 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20  alyze(pTabList, 
a0d0: 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC, i);.  }.}..
a0e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a0f0: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
a100: 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ATION./*.** Chec
a110: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
a120: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
a130: 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c   is a LIKE or GL
a140: 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74  OB operator that
a150: 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d  .** can be optim
a160: 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75  ized using inequ
a170: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
a180: 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  s.  Return TRUE 
a190: 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61  if it is.** so a
a1a0: 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  nd false if not.
a1b0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20  .**.** In order 
a1c0: 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72  for the operator
a1d0: 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62   to be optimizib
a1e0: 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74  le, the RHS must
a1f0: 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20   be a string.** 
a200: 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65  literal that doe
a210: 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68  s not begin with
a220: 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a   a wildcard.  .*
a230: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c  /.static int isL
a240: 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72  ikeOrGlob(.  Par
a250: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
a260: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
a270: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
a280: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
a290: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20  *pExpr,      /* 
a2a0: 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73  Test this expres
a2b0: 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  sion */.  Expr *
a2c0: 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50  *ppPrefix,  /* P
a2d0: 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52  ointer to TK_STR
a2e0: 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77  ING expression w
a2f0: 69 74 68 20 70 61 74 74 65 72 6e 20 70 72 65 66  ith pattern pref
a300: 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73  ix */.  int *pis
a310: 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75  Complete, /* Tru
a320: 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69  e if the only wi
a330: 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74  ldcard is % in t
a340: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
a350: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43  r */.  int *pnoC
a360: 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ase      /* True
a370: 20 69 66 20 75 70 70 65 72 63 61 73 65 20 69 73   if uppercase is
a380: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c   equivalent to l
a390: 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20  owercase */.){. 
a3a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
a3b0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53   0;         /* S
a3c0: 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20  tring on RHS of 
a3d0: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
a3e0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
a3f0: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a   *pLeft;      /*
a400: 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20   Right and left 
a410: 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65  size of LIKE ope
a420: 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c  rator */.  ExprL
a430: 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20  ist *pList;     
a440: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
a450: 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65   operands to the
a460: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a   LIKE operator *
a470: 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20  /.  int c;      
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a490: 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20  * One character 
a4a0: 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  in z[] */.  int 
a4b0: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
a4c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a4d0: 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64   of non-wildcard
a4e0: 20 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65   prefix characte
a4f0: 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b  rs */.  char wc[
a500: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
a510: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63     /* Wildcard c
a520: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73  haracters */.  s
a530: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
a540: 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
a550: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
a560: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
a570: 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20  lue *pVal = 0;. 
a580: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
a590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
a5a0: 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20  pcode of pRight 
a5b0: 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74  */..  if( !sqlit
a5c0: 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e  e3IsLikeFunction
a5d0: 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43  (db, pExpr, pnoC
a5e0: 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20  ase, wc) ){.    
a5f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69  return 0;.  }.#i
a600: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44  fdef SQLITE_EBCD
a610: 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73  IC.  if( *pnoCas
a620: 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  e ) return 0;.#e
a630: 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70  ndif.  pList = p
a640: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
a650: 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e   pLeft = pList->
a660: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[1].pExpr;.  if
a670: 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f  ( pLeft->op!=TK_
a680: 43 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71  COLUMN .   || sq
a690: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
a6a0: 79 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45  y(pLeft)!=SQLITE
a6b0: 5f 41 46 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c  _AFF_TEXT .   ||
a6c0: 20 49 73 56 69 72 74 75 61 6c 28 70 4c 65 66 74   IsVirtual(pLeft
a6d0: 2d 3e 70 54 61 62 29 0a 20 20 29 7b 0a 20 20 20  ->pTab).  ){.   
a6e0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35   /* IMP: R-02065
a6f0: 2d 34 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d  -49465 The left-
a700: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
a710: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70   LIKE or GLOB op
a720: 65 72 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20  erator must.    
a730: 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ** be the name o
a740: 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c  f an indexed col
a750: 75 6d 6e 20 77 69 74 68 20 54 45 58 54 20 61 66  umn with TEXT af
a760: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72  finity. */.    r
a770: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61  eturn 0;.  }.  a
a780: 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43  ssert( pLeft->iC
a790: 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f  olumn!=(-1) ); /
a7a0: 2a 20 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65  * Because IPK ne
a7b0: 76 65 72 20 68 61 73 20 41 46 46 5f 54 45 58 54  ver has AFF_TEXT
a7c0: 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20   */..  pRight = 
a7d0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
a7e0: 72 3b 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74  r;.  op = pRight
a7f0: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
a800: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20  TK_REGISTER ){. 
a810: 20 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e     op = pRight->
a820: 6f 70 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  op2;.  }.  if( o
a830: 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29  p==TK_VARIABLE )
a840: 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52 65 70  {.    Vdbe *pRep
a850: 72 65 70 61 72 65 20 3d 20 70 50 61 72 73 65 2d  repare = pParse-
a860: 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20 20 20  >pReprepare;.   
a870: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69 67   int iCol = pRig
a880: 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ht->iColumn;.   
a890: 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
a8a0: 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65  dbeGetBoundValue
a8b0: 28 70 52 65 70 72 65 70 61 72 65 2c 20 69 43 6f  (pReprepare, iCo
a8c0: 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  l, SQLITE_AFF_NO
a8d0: 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61  NE);.    if( pVa
a8e0: 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c  l && sqlite3_val
a8f0: 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53  ue_type(pVal)==S
a900: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
a910: 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29      z = (char *)
a920: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
a930: 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a  xt(pVal);.    }.
a940: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
a950: 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65  etVarmask(pParse
a960: 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b 0a  ->pVdbe, iCol);.
a970: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67      assert( pRig
a980: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  ht->op==TK_VARIA
a990: 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f  BLE || pRight->o
a9a0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
a9b0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
a9c0: 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20  ==TK_STRING ){. 
a9d0: 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e 75     z = pRight->u
a9e0: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69  .zToken;.  }.  i
a9f0: 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74 20  f( z ){.    cnt 
aa00: 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
aa10: 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26  (c=z[cnt])!=0 &&
aa20: 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d   c!=wc[0] && c!=
aa30: 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32  wc[1] && c!=wc[2
aa40: 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  ] ){.      cnt++
aa50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
aa60: 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21 3d 28  cnt!=0 && 255!=(
aa70: 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20  u8)z[cnt-1] ){. 
aa80: 20 20 20 20 20 45 78 70 72 20 2a 70 50 72 65 66       Expr *pPref
aa90: 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73 43 6f  ix;.      *pisCo
aaa0: 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b 30  mplete = c==wc[0
aab0: 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30  ] && z[cnt+1]==0
aac0: 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69 78 20  ;.      pPrefix 
aad0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
aae0: 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29 3b  , TK_STRING, z);
aaf0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 66  .      if( pPref
ab00: 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e 75 2e  ix ) pPrefix->u.
ab10: 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b  zToken[cnt] = 0;
ab20: 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66 69 78  .      *ppPrefix
ab30: 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20 20 20   = pPrefix;.    
ab40: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52    if( op==TK_VAR
ab50: 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 20  IABLE ){.       
ab60: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
ab70: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20 20  e->pVdbe;.      
ab80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
ab90: 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69 67 68  Varmask(v, pRigh
aba0: 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t->iColumn);.   
abb0: 20 20 20 20 20 69 66 28 20 2a 70 69 73 43 6f 6d       if( *pisCom
abc0: 70 6c 65 74 65 20 26 26 20 70 52 69 67 68 74 2d  plete && pRight-
abd0: 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a  >u.zToken[1] ){.
abe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
abf0: 74 68 65 20 72 68 73 20 6f 66 20 74 68 65 20 4c  the rhs of the L
ac00: 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69  IKE expression i
ac10: 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20 61 6e  s a variable, an
ac20: 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  d the current.  
ac30: 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
ac40: 20 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c 65   of the variable
ac50: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73 20   means there is 
ac60: 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f 6b  no need to invok
ac70: 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20 20 20  e the LIKE.     
ac80: 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
ac90: 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61 72  , then no OP_Var
aca0: 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 61 64  iable will be ad
acb0: 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ded to the progr
acc0: 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  am..          **
acd0: 20 54 68 69 73 20 63 61 75 73 65 73 20 70 72 6f   This causes pro
ace0: 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20 73 71  blems for the sq
acf0: 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
ad00: 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20 20  eter_name().    
ad10: 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20 54 6f        ** API. To
ad20: 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68 65 6d   workaround them
ad30: 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20 4f 50  , add a dummy OP
ad40: 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65 2e 0a  _Variable here..
ad50: 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20            */ .  
ad60: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
ad70: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
ad80: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
ad90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ada0: 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
adb0: 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31 29 3b  se, pRight, r1);
adc0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
add0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
ade0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
adf0: 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 30  rentAddr(v)-1, 0
ae00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
ae10: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
ae20: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
ae30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ae40: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
ae50: 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a     z = 0;.    }.
ae60: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61    }..  sqlite3Va
ae70: 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20  lueFree(pVal);. 
ae80: 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29 3b 0a   return (z!=0);.
ae90: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
aea0: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
aeb0: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23  IMIZATION */...#
aec0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
aed0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
aee0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
aef0: 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ee if the given 
af00: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
af10: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
af20: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d          column M
af30: 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20  ATCH expr.**.** 
af40: 49 66 20 69 74 20 69 73 20 74 68 65 6e 20 72 65  If it is then re
af50: 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 6e  turn TRUE.  If n
af60: 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45  ot, return FALSE
af70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
af80: 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28  isMatchOfColumn(
af90: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
afa0: 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73      /* Test this
afb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29   expression */.)
afc0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  {.  ExprList *pL
afd0: 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 78 70  ist;..  if( pExp
afe0: 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49  r->op!=TK_FUNCTI
aff0: 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ON ){.    return
b000: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
b010: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78  lite3StrICmp(pEx
b020: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61  pr->u.zToken,"ma
b030: 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20 20 20  tch")!=0 ){.    
b040: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
b050: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
b060: 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c  .pList;.  if( pL
b070: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b  ist->nExpr!=2 ){
b080: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
b090: 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e   }.  if( pList->
b0a0: 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 21  a[1].pExpr->op !
b0b0: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  = TK_COLUMN ){. 
b0c0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
b0d0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
b0e0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
b0f0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
b100: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  E */../*.** If t
b110: 68 65 20 70 42 61 73 65 20 65 78 70 72 65 73 73  he pBase express
b120: 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64 20 69  ion originated i
b130: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
b140: 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61  G clause of.** a
b150: 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e   join, then tran
b160: 73 66 65 72 20 74 68 65 20 61 70 70 72 6f 70 72  sfer the appropr
b170: 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76  iate markings ov
b180: 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a  er to derived..*
b190: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72  /.static void tr
b1a0: 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e  ansferJoinMarkin
b1b0: 67 73 28 45 78 70 72 20 2a 70 44 65 72 69 76 65  gs(Expr *pDerive
b1c0: 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65 29 7b  d, Expr *pBase){
b1d0: 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c 61  .  pDerived->fla
b1e0: 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61  gs |= pBase->fla
b1f0: 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  gs & EP_FromJoin
b200: 3b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 69 52  ;.  pDerived->iR
b210: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
b220: 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f 69  pBase->iRightJoi
b230: 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21  nTable;.}..#if !
b240: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b250: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
b260: 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64  ION) && !defined
b270: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
b280: 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61  QUERY)./*.** Ana
b290: 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74  lyze a term that
b2a0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f   consists of two
b2b0: 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e   or more OR-conn
b2c0: 65 63 74 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d  ected.** subterm
b2d0: 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a  s.  So in:.**.**
b2e0: 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20 20       ... WHERE  
b2f0: 28 61 3d 35 29 20 41 4e 44 20 28 62 3d 37 20 4f  (a=5) AND (b=7 O
b300: 52 20 63 3d 39 20 4f 52 20 64 3d 31 33 29 20 41  R c=9 OR d=13) A
b310: 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20  ND (d=13).**    
b320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b330: 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e        ^^^^^^^^^^
b340: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a  ^^^^^^^^^^.**.**
b350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   This routine an
b360: 61 6c 79 7a 65 73 20 74 65 72 6d 73 20 73 75 63  alyzes terms suc
b370: 68 20 61 73 20 74 68 65 20 6d 69 64 64 6c 65 20  h as the middle 
b380: 74 65 72 6d 20 69 6e 20 74 68 65 20 61 62 6f 76  term in the abov
b390: 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20  e example..** A 
b3a0: 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65  WhereOrTerm obje
b3b0: 63 74 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61  ct is computed a
b3c0: 6e 64 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  nd attached to t
b3d0: 68 65 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a  he term under.**
b3e0: 20 61 6e 61 6c 79 73 69 73 2c 20 72 65 67 61 72   analysis, regar
b3f0: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dless of the out
b400: 63 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e 61 6c  come of the anal
b410: 79 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a  ysis.  Hence:.**
b420: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
b430: 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d 20 20  m.wtFlags   |=  
b440: 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20  TERM_ORINFO.**  
b450: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70     WhereTerm.u.p
b460: 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e  OrInfo  =  a dyn
b470: 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
b480: 65 64 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f  ed WhereOrTerm o
b490: 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20  bject.**.** The 
b4a0: 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79  term being analy
b4b0: 7a 65 64 20 6d 75 73 74 20 68 61 76 65 20 74 77  zed must have tw
b4c0: 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d  o or more of OR-
b4d0: 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65 72  connected subter
b4e0: 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20  ms..** A single 
b4f0: 73 75 62 74 65 72 6d 20 6d 69 67 68 74 20 62 65  subterm might be
b500: 20 61 20 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f   a set of AND-co
b510: 6e 6e 65 63 74 65 64 20 73 75 62 2d 73 75 62 74  nnected sub-subt
b520: 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65  erms..** Example
b530: 73 20 6f 66 20 74 65 72 6d 73 20 75 6e 64 65 72  s of terms under
b540: 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a   analysis:.**.**
b550: 20 20 20 20 20 28 41 29 20 20 20 20 20 74 31 2e       (A)     t1.
b560: 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74  x=t2.y OR t1.x=t
b570: 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f  2.z OR t1.y=15 O
b580: 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a  R t1.z=t3.a+5.**
b590: 20 20 20 20 20 28 42 29 20 20 20 20 20 78 3d 65       (B)     x=e
b5a0: 78 70 72 31 20 4f 52 20 65 78 70 72 32 3d 78 20  xpr1 OR expr2=x 
b5b0: 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20  OR x=expr3.**   
b5c0: 20 20 28 43 29 20 20 20 20 20 74 31 2e 78 3d 74    (C)     t1.x=t
b5d0: 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e  2.y OR (t1.x=t2.
b5e0: 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a  z AND t1.y=15).*
b5f0: 2a 20 20 20 20 20 28 44 29 20 20 20 20 20 78 3d  *     (D)     x=
b600: 65 78 70 72 31 20 4f 52 20 28 79 3e 31 31 20 41  expr1 OR (y>11 A
b610: 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49  ND y<22 AND z LI
b620: 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a  KE '*hello*').**
b630: 20 20 20 20 20 28 45 29 20 20 20 20 20 28 70 2e       (E)     (p.
b640: 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e  a=1 AND q.b=2 AN
b650: 44 20 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78  D r.c=3) OR (p.x
b660: 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44  =4 AND q.y=5 AND
b670: 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41   r.z=6).**.** CA
b680: 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61  SE 1:.**.** If a
b690: 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20  ll subterms are 
b6a0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d  of the form T.C=
b6b0: 65 78 70 72 20 66 6f 72 20 73 6f 6d 65 20 73 69  expr for some si
b6c0: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43  ngle column of C
b6d0: 20 61 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c 65   and.** a single
b6e0: 20 74 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f   table T (as sho
b6f0: 77 6e 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20  wn in example B 
b700: 61 62 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61  above) then crea
b710: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
b720: 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73  .** term that is
b730: 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49   an equivalent I
b740: 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49  N expression.  I
b750: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
b760: 66 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65  f the term.** be
b770: 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a  ing analyzed is:
b780: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20  .**.**      x = 
b790: 65 78 70 72 31 20 20 4f 52 20 20 65 78 70 72 32  expr1  OR  expr2
b7a0: 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78   = x  OR  x = ex
b7b0: 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63  pr3.**.** then c
b7c0: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
b7d0: 75 61 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68  ual term like th
b7e0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  is:.**.**      x
b7f0: 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32   IN (expr1,expr2
b800: 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41  ,expr3).**.** CA
b810: 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61  SE 2:.**.** If a
b820: 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20  ll subterms are 
b830: 69 6e 64 65 78 61 62 6c 65 20 62 79 20 61 20 73  indexable by a s
b840: 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74  ingle table T, t
b850: 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20  hen set.**.**   
b860: 20 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65    WhereTerm.eOpe
b870: 72 61 74 6f 72 20 20 20 20 20 20 20 20 20 20 20  rator           
b880: 20 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20     =  WO_OR.**  
b890: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70     WhereTerm.u.p
b8a0: 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
b8b0: 65 20 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f  e  |=  the curso
b8c0: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62  r number for tab
b8d0: 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62  le T.**.** A sub
b8e0: 74 65 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62  term is "indexab
b8f0: 6c 65 22 20 69 66 20 69 74 20 69 73 20 6f 66 20  le" if it is of 
b900: 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43  the form.** "T.C
b910: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68   <op> <expr>" wh
b920: 65 72 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c  ere C is any col
b930: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61  umn of table T a
b940: 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f  nd .** <op> is o
b950: 6e 65 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20  ne of "=", "<", 
b960: 22 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c  "<=", ">", ">=",
b970: 20 22 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22   "IS NULL", or "
b980: 49 4e 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72  IN"..** A subter
b990: 6d 20 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61  m is also indexa
b9a0: 62 6c 65 20 69 66 20 69 74 20 69 73 20 61 6e 20  ble if it is an 
b9b0: 41 4e 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  AND of two or mo
b9c0: 72 65 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d  re.** subsubterm
b9d0: 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  s at least one o
b9e0: 66 20 77 68 69 63 68 20 69 73 20 69 6e 64 65 78  f which is index
b9f0: 61 62 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65  able.  Indexable
ba00: 20 41 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d   AND .** subterm
ba10: 73 20 68 61 76 65 20 74 68 65 69 72 20 65 4f 70  s have their eOp
ba20: 65 72 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f  erator set to WO
ba30: 5f 41 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61  _AND and they ha
ba40: 76 65 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f  ve.** u.pAndInfo
ba50: 20 73 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69   set to a dynami
ba60: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
ba70: 57 68 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a  WhereAndTerm obj
ba80: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20  ect..**.** From 
ba90: 61 6e 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66  another point of
baa0: 20 76 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c   view, "indexabl
bab0: 65 22 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  e" means that th
bac0: 65 20 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a  e subterm could.
bad0: 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62  ** potentially b
bae0: 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69  e used with an i
baf0: 6e 64 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f  ndex if an appro
bb00: 70 72 69 61 74 65 20 69 6e 64 65 78 20 65 78 69  priate index exi
bb10: 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61  sts..** This ana
bb20: 6c 79 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63  lysis does not c
bb30: 6f 6e 73 69 64 65 72 20 77 68 65 74 68 65 72 20  onsider whether 
bb40: 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78  or not the index
bb50: 20 65 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a   exists; that.**
bb60: 20 69 73 20 64 65 63 69 64 65 64 20 65 6c 73 65   is decided else
bb70: 77 68 65 72 65 2e 20 20 54 68 69 73 20 61 6e 61  where.  This ana
bb80: 6c 79 73 69 73 20 6f 6e 6c 79 20 6c 6f 6f 6b 73  lysis only looks
bb90: 20 61 74 20 77 68 65 74 68 65 72 20 73 75 62 74   at whether subt
bba0: 65 72 6d 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69  erms.** appropri
bbb0: 61 74 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  ate for indexing
bbc0: 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c   exist..**.** Al
bbd0: 6c 20 65 78 61 6d 70 6c 65 73 20 41 20 74 68 72  l examples A thr
bbe0: 6f 75 67 68 20 45 20 61 62 6f 76 65 20 73 61 74  ough E above sat
bbf0: 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 42 75  isfy case 2.  Bu
bc00: 74 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61  t if a term.** a
bc10: 6c 73 6f 20 73 74 61 74 69 73 66 69 65 73 20 63  lso statisfies c
bc20: 61 73 65 20 31 20 28 73 75 63 68 20 61 73 20 42  ase 1 (such as B
bc30: 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
bc40: 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c  he optimizer wil
bc50: 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66  l.** always pref
bc60: 65 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e  er case 1, so in
bc70: 20 74 68 61 74 20 63 61 73 65 20 77 65 20 70 72   that case we pr
bc80: 65 74 65 6e 64 20 74 68 61 74 20 63 61 73 65 20  etend that case 
bc90: 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69  2 is not.** sati
bca0: 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  sfied..**.** It 
bcb0: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
bcc0: 65 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20  e that multiple 
bcd0: 74 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78  tables are index
bce0: 61 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70  able.  For examp
bcf0: 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65  le,.** (E) above
bd00: 20 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e   is indexable on
bd10: 20 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e   tables P, Q, an
bd20: 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  d R..**.** Terms
bd30: 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61   that satisfy ca
bd40: 73 65 20 32 20 61 72 65 20 63 61 6e 64 69 64 61  se 2 are candida
bd50: 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62  tes for lookup b
bd60: 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72  y using.** separ
bd70: 61 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66  ate indices to f
bd80: 69 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65  ind rowids for e
bd90: 61 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20  ach subterm and 
bda0: 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65  composing.** the
bdb0: 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f   union of all ro
bdc0: 77 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77  wids using a Row
bdd0: 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69  Set object.  Thi
bde0: 73 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20  s is similar.** 
bdf0: 74 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63  to "bitmap indic
be00: 65 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74  es" in other dat
be10: 61 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a  abase engines..*
be20: 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a  *.** OTHERWISE:.
be30: 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72  **.** If neither
be40: 20 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73 65   case 1 nor case
be50: 20 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c   2 apply, then l
be60: 65 61 76 65 20 74 68 65 20 65 4f 70 65 72 61 74  eave the eOperat
be70: 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72  or set to.** zer
be80: 6f 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69 73  o.  This term is
be90: 20 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20   not useful for 
bea0: 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69  search..*/.stati
beb0: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
bec0: 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c  zeOrTerm(.  SrcL
bed0: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
bee0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
bef0: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  M clause */.  Wh
bf00: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
bf10: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63          /* the c
bf20: 6f 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c  omplete WHERE cl
bf30: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ause */.  int id
bf40: 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  xTerm           
bf50: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
bf60: 74 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62  the OR-term to b
bf70: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
bf80: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
bf90: 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
bfa0: 66 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 48  fo;        /* WH
bfb0: 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
bfc0: 73 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ssing context */
bfd0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
bfe0: 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
bff0: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e;         /* Pa
c000: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
c010: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
c020: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
c030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
c040: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
c050: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
c060: 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  *pTerm = &pWC->a
c070: 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a  [idxTerm];    /*
c080: 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   The term to be 
c090: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78  analyzed */.  Ex
c0a0: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
c0b0: 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20  m->pExpr;       
c0c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
c0d0: 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74  ression of the t
c0e0: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  erm */.  int i; 
c0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c110: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
c120: 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  s */.  WhereClau
c130: 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20  se *pOrWc;      
c140: 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70   /* Breakup of p
c150: 54 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72  Term into subter
c160: 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ms */.  WhereTer
c170: 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20  m *pOrTerm;     
c180: 20 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20    /* A Sub-term 
c190: 77 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63  within the pOrWc
c1a0: 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66   */.  WhereOrInf
c1b0: 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20  o *pOrInfo;     
c1c0: 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e  /* Additional in
c1d0: 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69  formation associ
c1e0: 61 74 65 64 20 77 69 74 68 20 70 54 65 72 6d 20  ated with pTerm 
c1f0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e  */.  Bitmask chn
c200: 67 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f  gToIN;         /
c210: 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69  * Tables that mi
c220: 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65  ght satisfy case
c230: 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20   1 */.  Bitmask 
c240: 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20  indexable;      
c250: 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74    /* Tables that
c260: 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20   are indexable, 
c270: 73 61 74 69 73 66 79 69 6e 67 20 63 61 73 65 20  satisfying case 
c280: 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  2 */..  /*.  ** 
c290: 42 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61  Break the OR cla
c2a0: 75 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70  use into its sep
c2b0: 61 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20  arate subterms. 
c2c0: 20 54 68 65 20 73 75 62 74 65 72 6d 73 20 61 72   The subterms ar
c2d0: 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e  e.  ** stored in
c2e0: 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73   a WhereClause s
c2f0: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
c300: 69 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20 57  ing within the W
c310: 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20  hereOrInfo.  ** 
c320: 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 61  object that is a
c330: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f  ttached to the o
c340: 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73  riginal OR claus
c350: 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61  e term..  */.  a
c360: 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77  ssert( (pTerm->w
c370: 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44  tFlags & (TERM_D
c380: 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e  YNAMIC|TERM_ORIN
c390: 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29  FO|TERM_ANDINFO)
c3a0: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
c3b0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
c3c0: 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75  OR );.  pTerm->u
c3d0: 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e  .pOrInfo = pOrIn
c3e0: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
c3f0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
c400: 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a  eof(*pOrInfo));.
c410: 20 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30    if( pOrInfo==0
c420: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65   ) return;.  pTe
c430: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
c440: 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f  ERM_ORINFO;.  pO
c450: 72 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e  rWc = &pOrInfo->
c460: 77 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  wc;.  whereClaus
c470: 65 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57 49  eInit(pOrWc, pWI
c480: 6e 66 6f 29 3b 0a 20 20 77 68 65 72 65 53 70 6c  nfo);.  whereSpl
c490: 69 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c  it(pOrWc, pExpr,
c4a0: 20 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41   TK_OR);.  exprA
c4b0: 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20  nalyzeAll(pSrc, 
c4c0: 70 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64 62  pOrWc);.  if( db
c4d0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c4e0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
c4f0: 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e  t( pOrWc->nTerm>
c500: 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  =2 );..  /*.  **
c510: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65 74   Compute the set
c520: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
c530: 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61  might satisfy ca
c540: 73 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f  ses 1 or 2..  */
c550: 0a 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e  .  indexable = ~
c560: 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68  (Bitmask)0;.  ch
c570: 6e 67 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d 61  ngToIN = ~(Bitma
c580: 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70 4f  sk)0;.  for(i=pO
c590: 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f  rWc->nTerm-1, pO
c5a0: 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20  rTerm=pOrWc->a; 
c5b0: 69 3e 3d 30 20 26 26 20 69 6e 64 65 78 61 62 6c  i>=0 && indexabl
c5c0: 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  e; i--, pOrTerm+
c5d0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4f 72  +){.    if( (pOr
c5e0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
c5f0: 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20  & WO_SINGLE)==0 
c600: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 41 6e  ){.      WhereAn
c610: 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b  dInfo *pAndInfo;
c620: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
c630: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
c640: 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f   & (TERM_ANDINFO
c650: 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d  |TERM_ORINFO))==
c660: 30 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54  0 );.      chngT
c670: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  oIN = 0;.      p
c680: 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  AndInfo = sqlite
c690: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
c6a0: 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66   sizeof(*pAndInf
c6b0: 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  o));.      if( p
c6c0: 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  AndInfo ){.     
c6d0: 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
c6e0: 70 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20  pAndWC;.        
c6f0: 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54  WhereTerm *pAndT
c700: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  erm;.        int
c710: 20 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d   j;.        Bitm
c720: 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20  ask b = 0;.     
c730: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41     pOrTerm->u.pA
c740: 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66  ndInfo = pAndInf
c750: 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  o;.        pOrTe
c760: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
c770: 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20  ERM_ANDINFO;.   
c780: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f       pOrTerm->eO
c790: 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44  perator = WO_AND
c7a0: 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 43  ;.        pAndWC
c7b0: 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63   = &pAndInfo->wc
c7c0: 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43  ;.        whereC
c7d0: 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43  lauseInit(pAndWC
c7e0: 2c 20 70 57 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a  , pWC->pWInfo);.
c7f0: 20 20 20 20 20 20 20 20 77 68 65 72 65 53 70 6c          whereSpl
c800: 69 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65  it(pAndWC, pOrTe
c810: 72 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e  rm->pExpr, TK_AN
c820: 44 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72  D);.        expr
c830: 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c  AnalyzeAll(pSrc,
c840: 20 70 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20   pAndWC);.      
c850: 20 20 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72    pAndWC->pOuter
c860: 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20   = pWC;.        
c870: 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61  testcase( db->ma
c880: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
c890: 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d        if( !db->m
c8a0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
c8b0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
c8c0: 2c 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57  , pAndTerm=pAndW
c8d0: 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e  C->a; j<pAndWC->
c8e0: 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64  nTerm; j++, pAnd
c8f0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
c900: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 41 6e       assert( pAn
c910: 64 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a  dTerm->pExpr );.
c920: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
c930: 61 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65  allowedOp(pAndTe
c940: 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29  rm->pExpr->op) )
c950: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
c960: 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57  b |= getMask(&pW
c970: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
c980: 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75  pAndTerm->leftCu
c990: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20  rsor);.         
c9a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
c9b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c9c0: 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20     indexable &= 
c9d0: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
c9e0: 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d  else if( pOrTerm
c9f0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
ca00: 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20 20  _COPIED ){.     
ca10: 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20 74 65   /* Skip this te
ca20: 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20  rm for now.  We 
ca30: 72 65 76 69 73 69 74 20 69 74 20 77 68 65 6e 20  revisit it when 
ca40: 77 65 20 70 72 6f 63 65 73 73 20 74 68 65 0a 20  we process the. 
ca50: 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f       ** correspo
ca60: 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52 54 55  nding TERM_VIRTU
ca70: 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d  AL term */.    }
ca80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d  else{.      Bitm
ca90: 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62 20 3d  ask b;.      b =
caa0: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
cab0: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54  ->sMaskSet, pOrT
cac0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
cad0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
cae0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
caf0: 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20  ERM_VIRTUAL ){. 
cb00: 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d         WhereTerm
cb10: 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f 72 57   *pOther = &pOrW
cb20: 63 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50  c->a[pOrTerm->iP
cb30: 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20  arent];.        
cb40: 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57  b |= getMask(&pW
cb50: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
cb60: 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73  pOther->leftCurs
cb70: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
cb80: 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20     indexable &= 
cb90: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f  b;.      if( (pO
cba0: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
cbb0: 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a   & WO_EQ)==0 ){.
cbc0: 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e          chngToIN
cbd0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
cbe0: 65 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54  e{.        chngT
cbf0: 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20  oIN &= b;.      
cc00: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
cc10: 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68  *.  ** Record th
cc20: 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  e set of tables 
cc30: 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73  that satisfy cas
cc40: 65 20 32 2e 20 20 54 68 65 20 73 65 74 20 6d 69  e 2.  The set mi
cc50: 67 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74  ght be.  ** empt
cc60: 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66  y..  */.  pOrInf
cc70: 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69  o->indexable = i
cc80: 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65 72  ndexable;.  pTer
cc90: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 69  m->eOperator = i
cca0: 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20  ndexable==0 ? 0 
ccb0: 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20  : WO_OR;..  /*. 
ccc0: 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c   ** chngToIN hol
ccd0: 64 73 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c  ds a set of tabl
cce0: 65 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20  es that *might* 
ccf0: 73 61 74 69 73 66 79 20 63 61 73 65 20 31 2e 20  satisfy case 1. 
cd00: 20 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76   But.  ** we hav
cd10: 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64  e to do some add
cd20: 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67  itional checking
cd30: 20 74 6f 20 73 65 65 20 69 66 20 63 61 73 65 20   to see if case 
cd40: 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73  1 really.  ** is
cd50: 20 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a   satisfied..  **
cd60: 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77  .  ** chngToIN w
cd70: 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72 20  ill hold either 
cd80: 30 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73 2e  0, 1, or 2 bits.
cd90: 20 20 54 68 65 20 30 2d 62 69 74 20 63 61 73 65    The 0-bit case
cda0: 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74   means.  ** that
cdb0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73   there is no pos
cdc0: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61 6e  sibility of tran
cdd0: 73 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52 20  sforming the OR 
cde0: 63 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20  clause into an. 
cdf0: 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   ** IN operator 
ce00: 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d  because one or m
ce10: 6f 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ore terms in the
ce20: 20 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74 61   OR clause conta
ce30: 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e  in.  ** somethin
ce40: 67 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d 20  g other than == 
ce50: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  on a column in t
ce60: 68 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e  he single table.
ce70: 20 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a    The 1-bit.  **
ce80: 20 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61 74   case means that
ce90: 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74   every term of t
cea0: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73 20  he OR clause is 
ceb0: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a  of the form.  **
cec0: 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65   "table.column=e
ced0: 78 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73 69  xpr" for some si
cee0: 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ngle table.  The
cef0: 20 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69 73   one bit that is
cf00: 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63   set.  ** will c
cf10: 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65  orrespond to the
cf20: 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20   common table.  
cf30: 57 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  We still need to
cf40: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20   check to make. 
cf50: 20 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61 6d   ** sure the sam
cf60: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64  e column is used
cf70: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20   on all terms.  
cf80: 54 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 69  The 2-bit case i
cf90: 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  s when.  ** the 
cfa0: 61 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f 66  all terms are of
cfb0: 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65   the form "table
cfc0: 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e  1.column=table2.
cfd0: 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a  column".  It.  *
cfe0: 2a 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69  * might be possi
cff0: 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49  ble to form an I
d000: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
d010: 65 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63 6f  either table1.co
d020: 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62  lumn.  ** or tab
d030: 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68  le2.column as th
d040: 65 20 4c 48 53 20 69 66 20 65 69 74 68 65 72 20  e LHS if either 
d050: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65  is common to eve
d060: 72 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20  ry term of.  ** 
d070: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20  the OR clause.. 
d080: 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
d090: 61 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  at terms of the 
d0a0: 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75  form "table.colu
d0b0: 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e  mn1=table.column
d0c0: 32 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d  2" (the.  ** sam
d0d0: 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20  e table on both 
d0e0: 73 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d 29  sizes of the ==)
d0f0: 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d   cannot be optim
d100: 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ized..  */.  if(
d110: 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20   chngToIN ){.   
d120: 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49   int okToChngToI
d130: 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72  N = 0;     /* Tr
d140: 75 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72  ue if the conver
d150: 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61  sion to IN is va
d160: 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  lid */.    int i
d170: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20  Column = -1;    
d180: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69       /* Column i
d190: 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49  ndex on lhs of I
d1a0: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
d1b0: 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20    int iCursor = 
d1c0: 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  -1;         /* T
d1d0: 61 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d  able cursor comm
d1e0: 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20  on to all terms 
d1f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30  */.    int j = 0
d200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d210: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
d220: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72   */..    /* Sear
d230: 63 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61  ch for a table a
d240: 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61  nd column that a
d250: 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69  ppears on one si
d260: 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  de or the.    **
d270: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d   other of the ==
d280: 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65   operator in eve
d290: 72 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61  ry subterm.  Tha
d2a0: 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  t table and colu
d2b0: 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  mn.    ** will b
d2c0: 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43  e recorded in iC
d2d0: 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d  ursor and iColum
d2e0: 6e 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74 20  n.  There might 
d2f0: 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a  not be any.    *
d300: 2a 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64  * such table and
d310: 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b   column.  Set ok
d320: 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e  ToChngToIN if an
d330: 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 62   appropriate tab
d340: 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f  le.    ** and co
d350: 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75  lumn is found bu
d360: 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67  t leave okToChng
d370: 54 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f  ToIN false if no
d380: 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a  t found..    */.
d390: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32      for(j=0; j<2
d3a0: 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49   && !okToChngToI
d3b0: 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70  N; j++){.      p
d3c0: 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e  OrTerm = pOrWc->
d3d0: 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  a;.      for(i=p
d3e0: 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69  OrWc->nTerm-1; i
d3f0: 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72  >=0; i--, pOrTer
d400: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  m++){.        as
d410: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
d420: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
d430: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54   );.        pOrT
d440: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20  erm->wtFlags &= 
d450: 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20  ~TERM_OR_OK;.   
d460: 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
d470: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
d480: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
d490: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
d4a0: 65 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64  e 2-bit case and
d4b0: 20 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73   we are on the s
d4c0: 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20  econd iteration 
d4d0: 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
d4e0: 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73   current term is
d4f0: 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
d500: 69 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73  iteration.  So s
d510: 6b 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a  kip this term. *
d520: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
d530: 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20  rt( j==1 );.    
d540: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
d550: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d560: 20 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20    if( (chngToIN 
d570: 26 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  & getMask(&pWInf
d580: 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72  o->sMaskSet, pOr
d590: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
d5a0: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
d5b0: 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20     /* This term 
d5c0: 6d 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66  must be of the f
d5d0: 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77  orm t1.a==t2.b w
d5e0: 68 65 72 65 20 74 32 20 69 73 20 69 6e 20 74 68  here t2 is in th
d5f0: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
d600: 68 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20  hngToIN set but 
d610: 74 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73  t1 is not.  This
d620: 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69   term will be ei
d630: 74 68 65 72 20 70 72 65 63 65 65 64 65 64 0a 20  ther preceeded. 
d640: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66           ** or f
d650: 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76  ollwed by an inv
d660: 65 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62  erted copy (t2.b
d670: 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74  ==t1.a).  Skip t
d680: 68 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20  his term .      
d690: 20 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69      ** and use i
d6a0: 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f  ts inversion. */
d6b0: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
d6c0: 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ase( pOrTerm->wt
d6d0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
d6e0: 49 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20  IED );.         
d6f0: 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65   testcase( pOrTe
d700: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
d710: 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
d720: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d730: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
d740: 20 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c   & (TERM_COPIED|
d750: 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b  TERM_VIRTUAL) );
d760: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
d770: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
d780: 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
d790: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
d7a0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
d7b0: 69 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72  iCursor = pOrTer
d7c0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20  m->leftCursor;. 
d7d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d7e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
d7f0: 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  i<0 ){.        /
d800: 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74  * No candidate t
d810: 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20  able+column was 
d820: 66 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e  found.  This can
d830: 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20   only occur.    
d840: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65      ** on the se
d850: 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a  cond iteration *
d860: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
d870: 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( j==1 );.      
d880: 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
d890: 72 4f 66 54 77 6f 28 63 68 6e 67 54 6f 49 4e 29  rOfTwo(chngToIN)
d8a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
d8b0: 72 74 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65  rt( chngToIN==ge
d8c0: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
d8d0: 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72  MaskSet, iCursor
d8e0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ) );.        bre
d8f0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
d900: 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31    testcase( j==1
d910: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65   );..      /* We
d920: 20 68 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61   have found a ca
d930: 6e 64 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e  ndidate table an
d940: 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b  d column.  Check
d950: 20 74 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a   to see if that.
d960: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61        ** table a
d970: 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d  nd column is com
d980: 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72  mon to every ter
d990: 6d 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75  m in the OR clau
d9a0: 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f  se */.      okTo
d9b0: 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20  ChngToIN = 1;.  
d9c0: 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26      for(; i>=0 &
d9d0: 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20  & okToChngToIN; 
d9e0: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
d9f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
da00: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
da10: 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20  tor & WO_EQ );. 
da20: 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65         if( pOrTe
da30: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rm->leftCursor!=
da40: 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
da50: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
da60: 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f  Flags &= ~TERM_O
da70: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65  R_OK;.        }e
da80: 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
da90: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69  >u.leftColumn!=i
daa0: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
dab0: 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e      okToChngToIN
dac0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
dad0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
dae0: 6e 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52  nt affLeft, affR
daf0: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
db00: 2f 2a 20 49 66 20 74 68 65 20 72 69 67 68 74 2d  /* If the right-
db10: 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73  hand side is als
db20: 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  o a column, then
db30: 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a   the affinities.
db40: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20            ** of 
db50: 62 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c  both right and l
db60: 65 66 74 20 73 69 64 65 73 20 6d 75 73 74 20 62  eft sides must b
db70: 65 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74  e such that no t
db80: 79 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ype.          **
db90: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65   conversions are
dba0: 20 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65   required on the
dbb0: 20 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74   right.  (Ticket
dbc0: 20 23 32 32 34 39 29 0a 20 20 20 20 20 20 20 20   #2249).        
dbd0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61    */.          a
dbe0: 66 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  ffRight = sqlite
dbf0: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f  3ExprAffinity(pO
dc00: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  rTerm->pExpr->pR
dc10: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
dc20: 20 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74   affLeft = sqlit
dc30: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
dc40: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
dc50: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Left);.         
dc60: 20 69 66 28 20 61 66 66 52 69 67 68 74 21 3d 30   if( affRight!=0
dc70: 20 26 26 20 61 66 66 52 69 67 68 74 21 3d 61 66   && affRight!=af
dc80: 66 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  fLeft ){.       
dc90: 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49       okToChngToI
dca0: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  N = 0;.         
dcb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
dcc0: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
dcd0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f  lags |= TERM_OR_
dce0: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
dcf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dd00: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
dd10: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f  At this point, o
dd20: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74  kToChngToIN is t
dd30: 72 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20  rue if original 
dd40: 70 54 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a  pTerm satisfies.
dd50: 20 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20      ** case 1.  
dd60: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f  In that case, co
dd70: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 76 69  nstruct a new vi
dd80: 72 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20  rtual term that 
dd90: 69 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d  is .    ** pTerm
dda0: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
ddb0: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  an IN operator..
ddc0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f      */.    if( o
ddd0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20  kToChngToIN ){. 
dde0: 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b       Expr *pDup;
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
de00: 20 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69   transient dupli
de10: 63 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  cate expression 
de20: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
de30: 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20  t *pList = 0;   
de40: 2f 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74 68  /* The RHS of th
de50: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
de60: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
de70: 66 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ft = 0;       /*
de80: 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   The LHS of the 
de90: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
dea0: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
dec0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f  he complete IN o
ded0: 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20  perator */..    
dee0: 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e    for(i=pOrWc->n
def0: 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d  Term-1, pOrTerm=
df00: 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20  pOrWc->a; i>=0; 
df10: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
df20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f  .        if( (pO
df30: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
df40: 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20   TERM_OR_OK)==0 
df50: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
df60: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
df70: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
df80: 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
df90: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
dfa0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
dfb0: 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20  Cursor );.      
dfc0: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
dfd0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  m->u.leftColumn=
dfe0: 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20  =iColumn );.    
dff0: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
e000: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
e010: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  rTerm->pExpr->pR
e020: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
e030: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
e040: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
e050: 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
e060: 70 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20  pList, pDup);.  
e070: 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f        pLeft = pO
e080: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  rTerm->pExpr->pL
e090: 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eft;.      }.   
e0a0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
e0b0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75  !=0 );.      pDu
e0c0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
e0d0: 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29  up(db, pLeft, 0)
e0e0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
e0f0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
e100: 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c  se, TK_IN, pDup,
e110: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
e120: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
e130: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
e140: 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f        transferJo
e150: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c  inMarkings(pNew,
e160: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
e170: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
e180: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
e190: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
e1a0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  .        pNew->x
e1b0: 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  .pList = pList;.
e1c0: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d          idxNew =
e1d0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
e1e0: 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45  rt(pWC, pNew, TE
e1f0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
e200: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
e210: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
e220: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ew==0 );.       
e230: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
e240: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
e250: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
e260: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
e270: 5d 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e  ];.        pWC->
e280: 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e  a[idxNew].iParen
e290: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
e2a0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
e2b0: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  ld = 1;.      }e
e2c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
e2d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
e2e0: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
e2f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65       }.      pTe
e300: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
e310: 57 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73  WO_NOOP;  /* cas
e320: 65 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20  e 1 trumps case 
e330: 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  2 */.    }.  }.}
e340: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
e350: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
e360: 49 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49  IZATION && !SQLI
e370: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
e380: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69   */../*.** The i
e390: 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75  nput to this rou
e3a0: 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65  tine is an Where
e3b0: 54 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77  Term structure w
e3c0: 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  ith only the.** 
e3d0: 22 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69  "pExpr" field fi
e3e0: 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f  lled in.  The jo
e3f0: 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
e400: 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20  e is to analyze 
e410: 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73  the.** subexpres
e420: 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74  sion and populat
e430: 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  e all the other 
e440: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68  fields of the Wh
e450: 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63  ereTerm.** struc
e460: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ture..**.** If t
e470: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
e480: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65   of the form "<e
e490: 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20  xpr> <op> X" it 
e4a0: 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a  gets commuted.**
e4b0: 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64   to the standard
e4c0: 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e   form of "X <op>
e4d0: 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20   <expr>"..**.** 
e4e0: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
e4f0: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
e500: 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72   "X <op> Y" wher
e510: 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61  e both X and Y a
e520: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74  re.** columns, t
e530: 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hen the original
e540: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75   expression is u
e550: 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e  nchanged and a n
e560: 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65  ew virtual.** te
e570: 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rm of the form "
e580: 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64  Y <op> X" is add
e590: 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ed to the WHERE 
e5a0: 63 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e  clause and.** an
e5b0: 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c  alyzed separatel
e5c0: 79 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  y.  The original
e5d0: 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20   term is marked 
e5e0: 77 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44  with TERM_COPIED
e5f0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20  .** and the new 
e600: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
e610: 69 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  ith TERM_DYNAMIC
e620: 20 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70   (because it's p
e630: 45 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  Expr.** needs to
e640: 20 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74   be freed with t
e650: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20  he WhereClause) 
e660: 61 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  and TERM_VIRTUAL
e670: 20 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20   (because it.** 
e680: 69 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f  is a commuted co
e690: 70 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65  py of a prior te
e6a0: 72 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e  rm.)  The origin
e6b0: 61 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69  al term has nChi
e6c0: 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ld=1.** and the 
e6d0: 63 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65  copy has idxPare
e6e0: 6e 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  nt set to the in
e6f0: 64 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69  dex of the origi
e700: 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61  nal term..*/.sta
e710: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
e720: 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20  lyze(.  SrcList 
e730: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20  *pSrc,          
e740: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
e750: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
e760: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
e770: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
e780: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
e790: 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20   idxTerm        
e7a0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
e7b0: 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62  of the term to b
e7c0: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
e7d0: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
e7e0: 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
e7f0: 66 6f 3b 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  fo; /* WHERE cla
e800: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63  use processing c
e810: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
e820: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e840: 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  The term to be a
e850: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65  nalyzed */.  Whe
e860: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
e870: 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Set;          /*
e880: 20 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e   Set of table in
e890: 64 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45  dex masks */.  E
e8a0: 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20  xpr *pExpr;     
e8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8c0: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
e8d0: 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  n to be analyzed
e8e0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72   */.  Bitmask pr
e8f0: 65 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20  ereqLeft;       
e900: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71         /* Prereq
e910: 75 65 73 69 74 65 73 20 6f 66 20 74 68 65 20 70  uesites of the p
e920: 45 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20  Expr->pLeft */. 
e930: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41   Bitmask prereqA
e940: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
e950: 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74    /* Prerequesit
e960: 65 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20  es of pExpr */. 
e970: 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69   Bitmask extraRi
e980: 67 68 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ght = 0;        
e990: 20 20 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e    /* Extra depen
e9a0: 64 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20  dencies on LEFT 
e9b0: 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  JOIN */.  Expr *
e9c0: 70 53 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20  pStr1 = 0;      
e9d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48             /* RH
e9e0: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f  S of LIKE/GLOB o
e9f0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
ea00: 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b   isComplete = 0;
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ea20: 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f   RHS of LIKE/GLO
ea30: 42 20 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64  B ends with wild
ea40: 63 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  card */.  int no
ea50: 43 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Case = 0;       
ea60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49             /* LI
ea70: 4b 45 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75  KE/GLOB distingu
ea80: 69 73 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20  ishes case */.  
ea90: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
eaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eab0: 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70   /* Top-level op
eac0: 65 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e  erator.  pExpr->
ead0: 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  op */.  Parse *p
eae0: 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
eaf0: 70 50 61 72 73 65 3b 20 20 2f 2a 20 50 61 72 73  pParse;  /* Pars
eb00: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
eb10: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
eb20: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
eb30: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
eb40: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69  nnection */..  i
eb50: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
eb60: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
eb70: 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  n;.  }.  pTerm =
eb80: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
eb90: 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20  ];.  pMaskSet = 
eba0: 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
ebb0: 74 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65  t;.  pExpr = pTe
ebc0: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73  rm->pExpr;.  ass
ebd0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
ebe0: 54 4b 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e  TK_AS && pExpr->
ebf0: 6f 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op!=TK_COLLATE )
ec00: 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d  ;.  prereqLeft =
ec10: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
ec20: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
ec30: 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20  >pLeft);.  op = 
ec40: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28  pExpr->op;.  if(
ec50: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20   op==TK_IN ){.  
ec60: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
ec70: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
ec80: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
ec90: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
eca0: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
ecb0: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
ecc0: 71 52 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c  qRight = exprSel
ecd0: 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  ectTableUsage(pM
ece0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78  askSet, pExpr->x
ecf0: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d  .pSelect);.    }
ed00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72  else{.      pTer
ed10: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
ed20: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
ed30: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
ed40: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
ed50: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
ed60: 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
ed70: 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65  {.    pTerm->pre
ed80: 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20  reqRight = 0;.  
ed90: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d  }else{.    pTerm
eda0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
edb0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
edc0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
edd0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70  pRight);.  }.  p
ede0: 72 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54  rereqAll = exprT
edf0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
ee00: 65 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66  et, pExpr);.  if
ee10: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
ee20: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
ee30: 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74  Join) ){.    Bit
ee40: 6d 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b  mask x = getMask
ee50: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
ee60: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
ee70: 65 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c  e);.    prereqAl
ee80: 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72  l |= x;.    extr
ee90: 61 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f  aRight = x-1;  /
eea0: 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d  * ON clause term
eeb0: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65  s may not be use
eec0: 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a  d with an index.
eed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eee0: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66         ** on lef
eef0: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
ef00: 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20  T JOIN.  Ticket 
ef10: 23 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70  #3015 */.  }.  p
ef20: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
ef30: 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70  = prereqAll;.  p
ef40: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
ef50: 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e   = -1;.  pTerm->
ef60: 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20  iParent = -1;.  
ef70: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
ef80: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f   = 0;.  if( allo
ef90: 77 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20  wedOp(op) ){.   
efa0: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73   Expr *pLeft = s
efb0: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
efc0: 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65  llate(pExpr->pLe
efd0: 66 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  ft);.    Expr *p
efe0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
eff0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
f000: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
f010: 20 20 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20     u16 opMask = 
f020: 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
f030: 67 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74  ght & prereqLeft
f040: 29 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20  )==0 ? WO_ALL : 
f050: 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 69 66  WO_EQUIV;.    if
f060: 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
f070: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
f080: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
f090: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
f0a0: 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  e;.      pTerm->
f0b0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
f0c0: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
f0d0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65       pTerm->eOpe
f0e0: 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72  rator = operator
f0f0: 4d 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73  Mask(op) & opMas
f100: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
f110: 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68   pRight && pRigh
f120: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
f130: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
f140: 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  erm *pNew;.     
f150: 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20   Expr *pDup;.   
f160: 20 20 20 75 31 36 20 65 45 78 74 72 61 4f 70 20     u16 eExtraOp 
f170: 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  = 0;        /* E
f180: 78 74 72 61 20 62 69 74 73 20 66 6f 72 20 70 4e  xtra bits for pN
f190: 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f  ew->eOperator */
f1a0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
f1b0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20  ->leftCursor>=0 
f1c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
f1d0: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70  dxNew;.        p
f1e0: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
f1f0: 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
f200: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
f210: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f220: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
f230: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
f240: 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20  db, pDup);.     
f250: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
f260: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
f270: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
f280: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
f290: 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  Dup, TERM_VIRTUA
f2a0: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
f2b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78  .        if( idx
f2c0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  New==0 ) return;
f2d0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
f2e0: 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b  &pWC->a[idxNew];
f2f0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  .        pNew->i
f300: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
f310: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  ;.        pTerm 
f320: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
f330: 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  m];.        pTer
f340: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
f350: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74         pTerm->wt
f360: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
f370: 50 49 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66  PIED;.        if
f380: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
f390: 45 51 0a 20 20 20 20 20 20 20 20 20 26 26 20 21  EQ.         && !
f3a0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
f3b0: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
f3c0: 69 6e 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  in).         && 
f3d0: 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
f3e0: 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 54  led(db, SQLITE_T
f3f0: 72 61 6e 73 69 74 69 76 65 29 0a 20 20 20 20 20  ransitive).     
f400: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
f410: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f420: 20 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20   |= WO_EQUIV;.  
f430: 20 20 20 20 20 20 20 20 65 45 78 74 72 61 4f 70          eExtraOp
f440: 20 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20   = WO_EQUIV;.   
f450: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
f460: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70  se{.        pDup
f470: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
f480: 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a    pNew = pTerm;.
f490: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78        }.      ex
f4a0: 70 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65  prCommute(pParse
f4b0: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70  , pDup);.      p
f4c0: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
f4d0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44  prSkipCollate(pD
f4e0: 75 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  up->pLeft);.    
f4f0: 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73    pNew->leftCurs
f500: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
f510: 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  le;.      pNew->
f520: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
f530: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
f540: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
f550: 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74  prereqLeft | ext
f560: 72 61 52 69 67 68 74 29 20 21 3d 20 70 72 65 72  raRight) != prer
f570: 65 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  eqLeft );.      
f580: 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68  pNew->prereqRigh
f590: 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c  t = prereqLeft |
f5a0: 20 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20   extraRight;.   
f5b0: 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41     pNew->prereqA
f5c0: 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a  ll = prereqAll;.
f5d0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65        pNew->eOpe
f5e0: 72 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f  rator = (operato
f5f0: 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20  rMask(pDup->op) 
f600: 2b 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70  + eExtraOp) & op
f610: 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Mask;.    }.  }.
f620: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f630: 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54  OMIT_BETWEEN_OPT
f640: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49  IMIZATION.  /* I
f650: 66 20 61 20 74 65 72 6d 20 69 73 20 74 68 65 20  f a term is the 
f660: 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
f670: 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77  , create two new
f680: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20   virtual terms. 
f690: 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20   ** that define 
f6a0: 74 68 65 20 72 61 6e 67 65 20 74 68 61 74 20 74  the range that t
f6b0: 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65  he BETWEEN imple
f6c0: 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d  ments.  For exam
f6d0: 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
f6e0: 20 20 20 20 61 20 42 45 54 57 45 45 4e 20 62 20      a BETWEEN b 
f6f0: 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20  AND c.  **.  ** 
f700: 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  is converted int
f710: 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
f720: 20 20 28 61 20 42 45 54 57 45 45 4e 20 62 20 41    (a BETWEEN b A
f730: 4e 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29  ND c) AND (a>=b)
f740: 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a   AND (a<=c).  **
f750: 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65  .  ** The two ne
f760: 77 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65  w terms are adde
f770: 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  d onto the end o
f780: 66 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  f the WhereClaus
f790: 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54  e object..  ** T
f7a0: 68 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65  he new terms are
f7b0: 20 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61   "dynamic" and a
f7c0: 72 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74  re children of t
f7d0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57  he original BETW
f7e0: 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20  EEN.  ** term.  
f7f0: 54 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  That means that 
f800: 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 74  if the BETWEEN t
f810: 65 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68  erm is coded, th
f820: 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20  e children are. 
f830: 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72   ** skipped.  Or
f840: 2c 20 69 66 20 74 68 65 20 63 68 69 6c 64 72 65  , if the childre
f850: 6e 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20  n are satisfied 
f860: 62 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65  by an index, the
f870: 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42   original.  ** B
f880: 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73  ETWEEN term is s
f890: 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  kipped..  */.  e
f8a0: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  lse if( pExpr->o
f8b0: 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26  p==TK_BETWEEN &&
f8c0: 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44   pWC->op==TK_AND
f8d0: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
f8e0: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
f8f0: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e  >x.pList;.    in
f900: 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20  t i;.    static 
f910: 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d  const u8 ops[] =
f920: 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b   {TK_GE, TK_LE};
f930: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
f940: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  st!=0 );.    ass
f950: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
f960: 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28  r==2 );.    for(
f970: 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
f980: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
f990: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Expr;.      int 
f9a0: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e  idxNew;.      pN
f9b0: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
f9c0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70  PExpr(pParse, op
f9d0: 73 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20  s[i], .         
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
fa00: 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c  up(db, pExpr->pL
fa10: 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  eft, 0),.       
fa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fa40: 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e  rDup(db, pList->
fa50: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20  a[i].pExpr, 0), 
fa60: 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77  0);.      idxNew
fa70: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
fa80: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
fa90: 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  pr, TERM_VIRTUAL
faa0: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
fab0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
fac0: 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
fad0: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
fae0: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
faf0: 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  );.      pTerm =
fb00: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
fb10: 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  ];.      pWC->a[
fb20: 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20  idxNew].iParent 
fb30: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d  = idxTerm;.    }
fb40: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69  .    pTerm->nChi
fb50: 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64  ld = 2;.  }.#end
fb60: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
fb70: 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49  T_BETWEEN_OPTIMI
fb80: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21  ZATION */..#if !
fb90: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
fba0: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
fbb0: 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64  ION) && !defined
fbc0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
fbd0: 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c  QUERY).  /* Anal
fbe0: 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20  yze a term that 
fbf0: 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74  is composed of t
fc00: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65  wo or more subte
fc10: 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
fc20: 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72  .  ** an OR oper
fc30: 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  ator..  */.  els
fc40: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
fc50: 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73  =TK_OR ){.    as
fc60: 73 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54  sert( pWC->op==T
fc70: 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70  K_AND );.    exp
fc80: 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70  rAnalyzeOrTerm(p
fc90: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72  Src, pWC, idxTer
fca0: 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  m);.    pTerm = 
fcb0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
fcc0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
fcd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
fce0: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
fcf0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fd00: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
fd10: 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63  ATION.  /* Add c
fd20: 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65  onstraints to re
fd30: 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20  duce the search 
fd40: 73 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20  space on a LIKE 
fd50: 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65  or GLOB.  ** ope
fd60: 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  rator..  **.  **
fd70: 20 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20   A like pattern 
fd80: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c  of the form "x L
fd90: 49 4b 45 20 27 61 62 63 25 27 22 20 69 73 20 63  IKE 'abc%'" is c
fda0: 68 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73  hanged into cons
fdb0: 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a  traints.  **.  *
fdc0: 2a 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27 61  *          x>='a
fdd0: 62 63 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20  bc' AND x<'abd' 
fde0: 41 4e 44 20 78 20 4c 49 4b 45 20 27 61 62 63 25  AND x LIKE 'abc%
fdf0: 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  '.  **.  ** The 
fe00: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 6f  last character o
fe10: 66 20 74 68 65 20 70 72 65 66 69 78 20 22 61 62  f the prefix "ab
fe20: 63 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  c" is incremente
fe30: 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20  d to form the.  
fe40: 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  ** termination c
fe50: 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a  ondition "abd"..
fe60: 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e    */.  if( pWC->
fe70: 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26  op==TK_AND .   &
fe80: 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70  & isLikeOrGlob(p
fe90: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 70  Parse, pExpr, &p
fea0: 53 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74  Str1, &isComplet
feb0: 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b  e, &noCase).  ){
fec0: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
fed0: 3b 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f  ;       /* LHS o
fee0: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72  f LIKE/GLOB oper
fef0: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72  ator */.    Expr
ff00: 20 2a 70 53 74 72 32 3b 20 20 20 20 20 20 20 2f   *pStr2;       /
ff10: 2a 20 43 6f 70 79 20 6f 66 20 70 53 74 72 31 20  * Copy of pStr1 
ff20: 2d 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c  - RHS of LIKE/GL
ff30: 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  OB operator */. 
ff40: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
ff50: 72 31 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e  r1;.    Expr *pN
ff60: 65 77 45 78 70 72 32 3b 0a 20 20 20 20 69 6e 74  ewExpr2;.    int
ff70: 20 69 64 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e   idxNew1;.    in
ff80: 74 20 69 64 78 4e 65 77 32 3b 0a 20 20 20 20 54  t idxNew2;.    T
ff90: 6f 6b 65 6e 20 73 43 6f 6c 6c 53 65 71 4e 61 6d  oken sCollSeqNam
ffa0: 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63  e;  /* Name of c
ffb0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
ffc0: 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74 20  e */..    pLeft 
ffd0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
ffe0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
fff0: 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65    pStr2 = sqlite
10000 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 74  3ExprDup(db, pSt
10010 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  r1, 0);.    if( 
10020 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
10030 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c  d ){.      u8 c,
10040 20 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20 4c   *pC;       /* L
10050 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65  ast character be
10060 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77  fore the first w
10070 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20 20  ildcard */.     
10080 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74 72   pC = (u8*)&pStr
10090 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69  2->u.zToken[sqli
100a0 74 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74 72  te3Strlen30(pStr
100b0 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b  2->u.zToken)-1];
100c0 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b 0a  .      c = *pC;.
100d0 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65        if( noCase
100e0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
100f0 68 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 69  he point is to i
10100 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61 73  ncrement the las
10110 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66 6f  t character befo
10120 72 65 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  re the first.   
10130 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72 64       ** wildcard
10140 2e 20 20 42 75 74 20 69 66 20 77 65 20 69 6e 63  .  But if we inc
10150 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61 74  rement '@', that
10160 20 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69 6e   will push it in
10170 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  to the.        *
10180 2a 20 61 6c 70 68 61 62 65 74 69 63 20 72 61 6e  * alphabetic ran
10190 67 65 20 77 68 65 72 65 20 63 61 73 65 20 63 6f  ge where case co
101a0 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20 6d  nversions will m
101b0 65 73 73 20 75 70 20 74 68 65 20 0a 20 20 20 20  ess up the .    
101c0 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69 74      ** inequalit
101d0 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68 69  y.  To avoid thi
101e0 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f 20  s, make sure to 
101f0 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75 6c  also run the ful
10200 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49 4b  l.        ** LIK
10210 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64 61  E on all candida
10220 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62  te expressions b
10230 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 69  y clearing the i
10240 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a 20  sComplete flag. 
10250 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
10260 20 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20 29    if( c=='A'-1 )
10270 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b   isComplete = 0;
10280 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c  .        c = sql
10290 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
102a0 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [c];.      }.   
102b0 20 20 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a     *pC = c + 1;.
102c0 20 20 20 20 7d 0a 20 20 20 20 73 43 6f 6c 6c 53      }.    sCollS
102d0 65 71 4e 61 6d 65 2e 7a 20 3d 20 6e 6f 43 61 73  eqName.z = noCas
102e0 65 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a 20 22  e ? "NOCASE" : "
102f0 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 73 43 6f  BINARY";.    sCo
10300 6c 6c 53 65 71 4e 61 6d 65 2e 6e 20 3d 20 36 3b  llSeqName.n = 6;
10310 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d  .    pNewExpr1 =
10320 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
10330 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20  db, pLeft, 0);. 
10340 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73     pNewExpr1 = s
10350 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
10360 73 65 2c 20 54 4b 5f 47 45 2c 20 0a 20 20 20 20  se, TK_GE, .    
10370 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
10380 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65  prAddCollateToke
10390 6e 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70  n(pParse,pNewExp
103a0 72 31 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65  r1,&sCollSeqName
103b0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  ),.           pS
103c0 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 64 78  tr1, 0);.    idx
103d0 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c 61 75  New1 = whereClau
103e0 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
103f0 65 77 45 78 70 72 31 2c 20 54 45 52 4d 5f 56 49  ewExpr1, TERM_VI
10400 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
10410 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  IC);.    testcas
10420 65 28 20 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b  e( idxNew1==0 );
10430 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
10440 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
10450 65 77 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78  ew1);.    pNewEx
10460 70 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pr2 = sqlite3Exp
10470 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20  rDup(db, pLeft, 
10480 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  0);.    pNewExpr
10490 32 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  2 = sqlite3PExpr
104a0 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a  (pParse, TK_LT,.
104b0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
104c0 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
104d0 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 70 4e 65  Token(pParse,pNe
104e0 77 45 78 70 72 32 2c 26 73 43 6f 6c 6c 53 65 71  wExpr2,&sCollSeq
104f0 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20  Name),.         
10500 20 20 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20    pStr2, 0);.   
10510 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65   idxNew2 = where
10520 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
10530 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52  , pNewExpr2, TER
10540 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
10550 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73  YNAMIC);.    tes
10560 74 63 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d  tcase( idxNew2==
10570 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  0 );.    exprAna
10580 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
10590 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54  idxNew2);.    pT
105a0 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
105b0 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20  xTerm];.    if( 
105c0 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20  isComplete ){.  
105d0 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
105e0 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  w1].iParent = id
105f0 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43  xTerm;.      pWC
10600 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61  ->a[idxNew2].iPa
10610 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
10620 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
10630 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20  ild = 2;.    }. 
10640 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
10650 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
10660 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
10670 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10680 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
10690 20 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41    /* Add a WO_MA
106a0 54 43 48 20 61 75 78 69 6c 69 61 72 79 20 74 65  TCH auxiliary te
106b0 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72  rm to the constr
106c0 61 69 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a  aint set if the.
106d0 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70    ** current exp
106e0 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
106f0 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20  e form:  column 
10700 4d 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a  MATCH expr..  **
10710 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
10720 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
10730 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
10740 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74  ods of.  ** virt
10750 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65  ual tables.  The
10760 20 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f 70   native query op
10770 74 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74  timizer does not
10780 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f   attempt.  ** to
10790 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74   do anything wit
107a0 68 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e  h MATCH function
107b0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  s..  */.  if( is
107c0 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45  MatchOfColumn(pE
107d0 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  xpr) ){.    int 
107e0 69 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72  idxNew;.    Expr
107f0 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74   *pRight, *pLeft
10800 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
10810 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42  *pNewTerm;.    B
10820 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c  itmask prereqCol
10830 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b  umn, prereqExpr;
10840 0a 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70  ..    pRight = p
10850 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
10860 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [0].pExpr;.    p
10870 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Left = pExpr->x.
10880 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
10890 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78 70  r;.    prereqExp
108a0 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  r = exprTableUsa
108b0 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69  ge(pMaskSet, pRi
108c0 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71  ght);.    prereq
108d0 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62  Column = exprTab
108e0 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
108f0 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  , pLeft);.    if
10900 28 20 28 70 72 65 72 65 71 45 78 70 72 20 26 20  ( (prereqExpr & 
10910 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30  prereqColumn)==0
10920 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
10930 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
10940 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
10950 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
10960 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20  TK_MATCH, .     
10970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10980 20 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69           0, sqli
10990 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
109a0 52 69 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20  Right, 0), 0);. 
109b0 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
109c0 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
109d0 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54  pWC, pNewExpr, T
109e0 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
109f0 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
10a00 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
10a10 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e  w==0 );.      pN
10a20 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  ewTerm = &pWC->a
10a30 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20  [idxNew];.      
10a40 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
10a50 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 45 78  Right = prereqEx
10a60 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  pr;.      pNewTe
10a70 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
10a80 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
10a90 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
10aa0 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
10ab0 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
10ac0 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65       pNewTerm->e
10ad0 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41  Operator = WO_MA
10ae0 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  TCH;.      pNewT
10af0 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  erm->iParent = i
10b00 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
10b10 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
10b20 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54  xTerm];.      pT
10b30 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
10b40 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
10b50 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
10b60 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77  PIED;.      pNew
10b70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
10b80 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  = pTerm->prereqA
10b90 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ll;.    }.  }.#e
10ba0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
10bb0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
10bc0 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
10bd0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
10be0 20 20 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65    /* When sqlite
10bf0 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d  _stat3 histogram
10c00 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62   data is availab
10c10 6c 65 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f  le an operator o
10c20 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20  f the.  ** form 
10c30 22 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20  "x IS NOT NULL" 
10c40 63 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65  can sometimes be
10c50 20 65 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20   evaluated more 
10c60 65 66 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a  efficiently.  **
10c70 20 61 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20   as "x>NULL" if 
10c80 78 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45  x is not an INTE
10c90 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
10ca0 20 20 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61    So construct a
10cb0 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65  .  ** virtual te
10cc0 72 6d 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e  rm of that form.
10cd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20  .  **.  ** Note 
10ce0 74 68 61 74 20 74 68 65 20 76 69 72 74 75 61 6c  that the virtual
10cf0 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61   term must be ta
10d00 67 67 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56  gged with TERM_V
10d10 4e 55 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a  NULL.  This.  **
10d20 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20   TERM_VNULL tag 
10d30 77 69 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68  will suppress th
10d40 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b  e not-null check
10d50 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
10d60 67 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f  g.  ** of the lo
10d70 6f 70 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65  op.  Without the
10d80 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67   TERM_VNULL flag
10d90 2c 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63  , the not-null c
10da0 68 65 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65  heck at.  ** the
10db0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f   start of the lo
10dc0 6f 70 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20  op will prevent 
10dd0 61 6e 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  any results from
10de0 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e   being returned.
10df0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  .  */.  if( pExp
10e00 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op==TK_NOTNUL
10e10 4c 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70  L.   && pExpr->p
10e20 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Left->op==TK_COL
10e30 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d  UMN.   && pExpr-
10e40 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e  >pLeft->iColumn>
10e50 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  =0.   && Optimiz
10e60 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
10e70 20 53 51 4c 49 54 45 5f 53 74 61 74 33 29 0a 20   SQLITE_Stat3). 
10e80 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e   ){.    Expr *pN
10e90 65 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72  ewExpr;.    Expr
10ea0 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
10eb0 3e 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20  >pLeft;.    int 
10ec0 69 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72  idxNew;.    Wher
10ed0 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b  eTerm *pNewTerm;
10ee0 0a 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d  ..    pNewExpr =
10ef0 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
10f00 61 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20  arse, TK_GT,.   
10f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10f30 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66  ExprDup(db, pLef
10f40 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20  t, 0),.         
10f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f60 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 28     sqlite3PExpr(
10f70 70 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c  pParse, TK_NULL,
10f80 20 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a   0, 0, 0), 0);..
10f90 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
10fa0 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
10fb0 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20  WC, pNewExpr,.  
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 54 45 52 4d              TERM
10fe0 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
10ff0 4e 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c  NAMIC|TERM_VNULL
11000 29 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65  );.    if( idxNe
11010 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54  w ){.      pNewT
11020 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
11030 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65  xNew];.      pNe
11040 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  wTerm->prereqRig
11050 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e  ht = 0;.      pN
11060 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  ewTerm->leftCurs
11070 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
11080 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  le;.      pNewTe
11090 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
110a0 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
110b0 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  n;.      pNewTer
110c0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
110d0 4f 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e 65 77  O_GT;.      pNew
110e0 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
110f0 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
11100 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
11110 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70  dxTerm];.      p
11120 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31  Term->nChild = 1
11130 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
11140 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
11150 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65  OPIED;.      pNe
11160 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  wTerm->prereqAll
11170 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   = pTerm->prereq
11180 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  All;.    }.  }.#
11190 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
111a0 45 4e 41 42 4c 45 5f 53 54 41 54 20 2a 2f 0a 0a  ENABLE_STAT */..
111b0 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20    /* Prevent ON 
111c0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20  clause terms of 
111d0 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d  a LEFT JOIN from
111e0 20 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64   being used to d
111f0 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64  rive.  ** an ind
11200 65 78 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f  ex for tables to
11210 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65   the left of the
11220 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54   join..  */.  pT
11230 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
11240 20 7c 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a   |= extraRight;.
11250 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
11260 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20  nction searches 
11270 70 4c 69 73 74 20 66 6f 72 20 61 20 65 6e 74 72  pList for a entr
11280 79 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74  y that matches t
11290 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
112a0 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65 78 20 70 49  n.** of index pI
112b0 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  dx..**.** If suc
112c0 68 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  h an expression 
112d0 69 73 20 66 6f 75 6e 64 2c 20 69 74 73 20 69 6e  is found, its in
112e0 64 65 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b  dex in pList->a[
112f0 5d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  ] is returned. I
11300 66 0a 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73 69  f.** no expressi
11310 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31 20  on is found, -1 
11320 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
11330 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49  static int findI
11340 6e 64 65 78 43 6f 6c 28 0a 20 20 50 61 72 73 65  ndexCol(.  Parse
11350 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
11360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
11370 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
11380 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
11390 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
113a0 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c   /* Expression l
113b0 69 73 74 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  ist to search */
113c0 0a 20 20 69 6e 74 20 69 42 61 73 65 2c 20 20 20  .  int iBase,   
113d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113e0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72     /* Cursor for
113f0 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   table associate
11400 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20  d with pIdx */. 
11410 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11430 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61 74   /* Index to mat
11440 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a  ch column of */.
11450 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20    int iCol      
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11470 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20 69    /* Column of i
11480 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f  ndex to match */
11490 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  .){.  int i;.  c
114a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
114b0 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
114c0 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d  iCol];..  for(i=
114d0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
114e0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
114f0 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78  r *p = sqlite3Ex
11500 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c  prSkipCollate(pL
11510 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
11520 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ;.    if( p->op=
11530 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20  =TK_COLUMN.     
11540 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  && p->iColumn==p
11550 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43  Idx->aiColumn[iC
11560 6f 6c 5d 0a 20 20 20 20 20 26 26 20 70 2d 3e 69  ol].     && p->i
11570 54 61 62 6c 65 3d 3d 69 42 61 73 65 0a 20 20 20  Table==iBase.   
11580 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
11590 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
115a0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
115b0 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  arse, pList->a[i
115c0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
115d0 69 66 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c  if( ALWAYS(pColl
115e0 29 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53  ) && 0==sqlite3S
115f0 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
11600 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  ame, zColl) ){. 
11610 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b         return i;
11620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11630 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b   }..  return -1;
11640 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
11650 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53   true if the DIS
11660 54 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e  TINCT expression
11670 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20  -list passed as 
11680 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
11690 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61  nt.** is redunda
116a0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54  nt..**.** A DIST
116b0 49 4e 43 54 20 6c 69 73 74 20 69 73 20 72 65 64  INCT list is red
116c0 75 6e 64 61 6e 74 20 69 66 20 74 68 65 20 64 61  undant if the da
116d0 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20  tabase contains 
116e0 73 6f 6d 65 20 73 75 62 73 65 74 20 6f 66 0a 2a  some subset of.*
116f0 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61  * columns that a
11700 72 65 20 75 6e 69 71 75 65 20 61 6e 64 20 6e 6f  re unique and no
11710 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  n-null..*/.stati
11720 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74  c int isDistinct
11730 52 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72  Redundant(.  Par
11740 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
11750 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
11760 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
11770 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
11780 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
11790 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
117a0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
117b0 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  C,         /* Th
117c0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
117d0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44  /.  ExprList *pD
117e0 69 73 74 69 6e 63 74 20 20 20 20 20 20 20 2f 2a  istinct       /*
117f0 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
11800 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
11810 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a   DISTINCT */.){.
11820 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
11830 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
11840 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
11850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11860 0a 20 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20  .  int iBase;.. 
11870 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
11880 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61  more than one ta
11890 62 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63  ble or sub-selec
118a0 74 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  t in the FROM cl
118b0 61 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69  ause of.  ** thi
118c0 73 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74  s query, then it
118d0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73   will not be pos
118e0 73 69 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68  sible to show th
118f0 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  at the DISTINCT 
11900 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  .  ** clause is 
11910 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20  redundant. */.  
11920 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
11930 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  rc!=1 ) return 0
11940 3b 0a 20 20 69 42 61 73 65 20 3d 20 70 54 61 62  ;.  iBase = pTab
11950 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
11960 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61  or;.  pTab = pTa
11970 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62  bList->a[0].pTab
11980 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f  ;..  /* If any o
11990 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
119a0 73 20 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75  s is an IPK colu
119b0 6d 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73  mn on table iBas
119c0 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a  e, then return .
119d0 20 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a    ** true. Note:
119e0 20 54 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d   The (p->iTable=
119f0 3d 69 42 61 73 65 29 20 70 61 72 74 20 6f 66 20  =iBase) part of 
11a00 74 68 69 73 20 74 65 73 74 20 6d 61 79 20 62 65  this test may be
11a10 20 66 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20   false if the.  
11a20 2a 2a 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  ** current SELEC
11a30 54 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  T is a correlate
11a40 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a  d sub-query..  *
11a50 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
11a60 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b  Distinct->nExpr;
11a70 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
11a80 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  *p = sqlite3Expr
11a90 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73  SkipCollate(pDis
11aa0 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  tinct->a[i].pExp
11ab0 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  r);.    if( p->o
11ac0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
11ad0 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
11ae0 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30   && p->iColumn<0
11af0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
11b00 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f  ..  /* Loop thro
11b10 75 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ugh all indices 
11b20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68  on the table, ch
11b30 65 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73  ecking each to s
11b40 65 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20  ee if it makes. 
11b50 20 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54   ** the DISTINCT
11b60 20 71 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e   qualifier redun
11b70 64 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f  dant. It does so
11b80 20 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   if:.  **.  **  
11b90 20 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73   1. The index is
11ba0 20 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20   itself UNIQUE, 
11bb0 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  and.  **.  **   
11bc0 32 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f  2. All of the co
11bd0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64  lumns in the ind
11be0 65 78 20 61 72 65 20 65 69 74 68 65 72 20 70 61  ex are either pa
11bf0 72 74 20 6f 66 20 74 68 65 20 70 44 69 73 74 69  rt of the pDisti
11c00 6e 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69  nct.  **      li
11c10 73 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20  st, or else the 
11c20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
11c30 74 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20  tains a term of 
11c40 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22  the form "col=X"
11c50 2c 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72  ,.  **      wher
11c60 65 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  e X is a constan
11c70 74 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c  t value. The col
11c80 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
11c90 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20   of the.  **    
11ca0 20 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64    comparison and
11cb0 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70   select-list exp
11cc0 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61  ressions must ma
11cd0 74 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65  tch those of the
11ce0 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
11cf0 2a 20 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68  *   3. All of th
11d00 6f 73 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  ose index column
11d10 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  s for which the 
11d20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65  WHERE clause doe
11d30 73 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20  s not.  **      
11d40 63 6f 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58  contain a "col=X
11d50 22 20 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65  " term are subje
11d60 63 74 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c  ct to a NOT NULL
11d70 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a   constraint..  *
11d80 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61  /.  for(pIdx=pTa
11d90 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
11da0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
11db0 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78  t){.    if( pIdx
11dc0 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f  ->onError==OE_No
11dd0 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ne ) continue;. 
11de0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
11df0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
11e00 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
11e10 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  l = pIdx->aiColu
11e20 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  mn[i];.      if(
11e30 20 30 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57 43   0==findTerm(pWC
11e40 2c 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e  , iBase, iCol, ~
11e50 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45  (Bitmask)0, WO_E
11e60 51 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20  Q, pIdx) ){.    
11e70 20 20 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 20      int iIdxCol 
11e80 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70  = findIndexCol(p
11e90 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74  Parse, pDistinct
11ea0 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69  , iBase, pIdx, i
11eb0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
11ec0 49 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61 62  IdxCol<0 || pTab
11ed0 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43  ->aCol[pIdx->aiC
11ee0 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c  olumn[i]].notNul
11ef0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
11f00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
11f10 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
11f20 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78  .    if( i==pIdx
11f30 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
11f40 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78     /* This index
11f50 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68   implies that th
11f60 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69  e DISTINCT quali
11f70 66 69 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e  fier is redundan
11f80 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
11f90 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
11fa0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
11fb0 2f 2a 20 0a 2a 2a 20 46 69 6e 64 20 28 61 6e 20  /* .** Find (an 
11fc0 61 70 70 72 6f 78 69 6d 61 74 65 29 20 73 75 6d  approximate) sum
11fd0 20 6f 66 20 74 77 6f 20 57 68 65 72 65 43 6f 73   of two WhereCos
11fe0 74 73 2e 20 20 54 68 69 73 20 63 6f 6d 70 75 74  ts.  This comput
11ff0 61 74 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20  ation is.** not 
12000 61 20 73 69 6d 70 6c 65 20 22 2b 22 20 6f 70 65  a simple "+" ope
12010 72 61 74 6f 72 20 62 65 63 61 75 73 65 20 57 68  rator because Wh
12020 65 72 65 43 6f 73 74 20 69 73 20 73 74 6f 72 65  ereCost is store
12030 64 20 61 73 20 61 20 6c 6f 67 61 72 69 74 68 6d  d as a logarithm
12040 69 63 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 20  ic.** value..** 
12050 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65  .*/.static Where
12060 43 6f 73 74 20 77 68 65 72 65 43 6f 73 74 41 64  Cost whereCostAd
12070 64 28 57 68 65 72 65 43 6f 73 74 20 61 2c 20 57  d(WhereCost a, W
12080 68 65 72 65 43 6f 73 74 20 62 29 7b 0a 20 20 73  hereCost b){.  s
12090 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
120a0 67 6e 65 64 20 63 68 61 72 20 78 5b 5d 20 3d 20  gned char x[] = 
120b0 7b 0a 20 20 20 20 20 31 30 2c 20 31 30 2c 20 20  {.     10, 10,  
120c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120d0 20 20 20 20 20 20 20 2f 2a 20 30 2c 31 20 2a 2f         /* 0,1 */
120e0 0a 20 20 20 20 20 20 39 2c 20 39 2c 20 20 20 20  .      9, 9,    
120f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12100 20 20 20 20 20 20 2f 2a 20 32 2c 33 20 2a 2f 0a        /* 2,3 */.
12110 20 20 20 20 20 20 38 2c 20 38 2c 20 20 20 20 20        8, 8,     
12120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12130 20 20 20 20 20 2f 2a 20 34 2c 35 20 2a 2f 0a 20       /* 4,5 */. 
12140 20 20 20 20 20 37 2c 20 37 2c 20 37 2c 20 20 20       7, 7, 7,   
12150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12160 20 20 20 20 2f 2a 20 36 2c 37 2c 38 20 2a 2f 0a      /* 6,7,8 */.
12170 20 20 20 20 20 20 36 2c 20 36 2c 20 36 2c 20 20        6, 6, 6,  
12180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12190 20 20 20 20 20 2f 2a 20 39 2c 31 30 2c 31 31 20       /* 9,10,11 
121a0 2a 2f 0a 20 20 20 20 20 20 35 2c 20 35 2c 20 35  */.      5, 5, 5
121b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
121c0 20 20 20 20 20 20 20 20 2f 2a 20 31 32 2d 31 34          /* 12-14
121d0 20 2a 2f 0a 20 20 20 20 20 20 34 2c 20 34 2c 20   */.      4, 4, 
121e0 34 2c 20 34 2c 20 20 20 20 20 20 20 20 20 20 20  4, 4,           
121f0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 35 2d 31           /* 15-1
12200 38 20 2a 2f 0a 20 20 20 20 20 20 33 2c 20 33 2c  8 */.      3, 3,
12210 20 33 2c 20 33 2c 20 33 2c 20 33 2c 20 20 20 20   3, 3, 3, 3,    
12220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 39 2d            /* 19-
12230 32 34 20 2a 2f 0a 20 20 20 20 20 20 32 2c 20 32  24 */.      2, 2
12240 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c  , 2, 2, 2, 2, 2,
12250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 35             /* 25
12260 2d 33 31 20 2a 2f 0a 20 20 7d 3b 0a 20 20 69 66  -31 */.  };.  if
12270 28 20 61 3e 3d 62 20 29 7b 0a 20 20 20 20 69 66  ( a>=b ){.    if
12280 28 20 61 3e 62 2b 34 39 20 29 20 72 65 74 75 72  ( a>b+49 ) retur
12290 6e 20 61 3b 0a 20 20 20 20 69 66 28 20 61 3e 62  n a;.    if( a>b
122a0 2b 33 31 20 29 20 72 65 74 75 72 6e 20 61 2b 31  +31 ) return a+1
122b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 2b 78  ;.    return a+x
122c0 5b 61 2d 62 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  [a-b];.  }else{.
122d0 20 20 20 20 69 66 28 20 62 3e 61 2b 34 39 20 29      if( b>a+49 )
122e0 20 72 65 74 75 72 6e 20 62 3b 0a 20 20 20 20 69   return b;.    i
122f0 66 28 20 62 3e 61 2b 33 31 20 29 20 72 65 74 75  f( b>a+31 ) retu
12300 72 6e 20 62 2b 31 3b 0a 20 20 20 20 72 65 74 75  rn b+1;.    retu
12310 72 6e 20 62 2b 78 5b 62 2d 61 5d 3b 0a 20 20 7d  rn b+x[b-a];.  }
12320 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
12330 74 20 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 74  t an integer int
12340 6f 20 61 20 57 68 65 72 65 43 6f 73 74 2e 20 20  o a WhereCost.  
12350 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
12360 63 6f 6d 70 75 74 65 20 61 0a 2a 2a 20 67 6f 6f  compute a.** goo
12370 64 20 61 70 70 72 6f 78 69 6d 61 74 61 74 69 6f  d approximatatio
12380 6e 20 66 6f 72 20 31 30 2a 6c 6f 67 32 28 78 29  n for 10*log2(x)
12390 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
123a0 65 43 6f 73 74 20 77 68 65 72 65 43 6f 73 74 28  eCost whereCost(
123b0 74 52 6f 77 63 6e 74 20 78 29 7b 0a 20 20 73 74  tRowcnt x){.  st
123c0 61 74 69 63 20 57 68 65 72 65 43 6f 73 74 20 61  atic WhereCost a
123d0 5b 5d 20 3d 20 7b 20 30 2c 20 32 2c 20 33 2c 20  [] = { 0, 2, 3, 
123e0 35 2c 20 36 2c 20 37 2c 20 38 2c 20 39 20 7d 3b  5, 6, 7, 8, 9 };
123f0 0a 20 20 57 68 65 72 65 43 6f 73 74 20 79 20 3d  .  WhereCost y =
12400 20 34 30 3b 0a 20 20 69 66 28 20 78 3c 38 20 29   40;.  if( x<8 )
12410 7b 0a 20 20 20 20 69 66 28 20 78 3c 32 20 29 20  {.    if( x<2 ) 
12420 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68  return 0;.    wh
12430 69 6c 65 28 20 78 3c 38 20 29 7b 20 20 79 20 2d  ile( x<8 ){  y -
12440 3d 20 31 30 3b 20 78 20 3c 3c 3d 20 31 3b 20 7d  = 10; x <<= 1; }
12450 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
12460 69 6c 65 28 20 78 3e 32 35 35 20 29 7b 20 79 20  ile( x>255 ){ y 
12470 2b 3d 20 34 30 3b 20 78 20 3e 3e 3d 20 34 3b 20  += 40; x >>= 4; 
12480 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 78 3e 31  }.    while( x>1
12490 35 20 29 7b 20 20 79 20 2b 3d 20 31 30 3b 20 78  5 ){  y += 10; x
124a0 20 3e 3e 3d 20 31 3b 20 7d 0a 20 20 7d 0a 20 20   >>= 1; }.  }.  
124b0 72 65 74 75 72 6e 20 61 5b 78 26 37 5d 20 2b 20  return a[x&7] + 
124c0 79 20 2d 20 31 30 3b 0a 7d 0a 0a 23 69 66 6e 64  y - 10;.}..#ifnd
124d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
124e0 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
124f0 2a 20 43 6f 6e 76 65 72 74 20 61 20 64 6f 75 62  * Convert a doub
12500 6c 65 20 28 61 73 20 72 65 63 65 69 76 65 64 20  le (as received 
12510 66 72 6f 6d 20 78 42 65 73 74 49 6e 64 65 78 20  from xBestIndex 
12520 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  of a virtual tab
12530 6c 65 29 0a 2a 2a 20 69 6e 74 6f 20 61 20 57 68  le).** into a Wh
12540 65 72 65 43 6f 73 74 2e 20 20 49 6e 20 6f 74 68  ereCost.  In oth
12550 65 72 20 77 6f 72 64 73 2c 20 63 6f 6d 70 75 74  er words, comput
12560 65 20 61 6e 20 61 70 70 72 6f 78 69 6d 61 74 69  e an approximati
12570 6f 6e 20 66 6f 72 0a 2a 2a 20 31 30 2a 6c 6f 67  on for.** 10*log
12580 32 28 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  2(x)..*/.static 
12590 57 68 65 72 65 43 6f 73 74 20 77 68 65 72 65 43  WhereCost whereC
125a0 6f 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 64 6f  ostFromDouble(do
125b0 75 62 6c 65 20 78 29 7b 0a 20 20 75 36 34 20 61  uble x){.  u64 a
125c0 3b 0a 20 20 57 68 65 72 65 43 6f 73 74 20 65 3b  ;.  WhereCost e;
125d0 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
125e0 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f  f(x)==8 && sizeo
125f0 66 28 61 29 3d 3d 38 20 29 3b 0a 20 20 69 66 28  f(a)==8 );.  if(
12600 20 78 3c 3d 31 20 29 20 72 65 74 75 72 6e 20 30   x<=1 ) return 0
12610 3b 0a 20 20 69 66 28 20 78 3c 3d 32 30 30 30 30  ;.  if( x<=20000
12620 30 30 30 30 30 20 29 20 72 65 74 75 72 6e 20 77  00000 ) return w
12630 68 65 72 65 43 6f 73 74 28 28 74 52 6f 77 63 6e  hereCost((tRowcn
12640 74 29 78 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  t)x);.  memcpy(&
12650 61 2c 20 26 78 2c 20 38 29 3b 0a 20 20 65 20 3d  a, &x, 8);.  e =
12660 20 28 61 3e 3e 35 32 29 20 2d 20 31 30 32 32 3b   (a>>52) - 1022;
12670 0a 20 20 72 65 74 75 72 6e 20 65 2a 31 30 3b 0a  .  return e*10;.
12680 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
12690 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
126a0 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45  ABLE */../*.** E
126b0 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61  stimate the loga
126c0 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70  rithm of the inp
126d0 75 74 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65  ut value to base
126e0 20 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68   2..*/.static Wh
126f0 65 72 65 43 6f 73 74 20 65 73 74 4c 6f 67 28 57  ereCost estLog(W
12700 68 65 72 65 43 6f 73 74 20 4e 29 7b 0a 20 20 57  hereCost N){.  W
12710 68 65 72 65 43 6f 73 74 20 78 20 3d 20 77 68 65  hereCost x = whe
12720 72 65 43 6f 73 74 28 4e 29 3b 0a 20 20 72 65 74  reCost(N);.  ret
12730 75 72 6e 20 78 3e 33 33 20 3f 20 78 20 2d 20 33  urn x>33 ? x - 3
12740 33 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  3 : 0;.}../*.** 
12750 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  Two routines for
12760 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f   printing the co
12770 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69  ntent of an sqli
12780 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a  te3_index_info.*
12790 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73  * structure.  Us
127a0 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
127b0 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
127c0 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a  y.  If neither.*
127d0 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72  * SQLITE_TEST or
127e0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72   SQLITE_DEBUG ar
127f0 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  e defined, then 
12800 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a  these routines.*
12810 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f  * are no-ops..*/
12820 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
12830 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
12840 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e  LTABLE) && defin
12850 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
12860 41 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f  ABLED).static vo
12870 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  id TRACE_IDX_INP
12880 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
12890 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
128a0 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
128b0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
128c0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
128d0 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
128e0 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
128f0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
12900 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b  f("  constraint[
12910 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d  %d]: col=%d term
12920 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62  id=%d op=%d usab
12930 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  led=%d\n",.     
12940 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
12950 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43  Constraint[i].iC
12960 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d  olumn,.       p-
12970 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
12980 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20  iTermOffset,.   
12990 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
129a0 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20  nt[i].op,.      
129b0 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
129c0 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a  i].usable);.  }.
129d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
129e0 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
129f0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
12a00 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62  Printf("  orderb
12a10 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65  y[%d]: col=%d de
12a20 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  sc=%d\n",.      
12a30 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f   i,.       p->aO
12a40 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
12a50 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  n,.       p->aOr
12a60 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a  derBy[i].desc);.
12a70 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
12a80 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  d TRACE_IDX_OUTP
12a90 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
12aa0 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
12ab0 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
12ac0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
12ad0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
12ae0 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
12af0 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
12b00 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
12b10 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20  f("  usage[%d]: 
12b20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d  argvIdx=%d omit=
12b30 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
12b40 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
12b50 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61  traintUsage[i].a
12b60 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20  rgvIndex,.      
12b70 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
12b80 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20  sage[i].omit);. 
12b90 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75   }.  sqlite3Debu
12ba0 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75  gPrintf("  idxNu
12bb0 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e  m=%d\n", p->idxN
12bc0 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  um);.  sqlite3De
12bd0 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78  bugPrintf("  idx
12be0 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64  Str=%s\n", p->id
12bf0 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  xStr);.  sqlite3
12c00 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
12c10 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25  rderByConsumed=%
12c20 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79  d\n", p->orderBy
12c30 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c  Consumed);.  sql
12c40 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
12c50 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74  "  estimatedCost
12c60 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d  =%g\n", p->estim
12c70 61 74 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c  atedCost);.}.#el
12c80 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  se.#define TRACE
12c90 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23  _IDX_INPUTS(A).#
12ca0 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
12cb0 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64  _OUTPUTS(A).#end
12cc0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
12cd0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
12ce0 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65  C_INDEX./*.** Re
12cf0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
12d00 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
12d10 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61  rm pTerm is of a
12d20 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a   form where it.*
12d30 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20  * could be used 
12d40 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f  with an index to
12d50 20 61 63 63 65 73 73 20 70 53 72 63 2c 20 61 73   access pSrc, as
12d60 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70  suming an approp
12d70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65  riate.** index e
12d80 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  xisted..*/.stati
12d90 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69  c int termCanDri
12da0 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65  veIndex(.  Where
12db0 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20  Term *pTerm,    
12dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
12dd0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  RE clause term t
12de0 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72  o check */.  str
12df0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
12e00 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54   *pSrc,     /* T
12e10 61 62 6c 65 20 77 65 20 61 72 65 20 74 72 79 69  able we are tryi
12e20 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a  ng to access */.
12e30 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
12e40 64 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dy              
12e50 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75   /* Tables in ou
12e60 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65  ter loops of the
12e70 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68   join */.){.  ch
12e80 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54  ar aff;.  if( pT
12e90 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  erm->leftCursor!
12ea0 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
12eb0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
12ec0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
12ed0 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29  or & WO_EQ)==0 )
12ee0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
12ef0 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
12f00 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
12f10 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
12f20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c    if( pTerm->u.l
12f30 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  eftColumn<0 ) re
12f40 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20  turn 0;.  aff = 
12f50 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  pSrc->pTab->aCol
12f60 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  [pTerm->u.leftCo
12f70 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
12f80 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
12f90 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54  dexAffinityOk(pT
12fa0 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29  erm->pExpr, aff)
12fb0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
12fc0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
12fd0 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f...#ifndef SQLI
12fe0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
12ff0 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65  C_INDEX./*.** Ge
13000 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63  nerate code to c
13010 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64  onstruct the Ind
13020 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e  ex object for an
13030 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
13040 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75  .** and to set u
13050 70 20 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c  p the WhereLevel
13060 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73   object pLevel s
13070 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  o that the code 
13080 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b  generator.** mak
13090 65 73 20 75 73 65 20 6f 66 20 74 68 65 20 61 75  es use of the au
130a0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a  tomatic index..*
130b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
130c0 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63  nstructAutomatic
130d0 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
130e0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
130f0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
13100 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
13110 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
13120 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C,           /* 
13130 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
13140 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
13150 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
13160 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
13170 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74  ause term to get
13180 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20   the next index 
13190 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
131a0 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20  Ready,          
131b0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73   /* Mask of curs
131c0 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
131d0 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
131e0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
131f0 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  el          /* W
13200 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68  rite new index h
13210 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
13220 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  nColumn;        
13230 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
13240 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
13250 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20  the constructed 
13260 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65  index */.  Where
13270 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
13280 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
13290 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  le term of the W
132a0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
132b0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45   WhereTerm *pWCE
132c0 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nd;          /* 
132d0 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20  End of pWC->a[] 
132e0 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
132f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13300 20 2f 2a 20 42 79 74 65 20 6f 66 20 6d 65 6d 6f   /* Byte of memo
13310 72 79 20 6e 65 65 64 65 64 20 66 6f 72 20 70 49  ry needed for pI
13320 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  dx */.  Index *p
13330 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
13340 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65      /* Object de
13350 73 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61  scribing the tra
13360 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a  nsient index */.
13370 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
13380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13390 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   Prepared statem
133a0 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ent under constr
133b0 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
133c0 61 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20  addrInit;       
133d0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
133e0 73 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61  ss of the initia
133f0 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20  lization bypass 
13400 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20  jump */.  Table 
13410 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  *pTable;        
13420 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
13430 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  le being indexed
13440 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
13450 4b 65 79 69 6e 66 6f 3b 20 20 20 20 20 20 20 20  Keyinfo;        
13460 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61    /* Key informa
13470 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 69 6e 64  tion for the ind
13480 65 78 20 2a 2f 20 20 20 0a 20 20 69 6e 74 20 61  ex */   .  int a
13490 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20  ddrTop;         
134a0 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
134b0 20 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20   the index fill 
134c0 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65  loop */.  int re
134d0 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20  gRecord;        
134e0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
134f0 72 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64  r holding an ind
13500 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  ex record */.  i
13510 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
13520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
13530 6c 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  lumn counter */.
13540 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
13550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13560 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
13570 0a 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b  .  int mxBitCol;
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13590 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e  * Maximum column
135a0 20 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65   in pSrc->colUse
135b0 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  d */.  CollSeq *
135c0 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
135d0 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
135e0 73 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61  sequence to on a
135f0 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65   column */.  Whe
13600 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20  reLoop *pLoop;  
13610 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13620 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Loop object */. 
13630 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73   Bitmask idxCols
13640 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
13650 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e  Bitmap of column
13660 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78  s used for index
13670 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ing */.  Bitmask
13680 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20   extraCols;     
13690 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f       /* Bitmap o
136a0 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  f additional col
136b0 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e  umns */.  u8 sen
136c0 74 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20  tWarning = 0;   
136d0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
136e0 20 61 20 77 61 72 6e 6e 69 6e 67 20 68 61 73 20   a warnning has 
136f0 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 0a  been issued */..
13700 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
13710 64 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20  de to skip over 
13720 74 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64  the creation and
13730 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
13740 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e  of the.  ** tran
13750 73 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32  sient index on 2
13760 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
13770 74 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20  t iterations of 
13780 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76  the loop. */.  v
13790 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
137a0 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
137b0 20 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d   );.  addrInit =
137c0 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
137d0 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20  (pParse);..  /* 
137e0 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
137f0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
13800 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
13810 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  o the index.  **
13820 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74   and used to mat
13830 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ch WHERE clause 
13840 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
13850 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20   nColumn = 0;.  
13860 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70  pTable = pSrc->p
13870 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20  Tab;.  pWCEnd = 
13880 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65  &pWC->a[pWC->nTe
13890 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70  rm];.  pLoop = p
138a0 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
138b0 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20   idxCols = 0;.  
138c0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
138d0 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  ; pTerm<pWCEnd; 
138e0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
138f0 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
13900 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
13910 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20   notReady) ){.  
13920 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
13930 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
13940 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  mn;.      Bitmas
13950 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d  k cMask = iCol>=
13960 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d  BMS ? MASKBIT(BM
13970 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69  S-1) : MASKBIT(i
13980 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Col);.      test
13990 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20  case( iCol==BMS 
139a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
139b0 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e( iCol==BMS-1 )
139c0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 65 6e  ;.      if( !sen
139d0 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20  tWarning ){.    
139e0 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
139f0 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41  SQLITE_WARNING_A
13a00 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20  UTOINDEX,.      
13a10 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63        "automatic
13a20 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29   index on %s(%s)
13a30 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
13a40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54  ,.            pT
13a50 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  able->aCol[iCol]
13a60 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
13a70 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31   sentWarning = 1
13a80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13a90 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
13aa0 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
13ab0 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
13ac0 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e  pResize(pParse->
13ad0 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 43 6f 6c 75  db, pLoop, nColu
13ae0 6d 6e 2b 31 29 20 29 20 72 65 74 75 72 6e 3b 0a  mn+1) ) return;.
13af0 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61          pLoop->a
13b00 4c 54 65 72 6d 5b 6e 43 6f 6c 75 6d 6e 2b 2b 5d  LTerm[nColumn++]
13b10 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
13b20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61    idxCols |= cMa
13b30 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sk;.      }.    
13b40 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
13b50 6e 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70  nColumn>0 );.  p
13b60 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
13b70 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72  q = pLoop->nLTer
13b80 6d 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70  m = nColumn;.  p
13b90 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
13ba0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
13bb0 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  | WHERE_IDX_ONLY
13bc0 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   | WHERE_INDEXED
13bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13be0 20 20 20 20 20 20 7c 20 57 48 45 52 45 5f 41 55        | WHERE_AU
13bf0 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20  TO_INDEX;..  /* 
13c00 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
13c10 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
13c20 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f  olumns needed to
13c30 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63   create a.  ** c
13c40 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20  overing index.  
13c50 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  A "covering inde
13c60 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74  x" is an index t
13c70 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  hat contains all
13c80 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68  .  ** columns th
13c90 61 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79  at are needed by
13ca0 20 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74   the query.  Wit
13cb0 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  h a covering ind
13cc0 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69  ex, the.  ** ori
13cd0 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65  ginal table neve
13ce0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63  r needs to be ac
13cf0 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74  cessed.  Automat
13d00 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a  ic indices must.
13d10 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69    ** be a coveri
13d20 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65  ng index because
13d30 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20   the index will 
13d40 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69  not be updated i
13d50 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69  f the.  ** origi
13d60 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65  nal table change
13d70 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  s and the index 
13d80 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74  and table cannot
13d90 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20   both be used.  
13da0 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75  ** if they go ou
13db0 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a  t of sync..  */.
13dc0 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53    extraCols = pS
13dd0 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e  rc->colUsed & (~
13de0 69 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49  idxCols | MASKBI
13df0 54 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42  T(BMS-1));.  mxB
13e00 69 74 43 6f 6c 20 3d 20 28 70 54 61 62 6c 65 2d  itCol = (pTable-
13e10 3e 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29 20  >nCol >= BMS-1) 
13e20 3f 20 42 4d 53 2d 31 20 3a 20 70 54 61 62 6c 65  ? BMS-1 : pTable
13e30 2d 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73 74 63 61  ->nCol;.  testca
13e40 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  se( pTable->nCol
13e50 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73  ==BMS-1 );.  tes
13e60 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e  tcase( pTable->n
13e70 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  Col==BMS-2 );.  
13e80 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74  for(i=0; i<mxBit
13e90 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
13ea0 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d  f( extraCols & M
13eb0 41 53 4b 42 49 54 28 69 29 20 29 20 6e 43 6f 6c  ASKBIT(i) ) nCol
13ec0 75 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  umn++;.  }.  if(
13ed0 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
13ee0 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
13ef0 29 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 2b  ){.    nColumn +
13f00 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d  = pTable->nCol -
13f10 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 20 20   BMS + 1;.  }.  
13f20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c  pLoop->wsFlags |
13f30 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
13f40 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  Q | WHERE_IDX_ON
13f50 4c 59 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72  LY;..  /* Constr
13f60 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62  uct the Index ob
13f70 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69 62 65  ject to describe
13f80 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20   this index */. 
13f90 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
13fa0 49 6e 64 65 78 29 3b 0a 20 20 6e 42 79 74 65 20  Index);.  nByte 
13fb0 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f  += nColumn*sizeo
13fc0 66 28 69 6e 74 29 3b 20 20 20 20 20 2f 2a 20 49  f(int);     /* I
13fd0 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 2a 2f  ndex.aiColumn */
13fe0 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c  .  nByte += nCol
13ff0 75 6d 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a  umn*sizeof(char*
14000 29 3b 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a  );   /* Index.az
14010 43 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79 74 65 20  Coll */.  nByte 
14020 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  += nColumn;     
14030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14040 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20  ndex.aSortOrder 
14050 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69  */.  pIdx = sqli
14060 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
14070 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74  pParse->db, nByt
14080 65 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d  e);.  if( pIdx==
14090 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c  0 ) return;.  pL
140a0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
140b0 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49  dex = pIdx;.  pI
140c0 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68  dx->azColl = (ch
140d0 61 72 2a 2a 29 26 70 49 64 78 5b 31 5d 3b 0a 20  ar**)&pIdx[1];. 
140e0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20   pIdx->aiColumn 
140f0 3d 20 28 69 6e 74 2a 29 26 70 49 64 78 2d 3e 61  = (int*)&pIdx->a
14100 7a 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a  zColl[nColumn];.
14110 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64    pIdx->aSortOrd
14120 65 72 20 3d 20 28 75 38 2a 29 26 70 49 64 78 2d  er = (u8*)&pIdx-
14130 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d  >aiColumn[nColum
14140 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d  n];.  pIdx->zNam
14150 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22  e = "auto-index"
14160 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ;.  pIdx->nColum
14170 6e 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70  n = nColumn;.  p
14180 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  Idx->pTable = pT
14190 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  able;.  n = 0;. 
141a0 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20   idxCols = 0;.  
141b0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
141c0 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  ; pTerm<pWCEnd; 
141d0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
141e0 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
141f0 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
14200 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20   notReady) ){.  
14210 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
14220 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
14230 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  mn;.      Bitmas
14240 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d  k cMask = iCol>=
14250 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d  BMS ? MASKBIT(BM
14260 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69  S-1) : MASKBIT(i
14270 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Col);.      test
14280 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d  case( iCol==BMS-
14290 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
142a0 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29  ase( iCol==BMS )
142b0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78  ;.      if( (idx
142c0 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30  Cols & cMask)==0
142d0 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
142e0 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pX = pTerm->pE
142f0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64 78  xpr;.        idx
14300 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20  Cols |= cMask;. 
14310 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43         pIdx->aiC
14320 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d  olumn[n] = pTerm
14330 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
14340 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
14350 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
14360 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
14370 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70  se, pX->pLeft, p
14380 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
14390 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
143a0 5b 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70 43 6f  [n] = ALWAYS(pCo
143b0 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  ll) ? pColl->zNa
143c0 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20  me : "BINARY";. 
143d0 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20         n++;.    
143e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
143f0 61 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d  assert( (u32)n==
14400 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
14410 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  Eq );..  /* Add 
14420 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
14430 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b  ns needed to mak
14440 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
14450 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20  index into.  ** 
14460 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
14470 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
14480 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b  <mxBitCol; i++){
14490 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f  .    if( extraCo
144a0 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20  ls & MASKBIT(i) 
144b0 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  ){.      pIdx->a
144c0 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a  iColumn[n] = i;.
144d0 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
144e0 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22  ll[n] = "BINARY"
144f0 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  ;.      n++;.   
14500 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72   }.  }.  if( pSr
14510 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53  c->colUsed & MAS
14520 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20  KBIT(BMS-1) ){. 
14530 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20     for(i=BMS-1; 
14540 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
14550 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78  i++){.      pIdx
14560 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
14570 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  i;.      pIdx->a
14580 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41  zColl[n] = "BINA
14590 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a  RY";.      n++;.
145a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
145b0 72 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20 29  rt( n==nColumn )
145c0 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  ;..  /* Create t
145d0 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
145e0 65 78 20 2a 2f 0a 20 20 70 4b 65 79 69 6e 66 6f  ex */.  pKeyinfo
145f0 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   = sqlite3IndexK
14600 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
14610 49 64 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Idx);.  assert( 
14620 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e  pLevel->iIdxCur>
14630 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e  =0 );.  pLevel->
14640 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65  iIdxCur = pParse
14650 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69  ->nTab++;.  sqli
14660 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
14670 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65   OP_OpenAutoinde
14680 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  x, pLevel->iIdxC
14690 75 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30  ur, nColumn+1, 0
146a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
146b0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
146c0 79 69 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yinfo, P4_KEYINF
146d0 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 56 64  O_HANDOFF);.  Vd
146e0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
146f0 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e  or %s", pTable->
14700 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46  zName));..  /* F
14710 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ill the automati
14720 63 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e  c index with con
14730 74 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f  tent */.  addrTo
14740 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
14750 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
14760 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  nd, pLevel->iTab
14770 43 75 72 29 3b 0a 20 20 72 65 67 52 65 63 6f 72  Cur);.  regRecor
14780 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
14790 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
147a0 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
147b0 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
147c0 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69   pIdx, pLevel->i
147d0 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72  TabCur, regRecor
147e0 64 2c 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69  d, 1, 0);.  sqli
147f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14800 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
14810 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20  Level->iIdxCur, 
14820 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
14830 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
14840 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
14850 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71  EEKRESULT);.  sq
14860 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14870 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76  v, OP_Next, pLev
14880 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64  el->iTabCur, add
14890 72 54 6f 70 2b 31 29 3b 0a 20 20 73 71 6c 69 74  rTop+1);.  sqlit
148a0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
148b0 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
148c0 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a  TUS_AUTOINDEX);.
148d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
148e0 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
148f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
14900 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
14910 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
14920 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65   .  /* Jump here
14930 20 77 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74   when skipping t
14940 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
14950 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  n */.  sqlite3Vd
14960 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
14970 64 72 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69  drInit);.}.#endi
14980 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
14990 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
149a0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
149b0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
149c0 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  TABLE./*.** Allo
149d0 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  cate and populat
149e0 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  e an sqlite3_ind
149f0 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
14a00 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  e. It is the .**
14a10 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
14a20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
14a30 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
14a40 61 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ase the structur
14a50 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20  e.** by passing 
14a60 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  the pointer retu
14a70 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
14a80 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33  ction to sqlite3
14a90 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
14aa0 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ic sqlite3_index
14ab0 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49  _info *allocateI
14ac0 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73  ndexInfo(.  Pars
14ad0 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65  e *pParse,.  Whe
14ae0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20  reClause *pWC,. 
14af0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
14b00 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78  item *pSrc,.  Ex
14b10 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
14b20 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
14b30 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73    int nTerm;.  s
14b40 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
14b50 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
14b60 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
14b70 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
14b80 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72  _orderby *pIdxOr
14b90 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20  derBy;.  struct 
14ba0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
14bb0 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
14bc0 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54  pUsage;.  WhereT
14bd0 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e  erm *pTerm;.  in
14be0 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71  t nOrderBy;.  sq
14bf0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
14c00 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f   *pIdxInfo;..  /
14c10 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
14c20 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57  er of possible W
14c30 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
14c40 74 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e  traints referrin
14c50 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76  g.  ** to this v
14c60 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
14c70 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c    for(i=nTerm=0,
14c80 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
14c90 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
14ca0 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
14cb0 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
14cc0 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
14cd0 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
14ce0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49  e;.    assert( I
14cf0 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72  sPowerOfTwo(pTer
14d00 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
14d10 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20  WO_EQUIV) );.   
14d20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
14d30 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
14d40 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
14d50 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
14d60 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
14d70 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  L );.    if( pTe
14d80 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
14d90 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f  (WO_ISNULL) ) co
14da0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
14db0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
14dc0 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
14dd0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72  ntinue;.    nTer
14de0 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  m++;.  }..  /* I
14df0 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
14e00 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f  lause contains o
14e10 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  nly columns in t
14e20 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a  he current .  **
14e30 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
14e40 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  hen allocate spa
14e50 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65  ce for the aOrde
14e60 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a  rBy part of.  **
14e70 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
14e80 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
14e90 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72  e..  */.  nOrder
14ea0 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f  By = 0;.  if( pO
14eb0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e  rderBy ){.    in
14ec0 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  t n = pOrderBy->
14ed0 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
14ee0 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
14ef0 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
14f00 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
14f10 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
14f20 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
14f30 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72  _COLUMN || pExpr
14f40 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e  ->iTable!=pSrc->
14f50 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b  iCursor ) break;
14f60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
14f70 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64  ==n){.      nOrd
14f80 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a  erBy = n;.    }.
14f90 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
14fa0 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  te the sqlite3_i
14fb0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
14fc0 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49  ure.  */.  pIdxI
14fd0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
14fe0 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
14ff0 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49  ->db, sizeof(*pI
15000 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20  dxInfo).        
15010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15020 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49     + (sizeof(*pI
15030 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66  dxCons) + sizeof
15040 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d  (*pUsage))*nTerm
15050 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15060 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69              + si
15070 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42  zeof(*pIdxOrderB
15080 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20  y)*nOrderBy );. 
15090 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
150a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
150b0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
150c0 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29  "out of memory")
150d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
150e0 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
150f0 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75  lize the structu
15100 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  re.  The sqlite3
15110 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
15120 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20  cture contains. 
15130 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20   ** many fields 
15140 74 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65  that are declare
15150 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65  d "const" to pre
15160 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20  vent xBestIndex 
15170 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69  from.  ** changi
15180 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76  ng them.  We hav
15190 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e  e to do some fun
151a0 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72  ky casting in or
151b0 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74  der to.  ** init
151c0 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65  ialize those fie
151d0 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78  lds..  */.  pIdx
151e0 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73  Cons = (struct s
151f0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
15200 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e  straint*)&pIdxIn
15210 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64  fo[1];.  pIdxOrd
15220 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73  erBy = (struct s
15230 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
15240 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b  erby*)&pIdxCons[
15250 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65  nTerm];.  pUsage
15260 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
15270 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
15280 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78  int_usage*)&pIdx
15290 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79  OrderBy[nOrderBy
152a0 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  ];.  *(int*)&pId
152b0 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
152c0 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28  nt = nTerm;.  *(
152d0 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
152e0 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65  nOrderBy = nOrde
152f0 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  rBy;.  *(struct 
15300 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
15310 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
15320 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
15330 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20  t = pIdxCons;.  
15340 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
15350 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a  _index_orderby**
15360 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64  )&pIdxInfo->aOrd
15370 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72  erBy = pIdxOrder
15380 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
15390 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
153a0 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29  straint_usage**)
153b0 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
153c0 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20  traintUsage =.  
153d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15410 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28   pUsage;..  for(
15420 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  i=j=0, pTerm=pWC
15430 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
15440 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
15450 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20  {.    u8 op;.   
15460 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
15470 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e  Cursor != pSrc->
15480 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e  iCursor ) contin
15490 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
154a0 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65  IsPowerOfTwo(pTe
154b0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
154c0 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20  ~WO_EQUIV) );.  
154d0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
154e0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
154f0 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IN );.    test
15500 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
15510 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
15520 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  LL );.    if( pT
15530 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
15540 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63   (WO_ISNULL) ) c
15550 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
15560 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
15570 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63  & TERM_VNULL ) c
15580 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64  ontinue;.    pId
15590 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e  xCons[j].iColumn
155a0 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
155b0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78  Column;.    pIdx
155c0 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66  Cons[j].iTermOff
155d0 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20  set = i;.    op 
155e0 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70  = (u8)pTerm->eOp
155f0 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b  erator & WO_ALL;
15600 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f  .    if( op==WO_
15610 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b  IN ) op = WO_EQ;
15620 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
15630 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a  .op = op;.    /*
15640 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69   The direct assi
15650 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72  gnment in the pr
15660 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70  evious line is p
15670 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63  ossible only bec
15680 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  ause.    ** the 
15690 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49  WO_ and SQLITE_I
156a0 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
156b0 20 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74   codes are ident
156c0 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a  ical.  The.    *
156d0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  * following asse
156e0 72 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20  rts verify this 
156f0 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73  fact. */.    ass
15700 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49  ert( WO_EQ==SQLI
15710 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
15720 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73  INT_EQ );.    as
15730 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c  sert( WO_LT==SQL
15740 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
15750 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61  AINT_LT );.    a
15760 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51  ssert( WO_LE==SQ
15770 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
15780 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20  RAINT_LE );.    
15790 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53  assert( WO_GT==S
157a0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
157b0 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20  TRAINT_GT );.   
157c0 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d   assert( WO_GE==
157d0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
157e0 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20  STRAINT_GE );.  
157f0 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54    assert( WO_MAT
15800 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  CH==SQLITE_INDEX
15810 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43  _CONSTRAINT_MATC
15820 48 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  H );.    assert(
15830 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
15840 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51  r & (WO_IN|WO_EQ
15850 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f  |WO_LT|WO_LE|WO_
15860 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43  GT|WO_GE|WO_MATC
15870 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20  H) );.    j++;. 
15880 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
15890 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
158a0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
158b0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
158c0 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78  .pExpr;.    pIdx
158d0 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75  OrderBy[i].iColu
158e0 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
158f0 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64  umn;.    pIdxOrd
15900 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70  erBy[i].desc = p
15910 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
15920 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  rtOrder;.  }..  
15930 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b  return pIdxInfo;
15940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61  .}../*.** The ta
15950 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72  ble object refer
15960 65 6e 63 65 20 70 61 73 73 65 64 20 61 73 20 74  ence passed as t
15970 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
15980 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
15990 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72  ion.** must repr
159a0 65 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20  esent a virtual 
159b0 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63  table. This func
159c0 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65  tion invokes the
159d0 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a   xBestIndex().**
159e0 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76   method of the v
159f0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74  irtual table wit
15a00 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  h the sqlite3_in
15a10 64 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20  dex_info object 
15a20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e  that.** comes in
15a30 20 61 73 20 74 68 65 20 33 72 64 20 61 72 67 75   as the 3rd argu
15a40 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
15a50 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
15a60 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
15a70 20 70 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c   pParse is popul
15a80 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72  ated with an err
15a90 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61  or message and a
15aa0 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  .** non-zero val
15ab0 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ue is returned. 
15ac0 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20  Otherwise, 0 is 
15ad0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
15ae0 20 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20   output.** part 
15af0 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  of the sqlite3_i
15b00 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
15b10 75 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75  ure is left popu
15b20 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  lated..**.** Whe
15b30 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65  ther or not an e
15b40 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
15b50 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70  , it is the resp
15b60 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
15b70 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65  e.** caller to e
15b80 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70  ventually free p
15b90 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e  ->idxStr if p->n
15ba0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
15bb0 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61  indicates.** tha
15bc0 74 20 74 68 69 73 20 69 73 20 72 65 71 75 69 72  t this is requir
15bd0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
15be0 74 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28  t vtabBestIndex(
15bf0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
15c00 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69  able *pTab, sqli
15c10 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
15c20 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  p){.  sqlite3_vt
15c30 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69  ab *pVtab = sqli
15c40 74 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61  te3GetVTable(pPa
15c50 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e  rse->db, pTab)->
15c60 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVtab;.  int i;.
15c70 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41    int rc;..  TRA
15c80 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29  CE_IDX_INPUTS(p)
15c90 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e  ;.  rc = pVtab->
15ca0 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e  pModule->xBestIn
15cb0 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20  dex(pVtab, p);. 
15cc0 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
15cd0 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63  TS(p);..  if( rc
15ce0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15cf0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15d00 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  E_NOMEM ){.     
15d10 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
15d20 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
15d30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56     }else if( !pV
15d40 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  tab->zErrMsg ){.
15d50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
15d60 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
15d70 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  s", sqlite3ErrSt
15d80 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73  r(rc));.    }els
15d90 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
15da0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15db0 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45   "%s", pVtab->zE
15dc0 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20  rrMsg);.    }.  
15dd0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
15de0 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
15df0 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ;.  pVtab->zErrM
15e00 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69  sg = 0;..  for(i
15e10 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
15e20 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
15e30 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61  if( !p->aConstra
15e40 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26  int[i].usable &&
15e50 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
15e60 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
15e70 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  x>0 ){.      sql
15e80 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15e90 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
15ea0 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74  "table %s: xBest
15eb0 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61  Index returned a
15ec0 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c  n invalid plan",
15ed0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
15ee0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
15ef0 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b  rn pParse->nErr;
15f00 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
15f10 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
15f20 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
15f30 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  */...#ifdef SQLI
15f40 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
15f50 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
15f60 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61  he location of a
15f70 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20   particular key 
15f80 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69  among all keys i
15f90 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20  n an.** index.  
15fa0 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
15fb0 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f  s in aStat as fo
15fc0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
15fd0 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73  aStat[0]      Es
15fe0 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  t. number of row
15ff0 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61 6c  s less than pVal
16000 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20  .**    aStat[1] 
16010 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72       Est. number
16020 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74   of rows equal t
16030 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74  o pVal.**.** Ret
16040 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
16050 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61   success..*/.sta
16060 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79  tic int whereKey
16070 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a  Stats(.  Parse *
16080 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
16090 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
160a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
160b0 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
160c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
160d0 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65  Index to conside
160e0 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20  r domain of */. 
160f0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
16100 70 56 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  pVal,        /* 
16110 56 61 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64 65  Value to conside
16120 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64  r */.  int round
16130 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Up,             
16140 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69     /* Round up i
16150 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64  f true.  Round d
16160 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a  own if false */.
16170 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74    tRowcnt *aStat
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16190 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74   OUT: stats writ
161a0 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
161b0 20 74 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 49 6e   tRowcnt n;.  In
161c0 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70  dexSample *aSamp
161d0 6c 65 3b 0a 20 20 69 6e 74 20 69 2c 20 65 54 79  le;.  int i, eTy
161e0 70 65 3b 0a 20 20 69 6e 74 20 69 73 45 71 20 3d  pe;.  int isEq =
161f0 20 30 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 64   0;.  i64 v;.  d
16200 6f 75 62 6c 65 20 72 2c 20 72 53 3b 0a 0a 20 20  ouble r, rS;..  
16210 61 73 73 65 72 74 28 20 72 6f 75 6e 64 55 70 3d  assert( roundUp=
16220 3d 30 20 7c 7c 20 72 6f 75 6e 64 55 70 3d 3d 31  =0 || roundUp==1
16230 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
16240 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b  dx->nSample>0 );
16250 0a 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 29  .  if( pVal==0 )
16260 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
16270 52 52 4f 52 3b 0a 20 20 6e 20 3d 20 70 49 64 78  RROR;.  n = pIdx
16280 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20  ->aiRowEst[0];. 
16290 20 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d   aSample = pIdx-
162a0 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 65 54 79 70  >aSample;.  eTyp
162b0 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
162c0 65 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a 20  e_type(pVal);.. 
162d0 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
162e0 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TE_INTEGER ){.  
162f0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    v = sqlite3_va
16300 6c 75 65 5f 69 6e 74 36 34 28 70 56 61 6c 29 3b  lue_int64(pVal);
16310 0a 20 20 20 20 72 20 3d 20 28 69 36 34 29 76 3b  .    r = (i64)v;
16320 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
16330 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69  pIdx->nSample; i
16340 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
16350 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d  Sample[i].eType=
16360 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63  =SQLITE_NULL ) c
16370 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
16380 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  f( aSample[i].eT
16390 79 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype>=SQLITE_TEXT
163a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
163b0 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  if( aSample[i].e
163c0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  Type==SQLITE_INT
163d0 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
163e0 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  if( aSample[i].u
163f0 2e 69 3e 3d 76 20 29 7b 0a 20 20 20 20 20 20 20  .i>=v ){.       
16400 20 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c     isEq = aSampl
16410 65 5b 69 5d 2e 75 2e 69 3d 3d 76 3b 0a 20 20 20  e[i].u.i==v;.   
16420 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
16430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
16440 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
16450 65 72 74 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ert( aSample[i].
16460 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c  eType==SQLITE_FL
16470 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69  OAT );.        i
16480 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e  f( aSample[i].u.
16490 72 3e 3d 72 20 29 7b 0a 20 20 20 20 20 20 20 20  r>=r ){.        
164a0 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65    isEq = aSample
164b0 5b 69 5d 2e 75 2e 72 3d 3d 72 3b 0a 20 20 20 20  [i].u.r==r;.    
164c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
164d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
164e0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
164f0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46   eType==SQLITE_F
16500 4c 4f 41 54 20 29 7b 0a 20 20 20 20 72 20 3d 20  LOAT ){.    r = 
16510 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
16520 75 62 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20 20  uble(pVal);.    
16530 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
16540 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  >nSample; i++){.
16550 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
16560 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49  e[i].eType==SQLI
16570 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  TE_NULL ) contin
16580 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53  ue;.      if( aS
16590 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d  ample[i].eType>=
165a0 53 51 4c 49 54 45 5f 54 45 58 54 20 29 20 62 72  SQLITE_TEXT ) br
165b0 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 61  eak;.      if( a
165c0 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d  Sample[i].eType=
165d0 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b  =SQLITE_FLOAT ){
165e0 0a 20 20 20 20 20 20 20 20 72 53 20 3d 20 61 53  .        rS = aS
165f0 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3b 0a 20 20  ample[i].u.r;.  
16600 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16610 20 20 20 72 53 20 3d 20 61 53 61 6d 70 6c 65 5b     rS = aSample[
16620 69 5d 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a  i].u.i;.      }.
16630 20 20 20 20 20 20 69 66 28 20 72 53 3e 3d 72 20        if( rS>=r 
16640 29 7b 0a 20 20 20 20 20 20 20 20 69 73 45 71 20  ){.        isEq 
16650 3d 20 72 53 3d 3d 72 3b 0a 20 20 20 20 20 20 20  = rS==r;.       
16660 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
16670 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
16680 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
16690 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 20 3d 20  NULL ){.    i = 
166a0 30 3b 0a 20 20 20 20 69 66 28 20 61 53 61 6d 70  0;.    if( aSamp
166b0 6c 65 5b 30 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[0].eType==SQL
166c0 49 54 45 5f 4e 55 4c 4c 20 29 20 69 73 45 71 20  ITE_NULL ) isEq 
166d0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
166e0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
166f0 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20  =SQLITE_TEXT || 
16700 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c  eType==SQLITE_BL
16710 4f 42 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  OB );.    for(i=
16720 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70  0; i<pIdx->nSamp
16730 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  le; i++){.      
16740 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  if( aSample[i].e
16750 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58  Type==SQLITE_TEX
16760 54 20 7c 7c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  T || aSample[i].
16770 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c  eType==SQLITE_BL
16780 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  OB ){.        br
16790 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
167a0 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 49 64   }.    if( i<pId
167b0 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 20 20 20  x->nSample ){   
167c0 20 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65     .      sqlite
167d0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
167e0 64 62 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  db;.      CollSe
167f0 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
16800 63 6f 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20 20  const u8 *z;.   
16810 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51     if( eType==SQ
16820 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20  LITE_BLOB ){.   
16830 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20       z = (const 
16840 75 38 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  u8 *)sqlite3_val
16850 75 65 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a 20  ue_blob(pVal);. 
16860 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64         pColl = d
16870 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
16880 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
16890 6f 6c 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  oll->enc==SQLITE
168a0 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 20 20 7d  _UTF8 );.      }
168b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
168c0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
168d0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
168e0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
168f0 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a  *pIdx->azColl);.
16900 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
16910 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
16920 65 6e 63 65 20 77 61 73 20 75 6e 61 76 61 69 6c  ence was unavail
16930 61 62 6c 65 2c 20 77 65 20 73 68 6f 75 6c 64 20  able, we should 
16940 68 61 76 65 20 66 61 69 6c 65 64 0a 20 20 20 20  have failed.    
16950 20 20 20 20 2a 2a 20 6c 6f 6e 67 20 61 67 6f 20      ** long ago 
16960 61 6e 64 20 6e 65 76 65 72 20 72 65 61 63 68 65  and never reache
16970 64 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 20 42  d this point.  B
16980 75 74 20 77 65 27 6c 6c 20 63 68 65 63 6b 20 6a  ut we'll check j
16990 75 73 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  ust to.        *
169a0 2a 20 62 65 20 64 6f 75 62 6c 79 20 73 75 72 65  * be doubly sure
169b0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
169c0 20 4e 45 56 45 52 28 70 43 6f 6c 6c 3d 3d 30 29   NEVER(pColl==0)
169d0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
169e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
169f0 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a 29  z = (const u8 *)
16a00 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
16a10 28 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e  (pVal, pColl->en
16a20 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
16a30 21 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  !z ){.          
16a40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
16a50 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  MEM;.        }. 
16a60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
16a70 20 26 26 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f   && pColl && pCo
16a80 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 20 20 20 20  ll->xCmp );.    
16a90 20 20 7d 0a 20 20 20 20 20 20 6e 20 3d 20 73 71    }.      n = sq
16aa0 6c 69 74 65 33 56 61 6c 75 65 42 79 74 65 73 28  lite3ValueBytes(
16ab0 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  pVal, pColl->enc
16ac0 29 3b 0a 20 20 0a 20 20 20 20 20 20 66 6f 72 28  );.  .      for(
16ad0 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ; i<pIdx->nSampl
16ae0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
16af0 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20   int c;.        
16b00 69 6e 74 20 65 53 61 6d 70 6c 65 74 79 70 65 20  int eSampletype 
16b10 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  = aSample[i].eTy
16b20 70 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pe;.        if( 
16b30 65 53 61 6d 70 6c 65 74 79 70 65 3c 65 54 79 70  eSampletype<eTyp
16b40 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
16b50 20 20 20 20 20 20 69 66 28 20 65 53 61 6d 70 6c        if( eSampl
16b60 65 74 79 70 65 21 3d 65 54 79 70 65 20 29 20 62  etype!=eType ) b
16b70 72 65 61 6b 3b 0a 23 69 66 6e 64 65 66 20 53 51  reak;.#ifndef SQ
16b80 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
16b90 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
16ba0 6c 2d 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55  l->enc!=SQLITE_U
16bb0 54 46 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20  TF8 ){.         
16bc0 20 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 0a 20 20   int nSample;.  
16bd0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53          char *zS
16be0 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 55  ample = sqlite3U
16bf0 74 66 38 74 6f 31 36 28 0a 20 20 20 20 20 20 20  tf8to16(.       
16c00 20 20 20 20 20 20 20 64 62 2c 20 70 43 6f 6c 6c         db, pColl
16c10 2d 3e 65 6e 63 2c 20 61 53 61 6d 70 6c 65 5b 69  ->enc, aSample[i
16c20 5d 2e 75 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b 69  ].u.z, aSample[i
16c30 5d 2e 6e 42 79 74 65 2c 20 26 6e 53 61 6d 70 6c  ].nByte, &nSampl
16c40 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  e.          );. 
16c50 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 53           if( !zS
16c60 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  ample ){.       
16c70 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
16c80 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
16c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
16ca0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
16cb0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
16cc0 20 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f 6c          c = pCol
16cd0 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70  l->xCmp(pColl->p
16ce0 55 73 65 72 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a  User, nSample, z
16cf0 53 61 6d 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20  Sample, n, z);. 
16d00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16d10 44 62 46 72 65 65 28 64 62 2c 20 7a 53 61 6d 70  DbFree(db, zSamp
16d20 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  le);.        }el
16d30 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
16d40 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20    {.          c 
16d50 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  = pColl->xCmp(pC
16d60 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 61 53 61 6d  oll->pUser, aSam
16d70 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 61 53  ple[i].nByte, aS
16d80 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c  ample[i].u.z, n,
16d90 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   z);.        }. 
16da0 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d 30 20         if( c>=0 
16db0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
16dc0 20 63 3d 3d 30 20 29 20 69 73 45 71 20 3d 20 31   c==0 ) isEq = 1
16dd0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
16de0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
16df0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
16e00 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
16e10 6e 74 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69  nt, aSample[i] i
16e20 73 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70  s the first samp
16e30 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74  le that is great
16e40 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 6f 72 20  er than.  ** or 
16e50 65 71 75 61 6c 20 74 6f 20 70 56 61 6c 2e 20 20  equal to pVal.  
16e60 4f 72 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e  Or if i==pIdx->n
16e70 53 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 6c 6c  Sample, then all
16e80 20 73 61 6d 70 6c 65 73 20 61 72 65 20 6c 65 73   samples are les
16e90 73 0a 20 20 2a 2a 20 74 68 61 6e 20 70 56 61 6c  s.  ** than pVal
16ea0 2e 20 20 49 66 20 61 53 61 6d 70 6c 65 5b 69 5d  .  If aSample[i]
16eb0 3d 3d 70 56 61 6c 2c 20 74 68 65 6e 20 69 73 45  ==pVal, then isE
16ec0 71 3d 3d 31 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  q==1..  */.  if(
16ed0 20 69 73 45 71 20 29 7b 0a 20 20 20 20 61 73 73   isEq ){.    ass
16ee0 65 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61  ert( i<pIdx->nSa
16ef0 6d 70 6c 65 20 29 3b 0a 20 20 20 20 61 53 74 61  mple );.    aSta
16f00 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[0] = aSample[i
16f10 5d 2e 6e 4c 74 3b 0a 20 20 20 20 61 53 74 61 74  ].nLt;.    aStat
16f20 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  [1] = aSample[i]
16f30 2e 6e 45 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  .nEq;.  }else{. 
16f40 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
16f50 72 2c 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b  r, iUpper, iGap;
16f60 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b  .    if( i==0 ){
16f70 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20  .      iLower = 
16f80 30 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20  0;.      iUpper 
16f90 3d 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 6e 4c 74  = aSample[0].nLt
16fa0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16fb0 20 20 20 69 55 70 70 65 72 20 3d 20 69 3e 3d 70     iUpper = i>=p
16fc0 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e  Idx->nSample ? n
16fd0 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c   : aSample[i].nL
16fe0 74 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20  t;.      iLower 
16ff0 3d 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e  = aSample[i-1].n
17000 45 71 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31  Eq + aSample[i-1
17010 5d 2e 6e 4c 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ].nLt;.    }.   
17020 20 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64 78   aStat[1] = pIdx
17030 2d 3e 61 76 67 45 71 3b 0a 20 20 20 20 69 66 28  ->avgEq;.    if(
17040 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20   iLower>=iUpper 
17050 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  ){.      iGap = 
17060 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
17070 20 20 20 20 69 47 61 70 20 3d 20 69 55 70 70 65      iGap = iUppe
17080 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20  r - iLower;.    
17090 7d 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55  }.    if( roundU
170a0 70 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20  p ){.      iGap 
170b0 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20  = (iGap*2)/3;.  
170c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
170d0 47 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20  Gap = iGap/3;.  
170e0 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d    }.    aStat[0]
170f0 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70   = iLower + iGap
17100 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
17110 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
17120 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
17130 42 4c 45 5f 53 54 41 54 33 20 2a 2f 0a 0a 2f 2a  BLE_STAT3 */../*
17140 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f  .** If expressio
17150 6e 20 70 45 78 70 72 20 72 65 70 72 65 73 65 6e  n pExpr represen
17160 74 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c  ts a literal val
17170 75 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70  ue, set *pp to p
17180 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61 6e 20 73 71  oint to.** an sq
17190 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75  lite3_value stru
171a0 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
171b0 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2c   the same value,
171c0 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 0a 2a   with affinity.*
171d0 2a 20 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f  * aff applied to
171e0 20 69 74 2c 20 62 65 66 6f 72 65 20 72 65 74 75   it, before retu
171f0 72 6e 69 6e 67 2e 20 49 74 20 69 73 20 74 68 65  rning. It is the
17200 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
17210 6f 66 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65  of the .** calle
17220 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
17230 72 65 6c 65 61 73 65 20 74 68 69 73 20 73 74 72  release this str
17240 75 63 74 75 72 65 20 62 79 20 70 61 73 73 69 6e  ucture by passin
17250 67 20 69 74 20 74 6f 20 0a 2a 2a 20 73 71 6c 69  g it to .** sqli
17260 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a  te3ValueFree()..
17270 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
17280 72 65 6e 74 20 70 61 72 73 65 20 69 73 20 61 20  rent parse is a 
17290 72 65 63 6f 6d 70 69 6c 65 20 28 73 71 6c 69 74  recompile (sqlit
172a0 65 33 52 65 70 72 65 70 61 72 65 28 29 29 20 61  e3Reprepare()) a
172b0 6e 64 20 70 45 78 70 72 0a 2a 2a 20 69 73 20 61  nd pExpr.** is a
172c0 6e 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 74  n SQL variable t
172d0 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 68 61  hat currently ha
172e0 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  s a non-NULL val
172f0 75 65 20 62 6f 75 6e 64 20 74 6f 20 69 74 2c 0a  ue bound to it,.
17300 2a 2a 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c  ** create an sql
17310 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
17320 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
17330 74 68 69 73 20 76 61 6c 75 65 2c 20 61 67 61 69  this value, agai
17340 6e 20 77 69 74 68 0a 2a 2a 20 61 66 66 69 6e 69  n with.** affini
17350 74 79 20 61 66 66 20 61 70 70 6c 69 65 64 20 74  ty aff applied t
17360 6f 20 69 74 2c 20 69 6e 73 74 65 61 64 2e 0a 2a  o it, instead..*
17370 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20  *.** If neither 
17380 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 70 70  of the above app
17390 6c 79 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e  ly, set *pp to N
173a0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ULL..**.** If an
173b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
173c0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
173d0 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
173e0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69  SQLITE_OK..*/.#i
173f0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
17400 4c 45 5f 53 54 41 54 33 0a 73 74 61 74 69 63 20  LE_STAT3.static 
17410 69 6e 74 20 76 61 6c 75 65 46 72 6f 6d 45 78 70  int valueFromExp
17420 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
17430 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78  se, .  Expr *pEx
17440 70 72 2c 20 0a 20 20 75 38 20 61 66 66 2c 20 0a  pr, .  u8 aff, .
17450 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
17460 2a 2a 70 70 0a 29 7b 0a 20 20 69 66 28 20 70 45  **pp.){.  if( pE
17470 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49  xpr->op==TK_VARI
17480 41 42 4c 45 0a 20 20 20 7c 7c 20 28 70 45 78 70  ABLE.   || (pExp
17490 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  r->op==TK_REGIST
174a0 45 52 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 32  ER && pExpr->op2
174b0 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 29 0a 20  ==TK_VARIABLE). 
174c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 72   ){.    int iVar
174d0 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
174e0 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  n;.    sqlite3Vd
174f0 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61  beSetVarmask(pPa
17500 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61 72  rse->pVdbe, iVar
17510 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 73 71 6c  );.    *pp = sql
17520 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64  ite3VdbeGetBound
17530 56 61 6c 75 65 28 70 50 61 72 73 65 2d 3e 70 52  Value(pParse->pR
17540 65 70 72 65 70 61 72 65 2c 20 69 56 61 72 2c 20  eprepare, iVar, 
17550 61 66 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  aff);.    return
17560 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
17570 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
17580 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50  ValueFromExpr(pP
17590 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
175a0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 61 66   SQLITE_UTF8, af
175b0 66 2c 20 70 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  f, pp);.}.#endif
175c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
175d0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
175e0 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
175f0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
17600 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65  t will be visite
17610 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67  d.** by scanning
17620 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20   an index for a 
17630 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e  range of values.
17640 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68   The range may h
17650 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20  ave an upper.** 
17660 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62  bound, a lower b
17670 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54  ound, or both. T
17680 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
17690 74 65 72 6d 73 20 74 68 61 74 20 73 65 74 20 74  terms that set t
176a0 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20  he upper.** and 
176b0 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65  lower bounds are
176c0 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20   represented by 
176d0 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
176e0 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  r respectively. 
176f0 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
17700 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e  assuming that in
17710 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61  dex p is on t1(a
17720 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  ):.**.**   ... F
17730 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e  ROM t1 WHERE a >
17740 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e   ? AND a < ? ...
17750 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17760 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20         |_____|  
17770 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20   |_____|.**     
17780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17790 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a    |         |.**
177a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177b0 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70       pLower    p
177c0 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65  Upper.**.** If e
177d0 69 74 68 65 72 20 6f 66 20 74 68 65 20 75 70 70  ither of the upp
177e0 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e  er or lower boun
177f0 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  d is not present
17800 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70  , then NULL is p
17810 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63  assed in.** plac
17820 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70  e of the corresp
17830 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d  onding WhereTerm
17840 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 71 20  ..**.** The nEq 
17850 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73  parameter is pas
17860 73 65 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66  sed the index of
17870 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d   the index colum
17880 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  n subject to the
17890 0a 2a 2a 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  .** range constr
178a0 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61  aint. Or, equiva
178b0 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62  lently, the numb
178c0 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20 63  er of equality c
178d0 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 6f 70  onstraints.** op
178e0 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70  timized by the p
178f0 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63  roposed index sc
17900 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  an. For example,
17910 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20   assuming index 
17920 70 20 69 73 0a 2a 2a 20 6f 6e 20 74 31 28 61 2c  p is.** on t1(a,
17930 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c   b), and the SQL
17940 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
17950 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
17960 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62  HERE a = ? AND b
17970 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e   > ? AND b < ? .
17980 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
17990 71 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  q should be pass
179a0 65 64 20 74 68 65 20 76 61 6c 75 65 20 31 20 28  ed the value 1 (
179b0 61 73 20 74 68 65 20 72 61 6e 67 65 20 72 65 73  as the range res
179c0 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 0a  tricted column,.
179d0 2a 2a 20 62 2c 20 69 73 20 74 68 65 20 73 65 63  ** b, is the sec
179e0 6f 6e 64 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  ond left-most co
179f0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
17a00 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71  x). Or, if the q
17a10 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
17a20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
17a30 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c  RE a > ? AND a <
17a40 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65   ? ....**.** the
17a50 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65 20  n nEq should be 
17a60 70 61 73 73 65 64 20 30 2e 0a 2a 2a 0a 2a 2a 20  passed 0..**.** 
17a70 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
17a80 75 65 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ue is an integer
17a90 20 64 69 76 69 73 6f 72 20 74 6f 20 72 65 64 75   divisor to redu
17aa0 63 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  ce the estimated
17ab0 0a 2a 2a 20 73 65 61 72 63 68 20 73 70 61 63 65  .** search space
17ac0 2e 20 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75  .  A return valu
17ad0 65 20 6f 66 20 31 20 6d 65 61 6e 73 20 74 68 61  e of 1 means tha
17ae0 74 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  t range constrai
17af0 6e 74 73 20 61 72 65 0a 2a 2a 20 6e 6f 20 68 65  nts are.** no he
17b00 6c 70 20 61 74 20 61 6c 6c 2e 20 20 41 20 72 65  lp at all.  A re
17b10 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 32 20  turn value of 2 
17b20 6d 65 61 6e 73 20 72 61 6e 67 65 20 63 6f 6e 73  means range cons
17b30 74 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20 65  traints are.** e
17b40 78 70 65 63 74 65 64 20 74 6f 20 72 65 64 75 63  xpected to reduc
17b50 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  e the search spa
17b60 63 65 20 62 79 20 68 61 6c 66 2e 20 20 41 6e 64  ce by half.  And
17b70 20 73 6f 20 66 6f 72 74 68 2e 2e 2e 0a 2a 2a 0a   so forth....**.
17b80 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63  ** In the absenc
17b90 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74  e of sqlite_stat
17ba0 33 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20  3 ANALYZE data, 
17bb0 65 61 63 68 20 72 61 6e 67 65 20 69 6e 65 71 75  each range inequ
17bc0 61 6c 69 74 79 0a 2a 2a 20 72 65 64 75 63 65 73  ality.** reduces
17bd0 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
17be0 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66  e by a factor of
17bf0 20 34 2e 20 20 48 65 6e 63 65 20 61 20 73 69 6e   4.  Hence a sin
17c00 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  gle constraint (
17c10 78 3e 3f 29 0a 2a 2a 20 72 65 73 75 6c 74 73 20  x>?).** results 
17c20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20 34  in a return of 4
17c30 20 61 6e 64 20 61 20 72 61 6e 67 65 20 63 6f 6e   and a range con
17c40 73 74 72 61 69 6e 74 20 28 78 3e 3f 20 41 4e 44  straint (x>? AND
17c50 20 78 3c 3f 29 20 72 65 73 75 6c 74 73 0a 2a 2a   x<?) results.**
17c60 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20   in a return of 
17c70 31 36 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  16..*/.static in
17c80 74 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e  t whereRangeScan
17c90 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
17ca0 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
17cb0 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
17cc0 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
17cd0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20   */.  Index *p, 
17ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
17cf0 65 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 69  e index containi
17d00 6e 67 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d  ng the range-com
17d10 70 61 72 65 64 20 63 6f 6c 75 6d 6e 3b 20 22 78  pared column; "x
17d20 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c 20  " */.  int nEq, 
17d30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
17d40 6e 64 65 78 20 69 6e 74 6f 20 70 2d 3e 61 43 6f  ndex into p->aCo
17d50 6c 5b 5d 20 6f 66 20 74 68 65 20 72 61 6e 67 65  l[] of the range
17d60 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e  -compared column
17d70 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
17d80 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f  *pLower,   /* Lo
17d90 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  wer bound on the
17da0 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31   range. ex: "x>1
17db0 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  23" Might be NUL
17dc0 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  L */.  WhereTerm
17dd0 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55   *pUpper,   /* U
17de0 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  pper bound on th
17df0 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c  e range. ex: "x<
17e00 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55  455" Might be NU
17e10 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  LL */.  WhereCos
17e20 74 20 2a 70 52 61 6e 67 65 44 69 76 20 2f 2a 20  t *pRangeDiv /* 
17e30 4f 55 54 3a 20 52 65 64 75 63 65 20 73 65 61 72  OUT: Reduce sear
17e40 63 68 20 73 70 61 63 65 20 62 79 20 74 68 69 73  ch space by this
17e50 20 64 69 76 69 73 6f 72 20 2a 2f 0a 29 7b 0a 20   divisor */.){. 
17e60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17e70 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  _OK;..#ifdef SQL
17e80 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
17e90 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26  ..  if( nEq==0 &
17ea0 26 20 70 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20  & p->nSample && 
17eb0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
17ec0 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  led(pParse->db, 
17ed0 53 51 4c 49 54 45 5f 53 74 61 74 33 29 20 29 7b  SQLITE_Stat3) ){
17ee0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  .    sqlite3_val
17ef0 75 65 20 2a 70 52 61 6e 67 65 56 61 6c 3b 0a 20  ue *pRangeVal;. 
17f00 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
17f10 72 20 3d 20 30 3b 0a 20 20 20 20 74 52 6f 77 63  r = 0;.    tRowc
17f20 6e 74 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 61  nt iUpper = p->a
17f30 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20  iRowEst[0];.    
17f40 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20  tRowcnt a[2];.  
17f50 20 20 75 38 20 61 66 66 20 3d 20 70 2d 3e 70 54    u8 aff = p->pT
17f60 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69  able->aCol[p->ai
17f70 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e  Column[0]].affin
17f80 69 74 79 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c  ity;..    if( pL
17f90 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 45 78  ower ){.      Ex
17fa0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77  pr *pExpr = pLow
17fb0 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
17fc0 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 76 61  t;.      rc = va
17fd0 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
17fe0 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  se, pExpr, aff, 
17ff0 26 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20  &pRangeVal);.   
18000 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 77     assert( (pLow
18010 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
18020 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d  (WO_GT|WO_GE))!=
18030 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  0 );.      if( r
18040 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
18050 20 20 20 20 26 26 20 77 68 65 72 65 4b 65 79 53      && whereKeyS
18060 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
18070 70 52 61 6e 67 65 56 61 6c 2c 20 30 2c 20 61 29  pRangeVal, 0, a)
18080 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ==SQLITE_OK.    
18090 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f    ){.        iLo
180a0 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20  wer = a[0];.    
180b0 20 20 20 20 69 66 28 20 28 70 4c 6f 77 65 72 2d      if( (pLower-
180c0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
180d0 47 54 29 21 3d 30 20 29 20 69 4c 6f 77 65 72 20  GT)!=0 ) iLower 
180e0 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d  += a[1];.      }
180f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61  .      sqlite3Va
18100 6c 75 65 46 72 65 65 28 70 52 61 6e 67 65 56 61  lueFree(pRangeVa
18110 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
18120 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18130 26 26 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20  && pUpper ){.   
18140 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
18150 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e   pUpper->pExpr->
18160 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63  pRight;.      rc
18170 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72   = valueFromExpr
18180 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
18190 61 66 66 2c 20 26 70 52 61 6e 67 65 56 61 6c 29  aff, &pRangeVal)
181a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
181b0 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
181c0 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  or & (WO_LT|WO_L
181d0 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  E))!=0 );.      
181e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
181f0 4b 0a 20 20 20 20 20 20 20 26 26 20 77 68 65 72  K.       && wher
18200 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
18210 2c 20 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20  , p, pRangeVal, 
18220 31 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, a)==SQLITE_OK
18230 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
18240 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 3b    iUpper = a[0];
18250 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 55  .        if( (pU
18260 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pper->eOperator 
18270 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 20 69 55  & WO_LE)!=0 ) iU
18280 70 70 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20  pper += a[1];.  
18290 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
182a0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 61  te3ValueFree(pRa
182b0 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  ngeVal);.    }. 
182c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
182d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 57 68  E_OK ){.      Wh
182e0 65 72 65 43 6f 73 74 20 69 42 61 73 65 20 3d 20  ereCost iBase = 
182f0 77 68 65 72 65 43 6f 73 74 28 70 2d 3e 61 69 52  whereCost(p->aiR
18300 6f 77 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20  owEst[0]);.     
18310 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77   if( iUpper>iLow
18320 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 42  er ){.        iB
18330 61 73 65 20 2d 3d 20 77 68 65 72 65 43 6f 73 74  ase -= whereCost
18340 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72  (iUpper - iLower
18350 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18360 20 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 69 42   *pRangeDiv = iB
18370 61 73 65 3b 0a 20 20 20 20 20 20 57 48 45 52 45  ase;.      WHERE
18380 54 52 41 43 45 28 30 78 31 30 30 2c 20 28 22 72  TRACE(0x100, ("r
18390 61 6e 67 65 20 73 63 61 6e 20 72 65 67 69 6f 6e  ange scan region
183a0 73 3a 20 25 75 2e 2e 25 75 20 20 64 69 76 3d 25  s: %u..%u  div=%
183b0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
183c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
183d0 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32  u32)iLower, (u32
183e0 29 69 55 70 70 65 72 2c 20 2a 70 52 61 6e 67 65  )iUpper, *pRange
183f0 44 69 76 29 29 3b 0a 20 20 20 20 20 20 72 65 74  Div));.      ret
18400 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
18410 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
18420 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
18430 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55  R(pParse);.  UNU
18440 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
18450 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
18460 45 54 45 52 28 6e 45 71 29 3b 0a 23 65 6e 64 69  ETER(nEq);.#endi
18470 66 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77  f.  assert( pLow
18480 65 72 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a  er || pUpper );.
18490 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 30    *pRangeDiv = 0
184a0 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20  ;.  /* TUNING:  
184b0 45 61 63 68 20 69 6e 65 71 75 61 6c 69 74 79 20  Each inequality 
184c0 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 64 75 63  constraint reduc
184d0 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70  es the search sp
184e0 61 63 65 20 34 2d 66 6f 6c 64 2e 0a 20 20 2a 2a  ace 4-fold..  **
184f0 20 41 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61   A BETWEEN opera
18500 74 6f 72 2c 20 74 68 65 72 65 66 6f 72 65 2c 20  tor, therefore, 
18510 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72  reduces the sear
18520 63 68 20 73 70 61 63 65 20 31 36 2d 66 6f 6c 64  ch space 16-fold
18530 20 2a 2f 0a 20 20 69 66 28 20 70 4c 6f 77 65 72   */.  if( pLower
18540 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e 77 74 46   && (pLower->wtF
18550 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
18560 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  L)==0 ){.    *pR
18570 61 6e 67 65 44 69 76 20 2b 3d 20 32 30 3b 20 20  angeDiv += 20;  
18580 61 73 73 65 72 74 28 20 32 30 3d 3d 77 68 65 72  assert( 20==wher
18590 65 43 6f 73 74 28 34 29 20 29 3b 0a 20 20 7d 0a  eCost(4) );.  }.
185a0 20 20 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a    if( pUpper ){.
185b0 20 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20 2b      *pRangeDiv +
185c0 3d 20 32 30 3b 20 20 61 73 73 65 72 74 28 20 32  = 20;  assert( 2
185d0 30 3d 3d 77 68 65 72 65 43 6f 73 74 28 34 29 20  0==whereCost(4) 
185e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
185f0 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
18600 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
18610 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  3./*.** Estimate
18620 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
18630 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
18640 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20   returned based 
18650 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74  on.** an equalit
18660 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56  y constraint x=V
18670 41 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74  ALUE and where t
18680 68 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73  hat VALUE occurs
18690 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f   in.** the histo
186a0 67 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73  gram data.  This
186b0 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e   only works when
186c0 20 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d   x is the left-m
186d0 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66  ost.** column of
186e0 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71   an index and sq
186f0 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f  lite_stat3 histo
18700 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61  gram data is ava
18710 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68  ilable.** for th
18720 61 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20  at index.  When 
18730 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74  pExpr==NULL that
18740 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74   means the const
18750 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49  raint is.** "x I
18760 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20  S NULL" instead 
18770 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a  of "x=VALUE"..**
18780 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73  .** Write the es
18790 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e  timated row coun
187a0 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e  t into *pnRow an
187b0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
187c0 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c  OK. .** If unabl
187d0 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74  e to make an est
187e0 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e  imate, leave *pn
187f0 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  Row unchanged an
18800 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  d return.** non-
18810 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  zero..**.** This
18820 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69   routine can fai
18830 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c  l if it is unabl
18840 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c  e to load a coll
18850 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a  ating sequence.*
18860 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  * required for s
18870 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e  tring comparison
18880 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74  , or if unable t
18890 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
188a0 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63  y.** for a UTF c
188b0 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72  onversion requir
188c0 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f  ed for compariso
188d0 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73  n.  The error is
188e0 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68   stored.** in th
188f0 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
18900 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
18910 74 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  t whereEqualScan
18920 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
18930 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
18940 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
18950 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
18960 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20   */.  Index *p, 
18970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
18980 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20 6c 65  e index whose le
18990 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69  ft-most column i
189a0 73 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78 70  s pTerm */.  Exp
189b0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
189c0 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
189d0 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65  for VALUE in the
189e0 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61   x=VALUE constra
189f0 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  int */.  tRowcnt
18a00 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a   *pnRow       /*
18a10 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73   Write the revis
18a20 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ed row estimate 
18a30 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  here */.){.  sql
18a40 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 68 73  ite3_value *pRhs
18a50 20 3d 20 30 3b 20 20 2f 2a 20 56 41 4c 55 45 20   = 0;  /* VALUE 
18a60 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  on right-hand si
18a70 64 65 20 6f 66 20 70 54 65 72 6d 20 2a 2f 0a 20  de of pTerm */. 
18a80 20 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20   u8 aff;        
18a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
18aa0 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f  lumn affinity */
18ab0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
18ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18ad0 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  Subfunction retu
18ae0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f  rn code */.  tRo
18af0 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20  wcnt a[2];      
18b00 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73         /* Statis
18b10 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tics */..  asser
18b20 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30  t( p->aSample!=0
18b30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
18b40 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20  >nSample>0 );.  
18b50 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d  aff = p->pTable-
18b60 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d  >aCol[p->aiColum
18b70 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  n[0]].affinity;.
18b80 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20    if( pExpr ){. 
18b90 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f     rc = valueFro
18ba0 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45  mExpr(pParse, pE
18bb0 78 70 72 2c 20 61 66 66 2c 20 26 70 52 68 73 29  xpr, aff, &pRhs)
18bc0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
18bd0 6f 74 6f 20 77 68 65 72 65 45 71 75 61 6c 53 63  oto whereEqualSc
18be0 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3b 0a 20 20  anEst_cancel;.  
18bf0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 68 73 20  }else{.    pRhs 
18c00 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
18c10 77 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  w(pParse->db);. 
18c20 20 7d 0a 20 20 69 66 28 20 70 52 68 73 3d 3d 30   }.  if( pRhs==0
18c30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
18c40 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 72 63 20  _NOTFOUND;.  rc 
18c50 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  = whereKeyStats(
18c60 70 50 61 72 73 65 2c 20 70 2c 20 70 52 68 73 2c  pParse, p, pRhs,
18c70 20 30 2c 20 61 29 3b 0a 20 20 69 66 28 20 72 63   0, a);.  if( rc
18c80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18c90 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
18ca0 31 30 30 2c 28 22 65 71 75 61 6c 69 74 79 20 73  100,("equality s
18cb0 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c  can regions: %d\
18cc0 6e 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b  n", (int)a[1]));
18cd0 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b  .    *pnRow = a[
18ce0 31 5d 3b 0a 20 20 7d 0a 77 68 65 72 65 45 71 75  1];.  }.whereEqu
18cf0 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c  alScanEst_cancel
18d00 3a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  :.  sqlite3Value
18d10 46 72 65 65 28 70 52 68 73 29 3b 0a 20 20 72 65  Free(pRhs);.  re
18d20 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
18d30 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
18d40 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
18d50 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  ) */..#ifdef SQL
18d60 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
18d70 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
18d80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
18d90 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
18da0 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
18db0 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74  n.** an IN const
18dc0 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20  raint where the 
18dd0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
18de0 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
18df0 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20  or.** is a list 
18e00 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d  of values.  Exam
18e10 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
18e20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c    WHERE x IN (1,
18e30 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69  2,3,4).**.** Wri
18e40 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  te the estimated
18e50 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20   row count into 
18e60 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72  *pnRow and retur
18e70 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  n SQLITE_OK. .**
18e80 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61   If unable to ma
18e90 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20  ke an estimate, 
18ea0 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63  leave *pnRow unc
18eb0 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72  hanged and retur
18ec0 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  n.** non-zero..*
18ed0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18ee0 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74  e can fail if it
18ef0 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f   is unable to lo
18f00 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ad a collating s
18f10 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69  equence.** requi
18f20 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63  red for string c
18f30 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66  omparison, or if
18f40 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
18f50 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  ate memory.** fo
18f60 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69  r a UTF conversi
18f70 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
18f80 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65  comparison.  The
18f90 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64   error is stored
18fa0 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73  .** in the pPars
18fb0 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
18fc0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
18fd0 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  InScanEst(.  Par
18fe0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
18ff0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
19000 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
19010 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
19020 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
19030 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68   /* The index wh
19040 6f 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  ose left-most co
19050 6c 75 6d 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f  lumn is pTerm */
19060 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
19070 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76  st,     /* The v
19080 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65  alue list on the
19090 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76   RHS of "x IN (v
190a0 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f  1,v2,v3,...)" */
190b0 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f  .  tRowcnt *pnRo
190c0 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  w       /* Write
190d0 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77   the revised row
190e0 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a   estimate here *
190f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
19100 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
19110 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
19120 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74  turn code */.  t
19130 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20  Rowcnt nEst;    
19140 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19150 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73   of rows for a s
19160 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20  ingle term */.  
19170 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20  tRowcnt nRowEst 
19180 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65  = 0;    /* New e
19190 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
191a0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f  umber of rows */
191b0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
191c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
191d0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
191e0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d   assert( p->aSam
191f0 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ple!=0 );.  for(
19200 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
19210 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e  OK && i<pList->n
19220 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
19230 6e 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45  nEst = p->aiRowE
19240 73 74 5b 30 5d 3b 0a 20 20 20 20 72 63 20 3d 20  st[0];.    rc = 
19250 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
19260 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4c 69  t(pParse, p, pLi
19270 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
19280 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77  &nEst);.    nRow
19290 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 7d  Est += nEst;.  }
192a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
192b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
192c0 6e 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61 69 52  nRowEst > p->aiR
192d0 6f 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f 77 45  owEst[0] ) nRowE
192e0 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74  st = p->aiRowEst
192f0 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20  [0];.    *pnRow 
19300 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57  = nRowEst;.    W
19310 48 45 52 45 54 52 41 43 45 28 30 78 31 30 30 2c  HERETRACE(0x100,
19320 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74  ("IN row estimat
19330 65 3a 20 65 73 74 3d 25 67 5c 6e 22 2c 20 6e 52  e: est=%g\n", nR
19340 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 72  owEst));.  }.  r
19350 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
19360 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
19370 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
19380 33 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  3) */../*.** Dis
19390 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74  able a term in t
193a0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
193b0 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74    Except, do not
193c0 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 72   disable the ter
193d0 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72  m.** if it contr
193e0 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52  ols a LEFT OUTER
193f0 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64   JOIN and it did
19400 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69   not originate i
19410 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55  n the ON.** or U
19420 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74  SING clause of t
19430 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  hat join..**.** 
19440 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65 72  Consider the ter
19450 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74  m t2.z='ok' in t
19460 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65  he following que
19470 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  ries:.**.**   (1
19480 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
19490 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
194a0 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48   ON t1.a=t2.x WH
194b0 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  ERE t2.z='ok'.**
194c0 20 20 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a     (2)  SELECT *
194d0 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
194e0 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
194f0 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27  .x AND t2.z='ok'
19500 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43  .**   (3)  SELEC
19510 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20  T * FROM t1, t2 
19520 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20  WHERE t1.a=t2.x 
19530 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  AND t2.z='ok'.**
19540 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b  .** The t2.z='ok
19550 27 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e  ' is disabled in
19560 20 74 68 65 20 69 6e 20 28 32 29 20 62 65 63 61   the in (2) beca
19570 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65  use it originate
19580 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63  s.** in the ON c
19590 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d  lause.  The term
195a0 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
195b0 28 33 29 20 62 65 63 61 75 73 65 20 69 74 20 69  (3) because it i
195c0 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66  s not part.** of
195d0 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
195e0 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65  IN.  In (1), the
195f0 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73   term is not dis
19600 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73  abled..**.** Dis
19610 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61  abling a term ca
19620 75 73 65 73 20 74 68 61 74 20 74 65 72 6d 20 74  uses that term t
19630 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20  o not be tested 
19640 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  in the inner loo
19650 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e  p.** of the join
19660 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20  .  Disabling is 
19670 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
19680 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65    When terms are
19690 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79   satisfied.** by
196a0 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73   indices, we dis
196b0 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65  able them to pre
196c0 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74  vent redundant t
196d0 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65  ests in the inne
196e0 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77  r.** loop.  We w
196f0 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72  ould get the cor
19700 72 65 63 74 20 72 65 73 75 6c 74 73 20 69 66 20  rect results if 
19710 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76 65  nothing were eve
19720 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62  r disabled,.** b
19730 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72  ut joins might r
19740 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77  un a little slow
19750 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69  er.  The trick i
19760 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20  s to disable as 
19770 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61  much.** as we ca
19780 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c  n without disabl
19790 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49  ing too much.  I
197a0 66 20 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e  f we disabled in
197b0 20 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a   (1), we'd get.*
197c0 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77  * the wrong answ
197d0 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  er.  See ticket 
197e0 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  #813..*/.static 
197f0 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d  void disableTerm
19800 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65  (WhereLevel *pLe
19810 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a  vel, WhereTerm *
19820 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54  pTerm){.  if( pT
19830 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54  erm.      && (pT
19840 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
19850 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20  ERM_CODED)==0.  
19860 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e      && (pLevel->
19870 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20  iLeftJoin==0 || 
19880 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
19890 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
198a0 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b  _FromJoin)).  ){
198b0 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  .    pTerm->wtFl
198c0 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
198d0 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  D;.    if( pTerm
198e0 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a  ->iParent>=0 ){.
198f0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
19900 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d  *pOther = &pTerm
19910 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e  ->pWC->a[pTerm->
19920 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20  iParent];.      
19930 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e  if( (--pOther->n
19940 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20  Child)==0 ){.   
19950 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
19960 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29  (pLevel, pOther)
19970 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19980 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64    }.}../*.** Cod
19990 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79  e an OP_Affinity
199a0 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79   opcode to apply
199b0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69   the column affi
199c0 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66  nity string zAff
199d0 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67  .** to the n reg
199e0 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
199f0 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20  at base. .**.** 
19a00 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  As an optimizati
19a10 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  on, SQLITE_AFF_N
19a20 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68 69  ONE entries (whi
19a30 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61  ch are no-ops) a
19a40 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69  t the.** beginni
19a50 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41  ng and end of zA
19a60 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20  ff are ignored. 
19a70 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   If all entries 
19a80 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53  in zAff are.** S
19a90 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20  QLITE_AFF_NONE, 
19aa0 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74  then no code get
19ab0 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a  s generated..**.
19ac0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19ad0 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f  makes its own co
19ae0 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68  py of zAff so th
19af0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  at the caller is
19b00 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69   free.** to modi
19b10 66 79 20 7a 41 66 66 20 61 66 74 65 72 20 74 68  fy zAff after th
19b20 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
19b30 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
19b40 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69  id codeApplyAffi
19b50 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72  nity(Parse *pPar
19b60 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e  se, int base, in
19b70 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29  t n, char *zAff)
19b80 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
19b90 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
19ba0 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20  f( zAff==0 ){.  
19bb0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
19bc0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
19bd0 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed );.    return
19be0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
19bf0 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  v!=0 );..  /* Ad
19c00 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20  just base and n 
19c10 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c  to skip over SQL
19c20 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74  ITE_AFF_NONE ent
19c30 72 69 65 73 20 61 74 20 74 68 65 20 62 65 67 69  ries at the begi
19c40 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65  nning.  ** and e
19c50 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69  nd of the affini
19c60 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a  ty string..  */.
19c70 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
19c80 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f  zAff[0]==SQLITE_
19c90 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
19ca0 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b  n--;.    base++;
19cb0 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d  .    zAff++;.  }
19cc0 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26  .  while( n>1 &&
19cd0 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49   zAff[n-1]==SQLI
19ce0 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
19cf0 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f     n--;.  }..  /
19d00 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66  * Code the OP_Af
19d10 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66  finity opcode if
19d20 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69   there is anythi
19d30 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a  ng left to do. *
19d40 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  /.  if( n>0 ){. 
19d50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19d60 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp2(v, OP_Affin
19d70 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20  ity, base, n);. 
19d80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
19d90 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41  angeP4(v, -1, zA
19da0 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ff, n);.    sqli
19db0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
19dc0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
19dd0 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d  e, base, n);.  }
19de0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
19df0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73  ate code for a s
19e00 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74  ingle equality t
19e10 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
19e20 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75   clause.  An equ
19e30 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61  ality.** term ca
19e40 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78  n be either X=ex
19e50 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29  pr or X IN (...)
19e60 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65  .   pTerm is the
19e70 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20   term to be .** 
19e80 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  coded..**.** The
19e90 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66   current value f
19ea0 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  or the constrain
19eb0 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  t is left in reg
19ec0 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a  ister iReg..**.*
19ed0 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  * For a constrai
19ee0 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  nt of the form X
19ef0 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65  =expr, the expre
19f00 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74  ssion is evaluat
19f10 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65  ed and its.** re
19f20 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20  sult is left on 
19f30 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20  the stack.  For 
19f40 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74  constraints of t
19f50 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e  he form X IN (..
19f60 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  .).** this routi
19f70 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f  ne sets up a loo
19f80 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72  p that will iter
19f90 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c  ate over all val
19fa0 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61  ues of X..*/.sta
19fb0 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61  tic int codeEqua
19fc0 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73  lityTerm(.  Pars
19fd0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
19fe0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
19ff0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
1a000 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20  eTerm *pTerm,   
1a010 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74  /* The term of t
1a020 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1a030 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
1a040 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
1a050 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76 65  vel, /* The leve
1a060 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  l of the FROM cl
1a070 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b  ause we are work
1a080 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ing on */.  int 
1a090 69 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  iEq,            
1a0a0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1a0b0 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77 69  equality term wi
1a0c0 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c 20  thin this level 
1a0d0 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20  */.  int bRev,  
1a0e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1a0f0 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72 64   for reverse-ord
1a100 65 72 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e 73  er IN operations
1a110 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65   */.  int iTarge
1a120 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74  t         /* Att
1a130 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65  empt to leave re
1a140 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65  sults in this re
1a150 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45  gister */.){.  E
1a160 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
1a170 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a  >pExpr;.  Vdbe *
1a180 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1a190 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20  e;.  int iReg;  
1a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1b0 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
1a1c0 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a  ing results */..
1a1d0 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65    assert( iTarge
1a1e0 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d  t>0 );.  if( pX-
1a1f0 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20  >op==TK_EQ ){.  
1a200 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
1a210 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1a220 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
1a230 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d  t, iTarget);.  }
1a240 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d  else if( pX->op=
1a250 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
1a260 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74    iReg = iTarget
1a270 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a280 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1a290 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69  ll, 0, iReg);.#i
1a2a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a2b0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c  T_SUBQUERY.  }el
1a2c0 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70  se{.    int eTyp
1a2d0 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b  e;.    int iTab;
1a2e0 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f  .    struct InLo
1a2f0 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68 65  op *pIn;.    Whe
1a300 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20  reLoop *pLoop = 
1a310 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
1a320 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
1a330 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1a340 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
1a350 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70  0.      && pLoop
1a360 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1a370 21 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f  !=0.      && pLo
1a380 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
1a390 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
1a3a0 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq].    ){.     
1a3b0 20 74 65 73 74 63 61 73 65 28 20 69 45 71 3d 3d   testcase( iEq==
1a3c0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1a3d0 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20  ase( bRev );.   
1a3e0 20 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b     bRev = !bRev;
1a3f0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1a400 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
1a410 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69   );.    iReg = i
1a420 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70  Target;.    eTyp
1a430 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
1a440 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
1a450 58 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 65  X, 0);.    if( e
1a460 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type==IN_INDEX_I
1a470 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20  NDEX_DESC ){.   
1a480 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65     testcase( bRe
1a490 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20  v );.      bRev 
1a4a0 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20  = !bRev;.    }. 
1a4b0 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54     iTab = pX->iT
1a4c0 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  able;.    sqlite
1a4d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62  3VdbeAddOp2(v, b
1a4e0 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
1a4f0 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
1a500 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
1a510 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1a520 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
1a530 52 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f  R)==0 );.    pLo
1a540 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  op->wsFlags |= W
1a550 48 45 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20  HERE_IN_ABLE;.  
1a560 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e    if( pLevel->u.
1a570 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20  in.nIn==0 ){.   
1a580 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e     pLevel->addrN
1a590 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
1a5a0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1a5b0 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
1a5c0 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20  u.in.nIn++;.    
1a5d0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
1a5e0 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71  Loop =.       sq
1a5f0 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
1a600 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
1a610 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
1a620 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  nLoop,.         
1a630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a640 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76       sizeof(pLev
1a650 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
1a660 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69  [0])*pLevel->u.i
1a670 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20  n.nIn);.    pIn 
1a680 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  = pLevel->u.in.a
1a690 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20  InLoop;.    if( 
1a6a0 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  pIn ){.      pIn
1a6b0 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e   += pLevel->u.in
1a6c0 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20  .nIn - 1;.      
1a6d0 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62  pIn->iCur = iTab
1a6e0 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
1a6f0 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
1a700 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  D ){.        pIn
1a710 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71  ->addrInTop = sq
1a720 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a730 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61  v, OP_Rowid, iTa
1a740 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20  b, iReg);.      
1a750 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1a760 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20  In->addrInTop = 
1a770 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a780 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
1a790 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a  iTab, 0, iReg);.
1a7a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
1a7b0 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20  n->eEndLoopOp = 
1a7c0 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
1a7d0 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20   OP_Next;.      
1a7e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a7f0 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  1(v, OP_IsNull, 
1a800 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iReg);.    }else
1a810 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
1a820 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20  u.in.nIn = 0;.  
1a830 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
1a840 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
1a850 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72  vel, pTerm);.  r
1a860 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f  eturn iReg;.}../
1a870 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1a880 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
1a890 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64  luate all == and
1a8a0 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
1a8b0 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e  for an.** index.
1a8c0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1a8d0 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62  le, consider tab
1a8e0 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c  le t1(a,b,c,d,e,
1a8f0 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31  f) with index i1
1a900 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70  (a,b,c)..** Supp
1a910 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ose the WHERE cl
1a920 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61  ause is this:  a
1a930 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c  ==5 AND b IN (1,
1a940 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44  2,3) AND c>5 AND
1a950 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64   c<10.** The ind
1a960 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61  ex has as many a
1a970 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79  s three equality
1a980 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75   constraints, bu
1a990 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61  t in this.** exa
1a9a0 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20  mple, the third 
1a9b0 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20  "c" value is an 
1a9c0 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20  inequality.  So 
1a9d0 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e  only two .** con
1a9e0 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64  straints are cod
1a9f0 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
1aa00 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  e will generate 
1aa10 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
1aa20 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49  .** a==5 and b I
1aa30 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20  N (1,2,3).  The 
1aa40 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66  current values f
1aa50 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20  or a and b will 
1aa60 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  be stored.** in 
1aa70 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69  consecutive regi
1aa80 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e  sters and the in
1aa90 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74  dex of the first
1aaa0 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65 74   register is ret
1aab0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  urned..**.** In 
1aac0 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
1aad0 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74  e nEq==2.  But t
1aae0 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77  his subroutine w
1aaf0 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c  orks for any val
1ab00 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63  ue.** of nEq inc
1ab10 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45  luding 0.  If nE
1ab20 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69  q==0, this routi
1ab30 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e  ne is nearly a n
1ab40 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c  o-op..** The onl
1ab50 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20  y thing it does 
1ab60 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  is allocate the 
1ab70 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d  pLevel->iMem mem
1ab80 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20  ory cell and.** 
1ab90 63 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66 69  compute the affi
1aba0 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  nity string..**.
1abb0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1abc0 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73  always allocates
1abd0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65   at least one me
1abe0 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65  mory cell and re
1abf0 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64  turns.** the ind
1ac00 65 78 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72  ex of that memor
1ac10 79 20 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65  y cell. The code
1ac20 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74   that.** calls t
1ac30 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1ac40 20 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79   use that memory
1ac50 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74   cell to store t
1ac60 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a  he termination.*
1ac70 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74  * key value of t
1ac80 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65  he loop.  If one
1ac90 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72   or more IN oper
1aca0 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68  ators appear, th
1acb0 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
1acc0 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20  ne allocates an 
1acd0 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d  additional nEq m
1ace0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
1acf0 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e  internal.** use.
1ad00 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
1ad10 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20  turning, *pzAff 
1ad20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
1ad30 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
1ad40 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79  aining a.** copy
1ad50 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
1ad60 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f  ffinity string o
1ad70 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f  f the index allo
1ad80 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73  cated using.** s
1ad90 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
1ada0 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69 65  . Except, entrie
1adb0 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f 66  s in the copy of
1adc0 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 73 6f   the string asso
1add0 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 65  ciated.** with e
1ade0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1adf0 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e 4f 4e  nts that use NON
1ae00 45 20 61 66 66 69 6e 69 74 79 20 61 72 65 20 73  E affinity are s
1ae10 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f  et to.** SQLITE_
1ae20 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69  AFF_NONE. This i
1ae30 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  s to deal with S
1ae40 51 4c 20 73 75 63 68 20 61 73 20 74 68 65 20 66  QL such as the f
1ae50 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
1ae60 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1ae70 31 28 61 20 54 45 58 54 20 50 52 49 4d 41 52 59  1(a TEXT PRIMARY
1ae80 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53   KEY, b);.**   S
1ae90 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
1aea0 31 20 41 53 20 74 32 2c 20 74 31 20 57 48 45 52  1 AS t2, t1 WHER
1aeb0 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a  E t1.a = t2.b;.*
1aec0 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d  *.** In the exam
1aed0 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 69  ple above, the i
1aee0 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68 61  ndex on t1(a) ha
1aef0 73 20 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e  s TEXT affinity.
1af00 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68   But since.** th
1af10 65 20 72 69 67 68 74 20 68 61 6e 64 20 73 69 64  e right hand sid
1af20 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74  e of the equalit
1af30 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74 32  y constraint (t2
1af40 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61 66 66  .b) has NONE aff
1af50 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e  inity,.** no con
1af60 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62  version should b
1af70 65 20 61 74 74 65 6d 70 74 65 64 20 62 65 66 6f  e attempted befo
1af80 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62 20  re using a t2.b 
1af90 76 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f 66  value as part of
1afa0 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65 61  .** a key to sea
1afb0 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20 48  rch the index. H
1afc0 65 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 62  ence the first b
1afd0 79 74 65 20 69 6e 20 74 68 65 20 72 65 74 75 72  yte in the retur
1afe0 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20  ned affinity.** 
1aff0 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20 65  string in this e
1b000 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65 20  xample would be 
1b010 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41 46  set to SQLITE_AF
1b020 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69  F_NONE..*/.stati
1b030 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75  c int codeAllEqu
1b040 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61  alityTerms(.  Pa
1b050 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1b060 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1b070 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
1b080 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
1b090 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65    /* Which neste
1b0a0 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52  d loop of the FR
1b0b0 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67  OM we are coding
1b0c0 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20   */.  int bRev, 
1b0d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1b0e0 65 76 65 72 73 65 20 74 68 65 20 6f 72 64 65 72  everse the order
1b0f0 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 73   of IN operators
1b100 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
1b110 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Reg,        /* N
1b120 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72  umber of extra r
1b130 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f  egisters to allo
1b140 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cate */.  char *
1b150 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20 20 20  *pzAff          
1b160 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 70  /* OUT: Set to p
1b170 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74 79  oint to affinity
1b180 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
1b190 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20  int nEq;        
1b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b1b0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d   The number of =
1b1c0 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69  = or IN constrai
1b1d0 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20  nts to code */. 
1b1e0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1b1f0 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
1b200 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63  * The vm under c
1b210 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
1b220 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
1b230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b240 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e  * The index bein
1b250 67 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20  g used for this 
1b260 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 54  loop */.  WhereT
1b270 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
1b280 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
1b290 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  gle constraint t
1b2a0 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  erm */.  WhereLo
1b2b0 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
1b2c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
1b2d0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
1b2e0 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
1b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b300 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1b310 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  r */.  int regBa
1b320 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
1b330 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
1b340 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  ister */.  int n
1b350 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
1b360 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b370 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  er of registers 
1b380 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
1b390 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20   char *zAff;    
1b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b3b0 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e  * Affinity strin
1b3c0 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  g to return */..
1b3d0 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65    /* This module
1b3e0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
1b3f0 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74  on query plans t
1b400 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78  hat use an index
1b410 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70  . */.  pLoop = p
1b420 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
1b430 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d   assert( (pLoop-
1b440 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1b450 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
1b460 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f  0 );.  nEq = pLo
1b470 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
1b480 0a 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d  .  pIdx = pLoop-
1b490 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
1b4a0 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21  .  assert( pIdx!
1b4b0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  =0 );..  /* Figu
1b4c0 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
1b4d0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20  memory cells we 
1b4e0 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61  will need then a
1b4f0 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20  llocate them..  
1b500 2a 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70  */.  regBase = p
1b510 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
1b520 0a 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70 2d  .  nReg = pLoop-
1b530 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20 6e  >u.btree.nEq + n
1b540 45 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72  ExtraReg;.  pPar
1b550 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
1b560 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69  ;..  zAff = sqli
1b570 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72  te3DbStrDup(pPar
1b580 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33 49  se->db, sqlite3I
1b590 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28  ndexAffinityStr(
1b5a0 76 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66 28  v, pIdx));.  if(
1b5b0 20 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70 50   !zAff ){.    pP
1b5c0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1b5d0 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
1b5e0 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74  .  /* Evaluate t
1b5f0 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  he equality cons
1b600 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61  traints.  */.  a
1b610 73 73 65 72 74 28 20 7a 41 66 66 3d 3d 30 20 7c  ssert( zAff==0 |
1b620 7c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41  | (int)strlen(zA
1b630 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f  ff)>=nEq );.  fo
1b640 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b  r(j=0; j<nEq; j+
1b650 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a  +){.    int r1;.
1b660 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
1b670 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20  p->aLTerm[j];.  
1b680 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
1b690 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 );.    /* The
1b6a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 72 75 65 20   following true 
1b6b0 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74 68  for indices with
1b6c0 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d   redundant colum
1b6d0 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20  ns. .    ** Ex: 
1b6e0 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
1b6f0 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53 45  ON t1(a,b,a); SE
1b700 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1b710 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d 30  HERE a=0 AND b=0
1b720 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73  ; */.    testcas
1b730 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  e( (pTerm->wtFla
1b740 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
1b750 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
1b760 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
1b770 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1b780 41 4c 20 29 3b 0a 20 20 20 20 72 31 20 3d 20 63  AL );.    r1 = c
1b790 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
1b7a0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
1b7b0 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20  Level, j, bRev, 
1b7c0 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
1b7d0 69 66 28 20 72 31 21 3d 72 65 67 42 61 73 65 2b  if( r1!=regBase+
1b7e0 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  j ){.      if( n
1b7f0 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Reg==1 ){.      
1b800 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1b810 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1b820 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20 20  regBase);.      
1b830 20 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b 0a    regBase = r1;.
1b840 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b850 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b860 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
1b870 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b  py, r1, regBase+
1b880 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j);.      }.    
1b890 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
1b8a0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1b8b0 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
1b8c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1b8d0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1b8e0 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66   WO_IN );.    if
1b8f0 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
1b900 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c  tor & (WO_ISNULL
1b910 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20  |WO_IN))==0 ){. 
1b920 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
1b930 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  t = pTerm->pExpr
1b940 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
1b950 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1b960 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69  sNullJump(v, pRi
1b970 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20  ght, regBase+j, 
1b980 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
1b990 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66 66  ;.      if( zAff
1b9a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1b9b0 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1b9c0 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a  finity(pRight, z
1b9d0 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f  Aff[j])==SQLITE_
1b9e0 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
1b9f0 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20        zAff[j] = 
1ba00 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1ba10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ba20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1ba30 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
1ba40 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
1ba50 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  zAff[j]) ){.    
1ba60 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20        zAff[j] = 
1ba70 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1ba80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ba90 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a   }.    }.  }.  *
1baa0 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20  pzAff = zAff;.  
1bab0 72 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a  return regBase;.
1bac0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1bad0 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
1bae0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1baf0 65 20 69 73 20 61 20 68 65 6c 70 65 72 20 66 6f  e is a helper fo
1bb00 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61  r explainIndexRa
1bb10 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a  nge() below.**.*
1bb20 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74 68 65  * pStr holds the
1bb30 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78 70 72   text of an expr
1bb40 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65 20 61  ession that we a
1bb50 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70 20 6f  re building up o
1bb60 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20  ne term.** at a 
1bb70 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f 75 74  time.  This rout
1bb80 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77 20 74  ine adds a new t
1bb90 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  erm to the end o
1bba0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1bbb0 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65 20 73  ..** Terms are s
1bbc0 65 70 61 72 61 74 65 64 20 62 79 20 41 4e 44 20  eparated by AND 
1bbd0 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e 44 22  so add the "AND"
1bbe0 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f 6e 64   text for second
1bbf0 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0a   and subsequent.
1bc00 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a  ** terms only..*
1bc10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
1bc20 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
1bc30 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70 53 74  .  StrAccum *pSt
1bc40 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
1bc50 2a 20 54 68 65 20 74 65 78 74 20 65 78 70 72 65  * The text expre
1bc60 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c  ssion being buil
1bc70 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d  t */.  int iTerm
1bc80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1bc90 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
1bca0 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72 73 74  his term.  First
1bcb0 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f   is zero */.  co
1bcc0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
1bcd0 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  n,        /* Nam
1bce0 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
1bcf0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1bd00 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20 20 20  *zOp            
1bd10 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1bd20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20  operator */.){. 
1bd30 20 69 66 28 20 69 54 65 72 6d 20 29 20 73 71 6c   if( iTerm ) sql
1bd40 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
1bd50 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22  nd(pStr, " AND "
1bd60 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  , 5);.  sqlite3S
1bd70 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
1bd80 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31 29  tr, zColumn, -1)
1bd90 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
1bda0 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
1bdb0 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  zOp, 1);.  sqlit
1bdc0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
1bdd0 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a  (pStr, "?", 1);.
1bde0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
1bdf0 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72 69 62  t pLevel describ
1be00 65 73 20 61 20 73 74 72 61 74 65 67 79 20 66 6f  es a strategy fo
1be10 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65  r scanning table
1be20 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20   pTab. This .** 
1be30 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1be40 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1be50 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 63 6f  string buffer co
1be60 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73 63 72  ntaining a descr
1be70 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  iption.** of the
1be80 20 73 75 62 73 65 74 20 6f 66 20 74 61 62 6c 65   subset of table
1be90 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79   rows scanned by
1bea0 20 74 68 65 20 73 74 72 61 74 65 67 79 20 69 6e   the strategy in
1beb0 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 0a   the form of an.
1bec0 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f  ** SQL expressio
1bed0 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72 6f  n. Or, if all ro
1bee0 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64 2c 20  ws are scanned, 
1bef0 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
1bf00 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1bf10 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72  ple, if the quer
1bf20 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  y:.**.**   SELEC
1bf30 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
1bf40 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a  E a=1 AND b>2;.*
1bf50 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64 20  *.** is run and 
1bf60 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65  there is an inde
1bf70 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65  x on (a, b), the
1bf80 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1bf90 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72  returns a.** str
1bfa0 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a  ing similar to:.
1bfb0 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44  **.**   "a=? AND
1bfc0 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20   b>?".**.** The 
1bfd0 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72  returned pointer
1bfe0 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f 72   points to memor
1bff0 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
1c000 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
1c010 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  )..** It is the 
1c020 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
1c030 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
1c040 66 72 65 65 20 74 68 65 20 62 75 66 66 65 72 20  free the buffer 
1c050 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e 6f  when it is.** no
1c060 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64   longer required
1c070 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
1c080 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61   *explainIndexRa
1c090 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  nge(sqlite3 *db,
1c0a0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
1c0b0 70 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  p, Table *pTab){
1c0c0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
1c0d0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
1c0e0 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20  e.pIndex;.  int 
1c0f0 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  nEq = pLoop->u.b
1c100 74 72 65 65 2e 6e 45 71 3b 0a 20 20 69 6e 74 20  tree.nEq;.  int 
1c110 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  i, j;.  Column *
1c120 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  aCol = pTab->aCo
1c130 6c 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f 6c 75  l;.  int *aiColu
1c140 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43  mn = pIndex->aiC
1c150 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75  olumn;.  StrAccu
1c160 6d 20 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e 45  m txt;..  if( nE
1c170 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e  q==0 && (pLoop->
1c180 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
1c190 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45  _BTM_LIMIT|WHERE
1c1a0 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20  _TOP_LIMIT))==0 
1c1b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1c1c0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
1c1d0 72 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74 2c  rAccumInit(&txt,
1c1e0 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41   0, 0, SQLITE_MA
1c1f0 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78 74  X_LENGTH);.  txt
1c200 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69  .db = db;.  sqli
1c210 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
1c220 64 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32 29  d(&txt, " (", 2)
1c230 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
1c240 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  Eq; i++){.    ch
1c250 61 72 20 2a 7a 20 3d 20 28 69 3d 3d 70 49 6e 64  ar *z = (i==pInd
1c260 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 3f 20  ex->nColumn ) ? 
1c270 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61  "rowid" : aCol[a
1c280 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d  iColumn[i]].zNam
1c290 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70  e;.    explainAp
1c2a0 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69  pendTerm(&txt, i
1c2b0 2c 20 7a 2c 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a  , z, "=");.  }..
1c2c0 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28 20 70    j = i;.  if( p
1c2d0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48  Loop->wsFlags&WH
1c2e0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
1c2f0 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28  .    char *z = (
1c300 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  j==pIndex->nColu
1c310 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a  mn ) ? "rowid" :
1c320 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a   aCol[aiColumn[j
1c330 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78  ]].zName;.    ex
1c340 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
1c350 26 74 78 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e  &txt, i++, z, ">
1c360 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c  ");.  }.  if( pL
1c370 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  oop->wsFlags&WHE
1c380 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
1c390 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a      char *z = (j
1c3a0 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  ==pIndex->nColum
1c3b0 6e 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  n ) ? "rowid" : 
1c3c0 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  aCol[aiColumn[j]
1c3d0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70  ].zName;.    exp
1c3e0 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26  lainAppendTerm(&
1c3f0 74 78 74 2c 20 69 2c 20 7a 2c 20 22 3c 22 29 3b  txt, i, z, "<");
1c400 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
1c410 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78  rAccumAppend(&tx
1c420 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 72 65  t, ")", 1);.  re
1c430 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41  turn sqlite3StrA
1c440 63 63 75 6d 46 69 6e 69 73 68 28 26 74 78 74 29  ccumFinish(&txt)
1c450 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1c460 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1c470 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75 72 72 65  -op unless curre
1c480 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20  ntly processing 
1c490 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  an EXPLAIN QUERY
1c4a0 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64   PLAN.** command
1c4b0 2e 20 49 66 20 74 68 65 20 71 75 65 72 79 20 62  . If the query b
1c4c0 65 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20 69 73  eing compiled is
1c4d0 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52   an EXPLAIN QUER
1c4e0 59 20 50 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65  Y PLAN, a single
1c4f0 0a 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 61 64  .** record is ad
1c500 64 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ded to the outpu
1c510 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  t to describe th
1c520 65 20 74 61 62 6c 65 20 73 63 61 6e 20 73 74 72  e table scan str
1c530 61 74 65 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65  ategy in .** pLe
1c540 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  vel..*/.static v
1c550 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63  oid explainOneSc
1c560 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  an(.  Parse *pPa
1c570 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
1c580 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
1c590 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
1c5a0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
1c5b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c5c0 61 62 6c 65 20 6c 69 73 74 20 74 68 69 73 20 6c  able list this l
1c5d0 6f 6f 70 20 72 65 66 65 72 73 20 74 6f 20 2a 2f  oop refers to */
1c5e0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
1c5f0 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
1c600 20 20 20 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72     /* Scan to wr
1c610 69 74 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f  ite OP_Explain o
1c620 70 63 6f 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69  pcode for */.  i
1c630 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
1c640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c650 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 76  * Value for "lev
1c660 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75  el" column of ou
1c670 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  tput */.  int iF
1c680 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  rom,            
1c690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1c6a0 75 65 20 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f  ue for "from" co
1c6b0 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a  lumn of output *
1c6c0 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
1c6d0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
1c6e0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
1c6f0 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
1c700 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b  ereBegin() */.){
1c710 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
1c720 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
1c730 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1c740 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
1c750 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
1c760 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 56  l->iFrom];.    V
1c770 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1c780 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20  >pVdbe;      /* 
1c790 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  VM being constru
1c7a0 63 74 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69  cted */.    sqli
1c7b0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1c7c0 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44 61 74  ->db;     /* Dat
1c7d0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
1c7e0 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20      char *zMsg; 
1c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c800 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64    /* Text to add
1c810 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a   to EQP output *
1c820 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20  /.    int iId = 
1c830 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
1c840 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20 69 64  d;  /* Select id
1c850 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75 74 70   (left-most outp
1c860 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20  ut column) */.  
1c870 20 20 69 6e 74 20 69 73 53 65 61 72 63 68 3b 20    int isSearch; 
1c880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c890 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 53 45  /* True for a SE
1c8a0 41 52 43 48 2e 20 46 61 6c 73 65 20 66 6f 72 20  ARCH. False for 
1c8b0 53 43 41 4e 2e 20 2a 2f 0a 20 20 20 20 57 68 65  SCAN. */.    Whe
1c8c0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20  reLoop *pLoop;  
1c8d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1c8e0 65 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 57 68  e controlling Wh
1c8f0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
1c900 2f 0a 20 20 20 20 75 33 32 20 66 6c 61 67 73 3b  /.    u32 flags;
1c910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c920 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 61      /* Flags tha
1c930 74 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20  t describe this 
1c940 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f  loop */..    pLo
1c950 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
1c960 6f 6f 70 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d  oop;.    flags =
1c970 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b   pLoop->wsFlags;
1c980 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 26  .    if( (flags&
1c990 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20  WHERE_MULTI_OR) 
1c9a0 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57  || (wctrlFlags&W
1c9b0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
1c9c0 4c 59 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  LY) ) return;.. 
1c9d0 20 20 20 69 73 53 65 61 72 63 68 20 3d 20 28 66     isSearch = (f
1c9e0 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f  lags&(WHERE_BTM_
1c9f0 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
1ca00 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20 20  LIMIT))!=0.     
1ca10 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61 67         || ((flag
1ca20 73 26 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  s&WHERE_VIRTUALT
1ca30 41 42 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c 6f  ABLE)==0 && (pLo
1ca40 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3e  op->u.btree.nEq>
1ca50 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0)).            
1ca60 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 28  || (wctrlFlags&(
1ca70 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
1ca80 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  N|WHERE_ORDERBY_
1ca90 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a 4d 73 67  MAX));..    zMsg
1caa0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
1cab0 66 28 64 62 2c 20 22 25 73 22 2c 20 69 73 53 65  f(db, "%s", isSe
1cac0 61 72 63 68 3f 22 53 45 41 52 43 48 22 3a 22 53  arch?"SEARCH":"S
1cad0 43 41 4e 22 29 3b 0a 20 20 20 20 69 66 28 20 70  CAN");.    if( p
1cae0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Item->pSelect ){
1caf0 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
1cb00 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1cb10 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53 55 42 51  , zMsg, "%s SUBQ
1cb20 55 45 52 59 20 25 64 22 2c 20 7a 4d 73 67 2c 70  UERY %d", zMsg,p
1cb30 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29  Item->iSelectId)
1cb40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1cb50 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1cb60 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1cb70 73 67 2c 20 22 25 73 20 54 41 42 4c 45 20 25 73  sg, "%s TABLE %s
1cb80 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e  ", zMsg, pItem->
1cb90 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  zName);.    }.. 
1cba0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41     if( pItem->zA
1cbb0 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 7a 4d  lias ){.      zM
1cbc0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1cbd0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1cbe0 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c  %s AS %s", zMsg,
1cbf0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
1cc00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1cc10 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  flags & (WHERE_I
1cc20 50 4b 7c 57 48 45 52 45 5f 56 49 52 54 55 41 4c  PK|WHERE_VIRTUAL
1cc30 54 41 42 4c 45 29 29 3d 3d 30 0a 20 20 20 20 20  TABLE))==0.     
1cc40 26 26 20 41 4c 57 41 59 53 28 70 4c 6f 6f 70 2d  && ALWAYS(pLoop-
1cc50 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
1cc60 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0).    ){.     
1cc70 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
1cc80 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
1cc90 65 28 64 62 2c 20 70 4c 6f 6f 70 2c 20 70 49 74  e(db, pLoop, pIt
1cca0 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20  em->pTab);.     
1ccb0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1ccc0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1ccd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1cce0 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45   ((flags & WHERE
1ccf0 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 3f 20 0a  _AUTO_INDEX) ? .
1cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd10 20 20 20 22 25 73 20 55 53 49 4e 47 20 41 55 54     "%s USING AUT
1cd20 4f 4d 41 54 49 43 20 25 73 49 4e 44 45 58 25 2e  OMATIC %sINDEX%.
1cd30 30 73 25 73 22 20 3a 0a 20 20 20 20 20 20 20 20  0s%s" :.        
1cd40 20 20 20 20 20 20 20 20 20 20 20 22 25 73 20 55             "%s U
1cd50 53 49 4e 47 20 25 73 49 4e 44 45 58 20 25 73 25  SING %sINDEX %s%
1cd60 73 22 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20  s"), .          
1cd70 20 20 20 20 20 7a 4d 73 67 2c 20 28 28 66 6c 61       zMsg, ((fla
1cd80 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
1cd90 4e 4c 59 29 20 3f 20 22 43 4f 56 45 52 49 4e 47  NLY) ? "COVERING
1cda0 20 22 20 3a 20 22 22 29 2c 0a 20 20 20 20 20 20   " : ""),.      
1cdb0 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
1cdc0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
1cdd0 7a 4e 61 6d 65 2c 20 7a 57 68 65 72 65 29 3b 0a  zName, zWhere);.
1cde0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
1cdf0 72 65 65 28 64 62 2c 20 7a 57 68 65 72 65 29 3b  ree(db, zWhere);
1ce00 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
1ce10 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  flags & WHERE_IP
1ce20 4b 29 21 3d 30 20 26 26 20 28 66 6c 61 67 73 20  K)!=0 && (flags 
1ce30 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49  & WHERE_CONSTRAI
1ce40 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  NT)!=0 ){.      
1ce50 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1ce60 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1ce70 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54 45 47   "%s USING INTEG
1ce80 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 2c  ER PRIMARY KEY",
1ce90 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20 69   zMsg);..      i
1cea0 66 28 20 66 6c 61 67 73 26 28 57 48 45 52 45 5f  f( flags&(WHERE_
1ceb0 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f  COLUMN_EQ|WHERE_
1cec0 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20  COLUMN_IN) ){.  
1ced0 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1cee0 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1cef0 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
1cf00 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d=?)", zMsg);.  
1cf10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66      }else if( (f
1cf20 6c 61 67 73 26 57 48 45 52 45 5f 42 4f 54 48 5f  lags&WHERE_BOTH_
1cf30 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f  LIMIT)==WHERE_BO
1cf40 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TH_LIMIT ){.    
1cf50 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1cf60 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1cf70 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e  Msg, "%s (rowid>
1cf80 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c  ? AND rowid<?)",
1cf90 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65   zMsg);.      }e
1cfa0 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26 57 48  lse if( flags&WH
1cfb0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
1cfc0 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
1cfd0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1cfe0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72  db, zMsg, "%s (r
1cff0 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b  owid>?)", zMsg);
1d000 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1d010 20 41 4c 57 41 59 53 28 66 6c 61 67 73 26 57 48   ALWAYS(flags&WH
1d020 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 20 29  ERE_TOP_LIMIT) )
1d030 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
1d040 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1d050 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28  (db, zMsg, "%s (
1d060 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29  rowid<?)", zMsg)
1d070 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d080 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d090 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1d0a0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 28 66  .    else if( (f
1d0b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
1d0c0 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
1d0d0 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
1d0e0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1d0f0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49 52 54  , zMsg, "%s VIRT
1d100 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20  UAL TABLE INDEX 
1d110 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20  %d:%s", zMsg,.  
1d120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d130 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
1d140 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76  xNum, pLoop->u.v
1d150 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20  tab.idxStr);.   
1d160 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7a 4d   }.#endif.    zM
1d170 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1d180 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1d190 25 73 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  %s", zMsg);.    
1d1a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d1b0 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
1d1c0 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46   iId, iLevel, iF
1d1d0 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  rom, zMsg, P4_DY
1d1e0 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  NAMIC);.  }.}.#e
1d1f0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70  lse.# define exp
1d200 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c  lainOneScan(u,v,
1d210 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20  w,x,y,z).#endif 
1d220 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
1d230 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  XPLAIN */.../*.*
1d240 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1d250 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
1d260 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c   the iLevel-th l
1d270 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45 52 45  oop in the WHERE
1d280 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65   clause.** imple
1d290 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63 72 69  mentation descri
1d2a0 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a  bed by pWInfo..*
1d2b0 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
1d2c0 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72   codeOneLoopStar
1d2d0 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  t(.  WhereInfo *
1d2e0 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d  pWInfo,   /* Com
1d2f0 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  plete informatio
1d300 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48 45 52  n about the WHER
1d310 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
1d320 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  t iLevel,       
1d330 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65 76 65     /* Which leve
1d340 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  l of pWInfo->a[]
1d350 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64   should be coded
1d360 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
1d370 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20 57 68  tReady     /* Wh
1d380 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 63  ich tables are c
1d390 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62  urrently availab
1d3a0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a  le */.){.  int j
1d3b0 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  , k;            
1d3c0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
1d3d0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20   */.  int iCur; 
1d3e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d3f0 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
1d400 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  r the table */. 
1d410 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20 20 20   int addrNxt;   
1d420 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
1d430 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e  o jump to contin
1d440 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74  ue with the next
1d450 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e   IN case */.  in
1d460 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20  t omitTable;    
1d470 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65     /* True if we
1d480 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 6f   use the index o
1d490 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  nly */.  int bRe
1d4a0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v;            /*
1d4b0 20 54 72 75 65 20 69 66 20 77 65 20 6e 65 65 64   True if we need
1d4c0 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65   to scan in reve
1d4d0 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57  rse order */.  W
1d4e0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
1d4f0 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65 72 65  l;  /* The where
1d500 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63 6f 64   level to be cod
1d510 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  ed */.  WhereLoo
1d520 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20  p *pLoop;    /* 
1d530 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  The WhereLoop ob
1d540 6a 65 63 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ject being coded
1d550 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
1d560 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44 65  e *pWC;    /* De
1d570 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74  composition of t
1d580 68 65 20 65 6e 74 69 72 65 20 57 48 45 52 45 20  he entire WHERE 
1d590 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
1d5a0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1d5c0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
1d5d0 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  rm */.  Parse *p
1d5e0 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
1d5f0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1d600 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1d610 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
1d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d630 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
1d640 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  ection */.  Vdbe
1d650 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
1d660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d670 68 65 20 70 72 65 70 61 72 65 64 20 73 74 6d 74  he prepared stmt
1d680 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1d690 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ions */.  struct
1d6a0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1d6b0 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f  TabItem;  /* FRO
1d6c0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
1d6d0 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
1d6e0 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20  nt addrBrk;     
1d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d700 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
1d710 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
1d720 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
1d730 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20  drCont;         
1d740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
1d750 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
1d760 75 65 20 77 69 74 68 20 6e 65 78 74 20 63 79 63  ue with next cyc
1d770 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77  le */.  int iRow
1d780 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  idReg = 0;      
1d790 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74    /* Rowid is st
1d7a0 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72 65 67  ored in this reg
1d7b0 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65  ister, if not ze
1d7c0 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c  ro */.  int iRel
1d7d0 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20  easeReg = 0;    
1d7e0 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74    /* Temp regist
1d7f0 65 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72  er to free befor
1d800 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 20  e returning */. 
1d810 20 42 69 74 6d 61 73 6b 20 6e 65 77 4e 6f 74 52   Bitmask newNotR
1d820 65 61 64 79 3b 20 20 20 20 20 20 2f 2a 20 52 65  eady;      /* Re
1d830 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  turn value */.. 
1d840 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
1d850 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20 3d 20  ->pParse;.  v = 
1d860 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1d870 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e   pWC = &pWInfo->
1d880 73 57 43 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  sWC;.  db = pPar
1d890 73 65 2d 3e 64 62 3b 0a 20 20 70 4c 65 76 65 6c  se->db;.  pLevel
1d8a0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c   = &pWInfo->a[iL
1d8b0 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d  evel];.  pLoop =
1d8c0 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
1d8d0 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70  .  pTabItem = &p
1d8e0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
1d8f0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
1d900 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54 61 62  ];.  iCur = pTab
1d910 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
1d920 20 62 52 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d   bRev = (pWInfo-
1d930 3e 72 65 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c  >revMask>>iLevel
1d940 29 26 31 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65  )&1;.  omitTable
1d950 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61   = (pLoop->wsFla
1d960 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
1d970 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20  NLY)!=0 .       
1d980 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
1d990 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1d9a0 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d  RE_FORCE_TABLE)=
1d9b0 3d 30 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f  =0;.  VdbeNoopCo
1d9c0 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
1d9d0 20 4a 6f 69 6e 20 4c 6f 6f 70 20 25 64 22 2c 20   Join Loop %d", 
1d9e0 69 4c 65 76 65 6c 29 29 3b 0a 0a 20 20 2f 2a 20  iLevel));..  /* 
1d9f0 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f  Create labels fo
1da00 72 20 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e  r the "break" an
1da10 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73  d "continue" ins
1da20 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66  tructions.  ** f
1da30 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  or the current l
1da40 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64  oop.  Jump to ad
1da50 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f  drBrk to break o
1da60 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20  ut of a loop..  
1da70 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20  ** Jump to cont 
1da80 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c  to go immediatel
1da90 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74  y to the next it
1daa0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  eration of the. 
1dab0 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20   ** loop..  **. 
1dac0 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69   ** When there i
1dad0 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  s an IN operator
1dae0 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61  , we also have a
1daf0 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c   "addrNxt" label
1db00 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73   that.  ** means
1db10 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
1db20 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61  h the next IN va
1db30 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e  lue combination.
1db40 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72    When.  ** ther
1db50 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72  e are no IN oper
1db60 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e  ators in the con
1db70 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22 61  straints, the "a
1db80 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20  ddrNxt" label.  
1db90 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ** is the same a
1dba0 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a  s "addrBrk"..  *
1dbb0 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20 70 4c  /.  addrBrk = pL
1dbc0 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20  evel->addrBrk = 
1dbd0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20  pLevel->addrNxt 
1dbe0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1dbf0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64  eLabel(v);.  add
1dc00 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  rCont = pLevel->
1dc10 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74  addrCont = sqlit
1dc20 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1dc30 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  v);..  /* If thi
1dc40 73 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  s is the right t
1dc50 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f  able of a LEFT O
1dc60 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63  UTER JOIN, alloc
1dc70 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69  ate and.  ** ini
1dc80 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79  tialize a memory
1dc90 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72   cell that recor
1dca0 64 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  ds if this table
1dcb0 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 2a   matches any.  *
1dcc0 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66  * row of the lef
1dcd0 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  t table of the j
1dce0 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  oin..  */.  if( 
1dcf0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20  pLevel->iFrom>0 
1dd00 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e  && (pTabItem[0].
1dd10 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
1dd20 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c  FT)!=0 ){.    pL
1dd30 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
1dd40 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1dd50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1dd60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1dd70 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c  teger, 0, pLevel
1dd80 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
1dd90 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1dda0 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49  , "init LEFT JOI
1ddb0 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22  N no-match flag"
1ddc0 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  ));.  }..  /* Sp
1ddd0 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20  ecial case of a 
1dde0 46 52 4f 4d 20 63 6c 61 75 73 65 20 73 75 62 71  FROM clause subq
1ddf0 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64  uery implemented
1de00 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65   as a co-routine
1de10 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 49 74   */.  if( pTabIt
1de20 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
1de30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59   ){.    int regY
1de40 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d  ield = pTabItem-
1de50 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20  >regReturn;.    
1de60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1de70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1de80 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46   pTabItem->addrF
1de90 69 6c 6c 53 75 62 2d 31 2c 20 72 65 67 59 69 65  illSub-1, regYie
1dea0 6c 64 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ld);.    pLevel-
1deb0 3e 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64  >p2 =  sqlite3Vd
1dec0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
1ded0 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 29 3b  ield, regYield);
1dee0 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
1def0 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f  ((v, "next row o
1df00 66 20 63 6f 2d 72 6f 75 74 69 6e 65 20 25 73 22  f co-routine %s"
1df10 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  , pTabItem->pTab
1df20 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73  ->zName));.    s
1df30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1df40 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 59 69  (v, OP_If, regYi
1df50 65 6c 64 2b 31 2c 20 61 64 64 72 42 72 6b 29 3b  eld+1, addrBrk);
1df60 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1df70 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c  = OP_Goto;.  }el
1df80 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
1df90 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1dfa0 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 6f  ABLE.  if(  (pLo
1dfb0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1dfc0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
1dfd0 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43  )!=0 ){.    /* C
1dfe0 61 73 65 20 31 3a 20 20 54 68 65 20 74 61 62 6c  ase 1:  The tabl
1dff0 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74  e is a virtual-t
1e000 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56  able.  Use the V
1e010 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74  Filter and VNext
1e020 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1e030 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
1e040 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
1e050 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50  int iReg;   /* P
1e060 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56  3 Value for OP_V
1e070 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  Filter */.    in
1e080 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a  t addrNotFound;.
1e090 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61      int nConstra
1e0a0 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54  int = pLoop->nLT
1e0b0 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  erm;..    sqlite
1e0c0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1e0d0 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67  Parse);.    iReg
1e0e0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1e0f0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
1e100 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20  Constraint+2);. 
1e110 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20     addrNotFound 
1e120 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  = pLevel->addrBr
1e130 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  k;.    for(j=0; 
1e140 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a  j<nConstraint; j
1e150 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
1e160 54 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a 2b  Target = iReg+j+
1e170 32 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  2;.      pTerm =
1e180 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1e190 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ];.      if( pTe
1e1a0 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  rm==0 ) continue
1e1b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
1e1c0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1e1d0 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  O_IN ){.        
1e1e0 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
1e1f0 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
1e200 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c  pLevel, j, bRev,
1e210 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20   iTarget);.     
1e220 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20     addrNotFound 
1e230 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
1e240 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
1e250 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1e260 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1e270 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
1e280 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a  ight, iTarget);.
1e290 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e2a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e2b0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1e2c0 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  r, pLoop->u.vtab
1e2d0 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a  .idxNum, iReg);.
1e2e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e2f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1e300 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ger, nConstraint
1e310 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73  , iReg+1);.    s
1e320 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1e330 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20  (v, OP_VFilter, 
1e340 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75  iCur, addrNotFou
1e350 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20 20  nd, iReg,.      
1e360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e370 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
1e380 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  xStr,.          
1e390 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
1e3a0 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
1e3b0 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20  ee ? P4_MPRINTF 
1e3c0 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  : P4_STATIC);.  
1e3d0 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
1e3e0 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
1e3f0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f    for(j=0; j<nCo
1e400 6e 73 74 72 61 69 6e 74 20 26 26 20 6a 3c 31 36  nstraint && j<16
1e410 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
1e420 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  ( (pLoop->u.vtab
1e430 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26 31 20  .omitMask>>j)&1 
1e440 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  ){.        disab
1e450 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
1e460 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 29  Loop->aLTerm[j])
1e470 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e480 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1e490 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70   OP_VNext;.    p
1e4a0 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
1e4b0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
1e4c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1e4d0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
1e4e0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1e4f0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
1e500 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61  , iReg, nConstra
1e510 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69  int+2);.    sqli
1e520 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1e530 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65  pParse, 1);.  }e
1e540 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
1e550 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1e560 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28  LTABLE */..  if(
1e570 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1e580 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30   & WHERE_IPK)!=0
1e590 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77  .   && (pLoop->w
1e5a0 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
1e5b0 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f  COLUMN_IN|WHERE_
1e5c0 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20  COLUMN_EQ))!=0. 
1e5d0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
1e5e0 32 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63  2:  We can direc
1e5f0 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20  tly reference a 
1e600 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67  single row using
1e610 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   an.    **      
1e620 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d      equality com
1e630 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20  parison against 
1e640 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e  the ROWID field.
1e650 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20    Or.    **     
1e660 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63       we referenc
1e670 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
1e680 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49  using a "rowid I
1e690 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20  N (...)".    ** 
1e6a0 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75           constru
1e6b0 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ct..    */.    a
1e6c0 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e  ssert( pLoop->u.
1e6d0 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a  btree.nEq==1 );.
1e6e0 20 20 20 20 69 52 65 6c 65 61 73 65 52 65 67 20      iReleaseReg 
1e6f0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1e700 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
1e710 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e   pTerm = pLoop->
1e720 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61  aLTerm[0];.    a
1e730 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
1e740 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1e750 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29  Term->pExpr!=0 )
1e760 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d  ;.    assert( om
1e770 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
1e780 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
1e790 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
1e7a0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
1e7b0 20 69 52 6f 77 69 64 52 65 67 20 3d 20 63 6f 64   iRowidReg = cod
1e7c0 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
1e7d0 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65  arse, pTerm, pLe
1e7e0 76 65 6c 2c 20 30 2c 20 62 52 65 76 2c 20 69 52  vel, 0, bRev, iR
1e7f0 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20  eleaseReg);.    
1e800 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c  addrNxt = pLevel
1e810 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 73  ->addrNxt;.    s
1e820 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e830 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
1e840 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 61 64 64  , iRowidReg, add
1e850 72 4e 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rNxt);.    sqlit
1e860 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1e870 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43  OP_NotExists, iC
1e880 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 69 52 6f  ur, addrNxt, iRo
1e890 77 69 64 52 65 67 29 3b 0a 20 20 20 20 73 71 6c  widReg);.    sql
1e8a0 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
1e8b0 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
1e8c0 73 65 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 31  se, iRowidReg, 1
1e8d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1e8e0 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
1e8f0 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69  rse, iCur, -1, i
1e900 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56  RowidReg);.    V
1e910 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1e920 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65 76 65  pk"));.    pLeve
1e930 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  l->op = OP_Noop;
1e940 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c  .  }else if( (pL
1e950 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1e960 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20  HERE_IPK)!=0.   
1e970 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d        && (pLoop-
1e980 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1e990 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29 21 3d  _COLUMN_RANGE)!=
1e9a0 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  0.  ){.    /* Ca
1e9b0 73 65 20 33 3a 20 20 57 65 20 68 61 76 65 20 61  se 3:  We have a
1e9c0 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d  n inequality com
1e9d0 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20  parison against 
1e9e0 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e  the ROWID field.
1e9f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
1ea00 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  testOp = OP_Noop
1ea10 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b  ;.    int start;
1ea20 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56  .    int memEndV
1ea30 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57 68  alue = 0;.    Wh
1ea40 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c  ereTerm *pStart,
1ea50 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73   *pEnd;..    ass
1ea60 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
1ea70 30 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a  0 );.    j = 0;.
1ea80 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e      pStart = pEn
1ea90 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  d = 0;.    if( p
1eaa0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1eab0 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
1eac0 29 20 70 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70  ) pStart = pLoop
1ead0 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20  ->aLTerm[j++];. 
1eae0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
1eaf0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
1eb00 50 5f 4c 49 4d 49 54 20 29 20 70 45 6e 64 20 3d  P_LIMIT ) pEnd =
1eb10 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1eb20 2b 2b 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ++];.    assert(
1eb30 20 70 53 74 61 72 74 21 3d 30 20 7c 7c 20 70 45   pStart!=0 || pE
1eb40 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  nd!=0 );.    if(
1eb50 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70   bRev ){.      p
1eb60 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20  Term = pStart;. 
1eb70 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45       pStart = pE
1eb80 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d  nd;.      pEnd =
1eb90 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20   pTerm;.    }.  
1eba0 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a    if( pStart ){.
1ebb0 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20        Expr *pX; 
1ebc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ebd0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
1ebe0 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 73  at defines the s
1ebf0 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20  tart bound */.  
1ec00 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d      int r1, rTem
1ec10 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67  p;        /* Reg
1ec20 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69  isters for holdi
1ec30 6e 67 20 74 68 65 20 73 74 61 72 74 20 62 6f 75  ng the start bou
1ec40 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20  ndary */..      
1ec50 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1ec60 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54   constant maps T
1ec70 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20  K_xx codes into 
1ec80 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20  corresponding . 
1ec90 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63       ** seek opc
1eca0 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64  odes.  It depend
1ecb0 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61  s on a particula
1ecc0 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b  r ordering of TK
1ecd0 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  _xx.      */.   
1ece0 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76     const u8 aMov
1ecf0 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  eOp[] = {.      
1ed00 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f       /* TK_GT */
1ed10 20 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20    OP_SeekGt,.   
1ed20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45          /* TK_LE
1ed30 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a   */  OP_SeekLe,.
1ed40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
1ed50 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c  _LT */  OP_SeekL
1ed60 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,.           /*
1ed70 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65   TK_GE */  OP_Se
1ed80 65 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20  ekGe.      };.  
1ed90 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
1eda0 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20  E==TK_GT+1 );   
1edb0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
1edc0 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a  the ordering.. *
1edd0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1ede0 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29  TK_LT==TK_GT+2 )
1edf0 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f  ;      /*  ... o
1ee00 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75  f the TK_xx valu
1ee10 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61  es... */.      a
1ee20 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b  ssert( TK_GE==TK
1ee30 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+3 );      /*
1ee40 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63    ... is correcc
1ee50 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73  t. */..      ass
1ee60 65 72 74 28 20 28 70 53 74 61 72 74 2d 3e 77 74  ert( (pStart->wt
1ee70 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
1ee80 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  LL)==0 );.      
1ee90 74 65 73 74 63 61 73 65 28 20 70 53 74 61 72 74  testcase( pStart
1eea0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1eeb0 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
1eec0 20 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70    pX = pStart->p
1eed0 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
1eee0 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20  rt( pX!=0 );.   
1eef0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 74     testcase( pSt
1ef00 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  art->leftCursor!
1ef10 3d 69 43 75 72 20 29 3b 20 2f 2a 20 74 72 61 6e  =iCur ); /* tran
1ef20 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e  sitive constrain
1ef30 74 73 20 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d  ts */.      r1 =
1ef40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ef50 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d  Temp(pParse, pX-
1ef60 3e 70 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29  >pRight, &rTemp)
1ef70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1ef80 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f  dbeAddOp3(v, aMo
1ef90 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47  veOp[pX->op-TK_G
1efa0 54 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  T], iCur, addrBr
1efb0 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  k, r1);.      Vd
1efc0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70  beComment((v, "p
1efd0 6b 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  k"));.      sqli
1efe0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
1eff0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
1f000 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20  e, r1, 1);.     
1f010 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1f020 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1f030 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 64 69 73  Temp);.      dis
1f040 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
1f050 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65   pStart);.    }e
1f060 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1f070 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1f080 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a  bRev ? OP_Last :
1f090 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72   OP_Rewind, iCur
1f0a0 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  , addrBrk);.    
1f0b0 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29  }.    if( pEnd )
1f0c0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  {.      Expr *pX
1f0d0 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e  ;.      pX = pEn
1f0e0 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  d->pExpr;.      
1f0f0 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
1f100 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
1f110 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  pEnd->wtFlags & 
1f120 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
1f130 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f140 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73  ( pEnd->leftCurs
1f150 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54  or!=iCur ); /* T
1f160 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72  ransitive constr
1f170 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 74  aints */.      t
1f180 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77  estcase( pEnd->w
1f190 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
1f1a0 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d  RTUAL );.      m
1f1b0 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70  emEndValue = ++p
1f1c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1f1d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1f1e0 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  de(pParse, pX->p
1f1f0 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c  Right, memEndVal
1f200 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ue);.      if( p
1f210 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20  X->op==TK_LT || 
1f220 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b  pX->op==TK_GT ){
1f230 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20  .        testOp 
1f240 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a  = bRev ? OP_Le :
1f250 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65   OP_Ge;.      }e
1f260 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73  lse{.        tes
1f270 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  tOp = bRev ? OP_
1f280 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20  Lt : OP_Gt;.    
1f290 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c    }.      disabl
1f2a0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45  eTerm(pLevel, pE
1f2b0 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  nd);.    }.    s
1f2c0 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
1f2d0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1f2e0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
1f2f0 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65   = bRev ? OP_Pre
1f300 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  v : OP_Next;.   
1f310 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
1f320 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ur;.    pLevel->
1f330 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20  p2 = start;.    
1f340 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
1f350 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  p5==0 );.    if(
1f360 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70   testOp!=OP_Noop
1f370 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64   ){.      iRowid
1f380 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65  Reg = iReleaseRe
1f390 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
1f3a0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
1f3b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f3c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
1f3d0 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64  id, iCur, iRowid
1f3e0 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
1f3f0 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
1f400 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
1f410 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
1f420 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f430 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f  eAddOp3(v, testO
1f440 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20  p, memEndValue, 
1f450 61 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64 52  addrBrk, iRowidR
1f460 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
1f470 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1f480 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  , SQLITE_AFF_NUM
1f490 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55  ERIC | SQLITE_JU
1f4a0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  MPIFNULL);.    }
1f4b0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f  .  }else if( pLo
1f4c0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1f4d0 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
1f4e0 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 41 20     /* Case 4: A 
1f4f0 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e  scan using an in
1f500 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  dex..    **.    
1f510 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20 57  **         The W
1f520 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79 20  HERE clause may 
1f530 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20  contain zero or 
1f540 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a 20  more equality . 
1f550 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 65     **         te
1f560 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e  rms ("==" or "IN
1f570 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68 61  " operators) tha
1f580 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 4e  t refer to the N
1f590 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f5a0 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
1f5b0 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  s of the index. 
1f5c0 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  It may also cont
1f5d0 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ain.    **      
1f5e0 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f     inequality co
1f5f0 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c  nstraints (>, <,
1f600 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68   >= or <=) on th
1f610 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a  e indexed.    **
1f620 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
1f630 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79  that immediately
1f640 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65   follows the N e
1f650 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20  qualities. Only 
1f660 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f670 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  the right-most c
1f680 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20  olumn can be an 
1f690 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65  inequality - the
1f6a0 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20 2a   rest must.    *
1f6b0 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68  *         use th
1f6c0 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20  e "==" and "IN" 
1f6d0 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20 65  operators. For e
1f6e0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a  xample, if the .
1f6f0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69      **         i
1f700 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c  ndex is on (x,y,
1f710 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c  z), then the fol
1f720 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20 61  lowing clauses a
1f730 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20  re all .    **  
1f740 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65 64         optimized
1f750 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1f760 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a 20             x=5. 
1f770 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1f780 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20 20   x=5 AND y=10.  
1f790 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1f7a0 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20  x=5 AND y<10.   
1f7b0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
1f7c0 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20 79  =5 AND y>5 AND y
1f7d0 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  <10.    **      
1f7e0 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d        x=5 AND y=
1f7f0 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20  5 AND z<=10.    
1f800 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1f810 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d 20    The z<10 term 
1f820 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1f830 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c   cannot be used,
1f840 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20   only.    **    
1f850 20 20 20 20 20 74 68 65 20 78 3d 35 20 74 65 72       the x=5 ter
1f860 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  m:.    **.    **
1f870 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1f880 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a  AND z<10.    **.
1f890 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 4e      **         N
1f8a0 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66 20   may be zero if 
1f8b0 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61  there are inequa
1f8c0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1f8d0 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ..    **        
1f8e0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
1f8f0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
1f900 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20  traints, then N 
1f910 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20 20  is at.    **    
1f920 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a       least one..
1f930 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1f940 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65 20        This case 
1f950 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65  is also used whe
1f960 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57  n there are no W
1f970 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20  HERE clause.    
1f980 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  **         const
1f990 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e  raints but an in
1f9a0 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20  dex is selected 
1f9b0 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72  anyway, in order
1f9c0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f9d0 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74  to force the out
1f9e0 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e  put order to con
1f9f0 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52  form to an ORDER
1fa00 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20   BY..    */  .  
1fa10 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1fa20 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b  8 aStartOp[] = {
1fa30 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20  .      0,.      
1fa40 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77 69  0,.      OP_Rewi
1fa50 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  nd,           /*
1fa60 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73   2: (!start_cons
1fa70 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74  traints && start
1fa80 45 71 20 26 26 20 20 21 62 52 65 76 29 20 2a 2f  Eq &&  !bRev) */
1fa90 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20  .      OP_Last, 
1faa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33              /* 3
1fab0 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72  : (!start_constr
1fac0 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71  aints && startEq
1fad0 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a 20   &&   bRev) */. 
1fae0 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20       OP_SeekGt, 
1faf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a 20            /* 4: 
1fb00 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1fb10 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20  ts  && !startEq 
1fb20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
1fb30 20 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20     OP_SeekLt,   
1fb40 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28 73          /* 5: (s
1fb50 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1fb60 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26    && !startEq &&
1fb70 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20    bRev) */.     
1fb80 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20 20 20   OP_SeekGe,     
1fb90 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61        /* 6: (sta
1fba0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
1fbb0 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20 21  &&  startEq && !
1fbc0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
1fbd0 50 5f 53 65 65 6b 4c 65 20 20 20 20 20 20 20 20  P_SeekLe        
1fbe0 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72 74      /* 7: (start
1fbf0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
1fc00 20 20 73 74 61 72 74 45 71 20 26 26 20 20 62 52    startEq &&  bR
1fc10 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  ev) */.    };.  
1fc20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1fc30 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20  8 aEndOp[] = {. 
1fc40 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20       OP_Noop,   
1fc50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20            /* 0: 
1fc60 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74  (!end_constraint
1fc70 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49  s) */.      OP_I
1fc80 64 78 47 45 2c 20 20 20 20 20 20 20 20 20 20 20  dxGE,           
1fc90 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 1: (end_cons
1fca0 74 72 61 69 6e 74 73 20 26 26 20 21 62 52 65 76  traints && !bRev
1fcb0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64  ) */.      OP_Id
1fcc0 78 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  xLT             
1fcd0 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 2: (end_const
1fce0 72 61 69 6e 74 73 20 26 26 20 62 52 65 76 29 20  raints && bRev) 
1fcf0 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  */.    };.    in
1fd00 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  t nEq = pLoop->u
1fd10 2e 62 74 72 65 65 2e 6e 45 71 3b 20 20 2f 2a 20  .btree.nEq;  /* 
1fd20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20  Number of == or 
1fd30 49 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  IN terms */.    
1fd40 69 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d  int isMinQuery =
1fd50 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
1fd60 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
1fd70 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c 45 43 54  optimized SELECT
1fd80 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20   min(x).. */.   
1fd90 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20   int regBase;   
1fda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fdb0 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20 68   Base register h
1fdc0 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e  olding constrain
1fdd0 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20  t values */.    
1fde0 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20 20  int r1;         
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fe00 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 2a 2f  Temp register */
1fe10 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
1fe20 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b  pRangeStart = 0;
1fe30 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20    /* Inequality 
1fe40 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61  constraint at ra
1fe50 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20  nge start */.   
1fe60 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e   WhereTerm *pRan
1fe70 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a  geEnd = 0;    /*
1fe80 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   Inequality cons
1fe90 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20  traint at range 
1fea0 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  end */.    int s
1feb0 74 61 72 74 45 71 3b 20 20 20 20 20 20 20 20 20  tartEq;         
1fec0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1fed0 69 66 20 72 61 6e 67 65 20 73 74 61 72 74 20 75  if range start u
1fee0 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d  ses ==, >= or <=
1fef0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45   */.    int endE
1ff00 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
1ff10 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1ff20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d  range end uses =
1ff30 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20  =, >= or <= */. 
1ff40 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e     int start_con
1ff50 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20  straints;       
1ff60 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67  /* Start of rang
1ff70 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64  e is constrained
1ff80 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e   */.    int nCon
1ff90 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20  straint;        
1ffa0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ffb0 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  f constraint ter
1ffc0 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  ms */.    Index 
1ffd0 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
1ffe0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
1fff0 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75  dex we will be u
20000 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sing */.    int 
20010 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20 20  iIdxCur;        
20020 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20030 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
20040 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
20050 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20 3d   int nExtraReg =
20060 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
20070 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
20080 20 72 65 67 69 73 74 65 72 73 20 6e 65 65 64 65   registers neede
20090 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b  d */.    int op;
200a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200b0 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63        /* Instruc
200c0 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  tion opcode */. 
200d0 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72 74 41     char *zStartA
200e0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
200f0 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20  /* Affinity for 
20100 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 63  start of range c
20110 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
20120 20 63 68 61 72 20 2a 7a 45 6e 64 41 66 66 3b 20   char *zEndAff; 
20130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20140 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 65 6e   Affinity for en
20150 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74  d of range const
20160 72 61 69 6e 74 20 2a 2f 0a 0a 20 20 20 20 70 49  raint */..    pI
20170 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  dx = pLoop->u.bt
20180 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
20190 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
201a0 2d 3e 69 49 64 78 43 75 72 3b 0a 0a 20 20 20 20  ->iIdxCur;..    
201b0 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20  /* If this loop 
201c0 73 61 74 69 73 66 69 65 73 20 61 20 73 6f 72 74  satisfies a sort
201d0 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42 79   order (pOrderBy
201e0 29 20 72 65 71 75 65 73 74 20 74 68 61 74 20 0a  ) request that .
201f0 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65      ** was passe
20200 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
20210 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  on to implement 
20220 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  a "SELECT min(x)
20230 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75   ..." .    ** qu
20240 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61  ery, then the ca
20250 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61  ller will only a
20260 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f  llow the loop to
20270 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20   run for.    ** 
20280 61 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69  a single iterati
20290 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  on. This means t
202a0 68 61 74 20 74 68 65 20 66 69 72 73 74 20 72 6f  hat the first ro
202b0 77 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a  w returned.    *
202c0 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76  * should not hav
202d0 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73  e a NULL value s
202e0 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66  tored in 'x'. If
202f0 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20   column 'x' is. 
20300 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20     ** the first 
20310 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e 45  one after the nE
20320 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  q equality const
20330 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  raints in the in
20340 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73  dex,.    ** this
20350 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73   requires some s
20360 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e  pecial handling.
20370 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
20380 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
20390 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
203a0 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20 26  Y_MIN)!=0.     &
203b0 26 20 28 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61  & (pWInfo->bOBSa
203c0 74 21 3d 30 29 0a 20 20 20 20 20 26 26 20 28 70  t!=0).     && (p
203d0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71  Idx->nColumn>nEq
203e0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
203f0 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72  * assert( pOrder
20400 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 20  By->nExpr==1 ); 
20410 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65  */.      /* asse
20420 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  rt( pOrderBy->a[
20430 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  0].pExpr->iColum
20440 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
20450 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20 20 20  n[nEq] ); */.   
20460 20 20 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20     isMinQuery = 
20470 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52  1;.      nExtraR
20480 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  eg = 1;.    }.. 
20490 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69     /* Find any i
204a0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
204b0 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74  aint terms for t
204c0 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64  he start and end
204d0 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20   .    ** of the 
204e0 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20  range. .    */. 
204f0 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20 20 20     j = nEq;.    
20500 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
20510 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
20520 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52  IMIT ){.      pR
20530 61 6e 67 65 53 74 61 72 74 20 3d 20 70 4c 6f 6f  angeStart = pLoo
20540 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a  p->aLTerm[j++];.
20550 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20        nExtraReg 
20560 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
20570 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
20580 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
20590 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61  MIT ){.      pRa
205a0 6e 67 65 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e  ngeEnd = pLoop->
205b0 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20  aLTerm[j++];.   
205c0 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31     nExtraReg = 1
205d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
205e0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
205f0 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f   evaluate all co
20600 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75  nstraint terms u
20610 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20  sing == or IN.  
20620 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74    ** and store t
20630 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f  he values of tho
20640 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61  se terms in an a
20650 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
20660 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
20670 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20  g at regBase..  
20680 20 20 2a 2f 0a 20 20 20 20 72 65 67 42 61 73 65    */.    regBase
20690 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69   = codeAllEquali
206a0 74 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c 70  tyTerms(pParse,p
206b0 4c 65 76 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72  Level,bRev,nExtr
206c0 61 52 65 67 2c 26 7a 53 74 61 72 74 41 66 66 29  aReg,&zStartAff)
206d0 3b 0a 20 20 20 20 7a 45 6e 64 41 66 66 20 3d 20  ;.    zEndAff = 
206e0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
206f0 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a  db, zStartAff);.
20700 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c      addrNxt = pL
20710 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a  evel->addrNxt;..
20720 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
20730 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65   doing a reverse
20740 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61   order scan on a
20750 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
20760 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66  x, or.    ** a f
20770 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73 63 61  orward order sca
20780 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e  n on a descendin
20790 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68  g index, interch
207a0 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  ange the .    **
207b0 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74   start and end t
207c0 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72  erms (pRangeStar
207d0 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29  t and pRangeEnd)
207e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
207f0 20 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c   (nEq<pIdx->nCol
20800 75 6d 6e 20 26 26 20 62 52 65 76 3d 3d 28 70 49  umn && bRev==(pI
20810 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  dx->aSortOrder[n
20820 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  Eq]==SQLITE_SO_A
20830 53 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52  SC)).     || (bR
20840 65 76 20 26 26 20 70 49 64 78 2d 3e 6e 43 6f 6c  ev && pIdx->nCol
20850 75 6d 6e 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b  umn==nEq).    ){
20860 0a 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72  .      SWAP(Wher
20870 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45  eTerm *, pRangeE
20880 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29  nd, pRangeStart)
20890 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73  ;.    }..    tes
208a0 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
208b0 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74 61  rt && (pRangeSta
208c0 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
208d0 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20  WO_LE)!=0 );.   
208e0 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
208f0 65 53 74 61 72 74 20 26 26 20 28 70 52 61 6e 67  eStart && (pRang
20900 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
20910 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b  r & WO_GE)!=0 );
20920 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
20930 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61  RangeEnd && (pRa
20940 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
20950 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b  r & WO_LE)!=0 );
20960 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
20970 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61  RangeEnd && (pRa
20980 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
20990 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b  r & WO_GE)!=0 );
209a0 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 21  .    startEq = !
209b0 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 70  pRangeStart || p
209c0 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
209d0 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57  rator & (WO_LE|W
209e0 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45 71  O_GE);.    endEq
209f0 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64 20   =   !pRangeEnd 
20a00 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  || pRangeEnd->eO
20a10 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45  perator & (WO_LE
20a20 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74 61  |WO_GE);.    sta
20a30 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d  rt_constraints =
20a40 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20   pRangeStart || 
20a50 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  nEq>0;..    /* S
20a60 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63 75  eek the index cu
20a70 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rsor to the star
20a80 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  t of the range. 
20a90 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  */.    nConstrai
20aa0 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66  nt = nEq;.    if
20ab0 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 29 7b  ( pRangeStart ){
20ac0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
20ad0 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74 61 72  ght = pRangeStar
20ae0 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t->pExpr->pRight
20af0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
20b00 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
20b10 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
20b20 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nEq);.      if( 
20b30 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74  (pRangeStart->wt
20b40 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
20b50 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LL)==0 ){.      
20b60 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
20b70 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70  eIsNullJump(v, p
20b80 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e  Right, regBase+n
20b90 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  Eq, addrNxt);.  
20ba0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
20bb0 7a 53 74 61 72 74 41 66 66 20 29 7b 0a 20 20 20  zStartAff ){.   
20bc0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
20bd0 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
20be0 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66  pRight, zStartAf
20bf0 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f  f[nEq])==SQLITE_
20c00 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20  AFF_NONE){.     
20c10 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68       /* Since th
20c20 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  e comparison is 
20c30 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  to be performed 
20c40 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69  with no conversi
20c50 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ons.          **
20c60 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20   applied to the 
20c70 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68  operands, set th
20c80 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70  e affinity to ap
20c90 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f  ply to pRight to
20ca0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53   .          ** S
20cb0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20  QLITE_AFF_NONE. 
20cc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 53   */.          zS
20cd0 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53  tartAff[nEq] = S
20ce0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
20cf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20d00 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
20d10 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79  rNeedsNoAffinity
20d20 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a  Change(pRight, z
20d30 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 20 29  StartAff[nEq]) )
20d40 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61  {.          zSta
20d50 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c  rtAff[nEq] = SQL
20d60 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
20d70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
20d80 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61   .      nConstra
20d90 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73  int++;.      tes
20da0 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
20db0 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
20dc0 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
20dd0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4d 69    }else if( isMi
20de0 6e 51 75 65 72 79 20 29 7b 0a 20 20 20 20 20 20  nQuery ){.      
20df0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20e00 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
20e10 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
20e20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
20e30 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45  ++;.      startE
20e40 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61  q = 0;.      sta
20e50 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d  rt_constraints =
20e60 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f   1;.    }.    co
20e70 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
20e80 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
20e90 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 7a 53   nConstraint, zS
20ea0 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 6f 70  tartAff);.    op
20eb0 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61   = aStartOp[(sta
20ec0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c  rt_constraints<<
20ed0 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31  2) + (startEq<<1
20ee0 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61  ) + bRev];.    a
20ef0 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a  ssert( op!=0 );.
20f00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
20f10 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20  ==OP_Rewind );. 
20f20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
20f30 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20  =OP_Last );.    
20f40 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
20f50 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 74  _SeekGt );.    t
20f60 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
20f70 53 65 65 6b 47 65 20 29 3b 0a 20 20 20 20 74 65  SeekGe );.    te
20f80 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
20f90 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65 73  eekLe );.    tes
20fa0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
20fb0 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c 69  ekLt );.    sqli
20fc0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
20fd0 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c  (v, op, iIdxCur,
20fe0 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73   addrNxt, regBas
20ff0 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  e, nConstraint);
21000 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
21010 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
21020 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
21030 72 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64  raint at the end
21040 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   of the.    ** r
21050 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20  ange (if any).. 
21060 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74     */.    nConst
21070 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20  raint = nEq;.   
21080 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29   if( pRangeEnd )
21090 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
210a0 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e 64  ight = pRangeEnd
210b0 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
210c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
210d0 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
210e0 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45  arse, regBase+nE
210f0 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  q, 1);.      sql
21100 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
21110 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67  rse, pRight, reg
21120 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
21130 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64 2d   if( (pRangeEnd-
21140 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
21150 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VNULL)==0 ){.   
21160 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21170 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76  CodeIsNullJump(v
21180 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
21190 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b  e+nEq, addrNxt);
211a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
211b0 66 28 20 7a 45 6e 64 41 66 66 20 29 7b 0a 20 20  f( zEndAff ){.  
211c0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
211d0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
211e0 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66  (pRight, zEndAff
211f0 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41  [nEq])==SQLITE_A
21200 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20  FF_NONE){.      
21210 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65      /* Since the
21220 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
21230 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77  o be performed w
21240 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f  ith no conversio
21250 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ns.          ** 
21260 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f  applied to the o
21270 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65  perands, set the
21280 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70   affinity to app
21290 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20  ly to pRight to 
212a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51  .          ** SQ
212b0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20  LITE_AFF_NONE.  
212c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e  */.          zEn
212d0 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49  dAff[nEq] = SQLI
212e0 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
212f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
21300 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65  f( sqlite3ExprNe
21310 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
21320 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 45 6e 64  nge(pRight, zEnd
21330 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20  Aff[nEq]) ){.   
21340 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e         zEndAff[n
21350 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  Eq] = SQLITE_AFF
21360 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
21370 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20  .      }  .     
21380 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69   codeApplyAffini
21390 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ty(pParse, regBa
213a0 73 65 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e 64 41  se, nEq+1, zEndA
213b0 66 66 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73  ff);.      nCons
213c0 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  traint++;.      
213d0 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
213e0 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
213f0 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
21400 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
21410 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 61 72  DbFree(db, zStar
21420 74 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74  tAff);.    sqlit
21430 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 6e  e3DbFree(db, zEn
21440 64 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  dAff);..    /* T
21450 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62  op of the loop b
21460 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65  ody */.    pLeve
21470 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56  l->p2 = sqlite3V
21480 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
21490 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
214a0 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 63 75   if the index cu
214b0 72 73 6f 72 20 69 73 20 70 61 73 74 20 74 68 65  rsor is past the
214c0 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67   end of the rang
214d0 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d 20 61  e. */.    op = a
214e0 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64  EndOp[(pRangeEnd
214f0 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b 20   || nEq) * (1 + 
21500 62 52 65 76 29 5d 3b 0a 20 20 20 20 74 65 73 74  bRev)];.    test
21510 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f  case( op==OP_Noo
21520 70 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  p );.    testcas
21530 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20  e( op==OP_IdxGE 
21540 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
21550 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b   op==OP_IdxLT );
21560 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 4f 50 5f  .    if( op!=OP_
21570 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Noop ){.      sq
21580 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
21590 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75  nt(v, op, iIdxCu
215a0 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42  r, addrNxt, regB
215b0 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
215c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
215d0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
215e0 65 6e 64 45 71 21 3d 62 52 65 76 20 3f 31 3a 30  endEq!=bRev ?1:0
215f0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
21600 20 49 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   If there are in
21610 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
21620 69 6e 74 73 2c 20 63 68 65 63 6b 20 74 68 61 74  ints, check that
21630 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 2a   the value.    *
21640 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  * of the table c
21650 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 69  olumn that the i
21660 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 74 72 61  nequality contra
21670 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e  ins is not NULL.
21680 0a 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73  .    ** If it is
21690 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65  , jump to the ne
216a0 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
216b0 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  the loop..    */
216c0 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65  .    r1 = sqlite
216d0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
216e0 73 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  se);.    testcas
216f0 65 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  e( pLoop->wsFlag
21700 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
21710 4d 49 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63  MIT );.    testc
21720 61 73 65 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  ase( pLoop->wsFl
21730 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
21740 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 69 66 28  LIMIT );.    if(
21750 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
21760 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49   & (WHERE_BTM_LI
21770 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49  MIT|WHERE_TOP_LI
21780 4d 49 54 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  MIT))!=0 ){.    
21790 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
217a0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
217b0 2c 20 69 49 64 78 43 75 72 2c 20 6e 45 71 2c 20  , iIdxCur, nEq, 
217c0 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
217d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
217e0 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61  OP_IsNull, r1, a
217f0 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a  ddrCont);.    }.
21800 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
21810 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
21820 2c 20 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  , r1);..    /* S
21830 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75  eek the table cu
21840 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65  rsor, if require
21850 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65  d */.    disable
21860 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61  Term(pLevel, pRa
21870 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 64  ngeStart);.    d
21880 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
21890 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20  l, pRangeEnd);. 
218a0 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c     if( !omitTabl
218b0 65 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69  e ){.      iRowi
218c0 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52  dReg = iReleaseR
218d0 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
218e0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
218f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21900 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
21910 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c  xRowid, iIdxCur,
21920 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
21930 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
21940 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
21950 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69   iCur, -1, iRowi
21960 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
21970 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21980 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c  , OP_Seek, iCur,
21990 20 69 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a   iRowidReg);  /*
219a0 20 44 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a   Deferred seek *
219b0 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  /.    }..    /* 
219c0 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72  Record the instr
219d0 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74  uction used to t
219e0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
219f0 70 2e 20 44 69 73 61 62 6c 65 20 0a 20 20 20 20  p. Disable .    
21a00 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
21a10 74 65 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e  terms made redun
21a20 64 61 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65  dant by the inde
21a30 78 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20  x range scan..  
21a40 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f    */.    if( pLo
21a50 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
21a60 45 52 45 5f 4f 4e 45 52 4f 57 20 29 7b 0a 20 20  ERE_ONEROW ){.  
21a70 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
21a80 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65   OP_Noop;.    }e
21a90 6c 73 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a  lse if( bRev ){.
21aa0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
21ab0 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20   = OP_Prev;.    
21ac0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
21ad0 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78  vel->op = OP_Nex
21ae0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65  t;.    }.    pLe
21af0 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75  vel->p1 = iIdxCu
21b00 72 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  r;.    if( (pLoo
21b10 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
21b20 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 3d 3d  RE_CONSTRAINT)==
21b30 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  0 ){.      pLeve
21b40 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53  l->p5 = SQLITE_S
21b50 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
21b60 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c  AN_STEP;.    }el
21b70 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
21b80 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20  ( pLevel->p5==0 
21b90 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
21ba0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
21bb0 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
21bc0 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 6f 6f  ATION.  if( pLoo
21bd0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
21be0 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
21bf0 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54     /* Case 5:  T
21c00 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
21c10 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65  ately indexed te
21c20 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
21c30 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   OR.    **.    *
21c40 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
21c50 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  *.    **   CREAT
21c60 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63  E TABLE t1(a,b,c
21c70 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  ,d);.    **   CR
21c80 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
21c90 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(a);.    **  
21ca0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
21cb0 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a   ON t1(b);.    *
21cc0 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
21cd0 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20   i3 ON t1(c);.  
21ce0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
21cf0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
21d00 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20  HERE a=5 OR b=7 
21d10 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31  OR (c=11 AND d=1
21d20 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  3).    **.    **
21d30 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c   In the example,
21d40 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65   there are three
21d50 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
21d60 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a  onnected by OR..
21d70 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f      ** The top o
21d80 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73  f the loop looks
21d90 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
21da0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
21db0 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
21dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
21dd0 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
21de0 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
21df0 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f  .    ** Then, fo
21e00 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74  r each indexed t
21e10 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  erm, the followi
21e20 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  ng. The argument
21e30 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53  s to.    ** RowS
21e40 65 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20  etTest are such 
21e50 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f  that the rowid o
21e60 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
21e70 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20  w is inserted.  
21e80 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f    ** into the Ro
21e90 77 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61  wSet. If it is a
21ea0 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20  lready present, 
21eb0 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68  control skips th
21ec0 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f  e.    ** Gosub o
21ed0 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20  pcode and jumps 
21ee0 73 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20  straight to the 
21ef0 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
21f00 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20  y WhereEnd()..  
21f10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
21f20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
21f30 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20  egin(<term>).   
21f40 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77   **          Row
21f50 53 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20  SetTest         
21f60 20 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72           # Inser
21f70 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77  t rowid into row
21f80 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  set.    **      
21f90 20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32      Gosub      2
21fa0 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   A.    **       
21fb0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
21fc0 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ().    **.    **
21fd0 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61   Following the a
21fe0 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65  bove, code to te
21ff0 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
22000 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74  . Label A, the t
22010 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20  arget.    ** of 
22020 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c  the Gosub above,
22030 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e   jumps to the in
22040 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20  struction right 
22050 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a  after the Goto..
22060 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
22070 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20         Null     
22080 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
22090 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f     # Zero the ro
220a0 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20  wset in reg 1.  
220b0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
220c0 74 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20  to       B      
220d0 20 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20            # The 
220e0 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64  loop is finished
220f0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
22100 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62        A: <loop b
22110 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20  ody>            
22120 20 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61       # Return da
22130 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20  ta, whatever..  
22140 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
22150 20 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20       Return     
22160 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
22170 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20   # Jump back to 
22180 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a  the Gosub.    **
22190 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a  .    **       B:
221a0 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70   <after the loop
221b0 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a  >.    **.    */.
221c0 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
221d0 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68  *pOrWc;    /* Th
221e0 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b  e OR-clause brok
221f0 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74  en out into subt
22200 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c  erms */.    SrcL
22210 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20 20  ist *pOrTab;    
22220 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20     /* Shortened 
22230 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52  table list or OR
22240 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74 69  -clause generati
22250 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  on */.    Index 
22260 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20 20 20  *pCov = 0;      
22270 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74         /* Potent
22280 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ial covering ind
22290 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ex (or NULL) */.
222a0 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75 72 20      int iCovCur 
222b0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
222c0 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65  ;  /* Cursor use
222d0 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63 61 6e  d for index scan
222e0 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20  s (if any) */.. 
222f0 20 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e     int regReturn
22300 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
22310 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
22320 52 65 67 69 73 74 65 72 20 75 73 65 64 20 77 69  Register used wi
22330 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20  th OP_Gosub */. 
22340 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73 65 74     int regRowset
22350 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
22360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22370 52 65 67 69 73 74 65 72 20 66 6f 72 20 52 6f 77  Register for Row
22380 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  Set object */.  
22390 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d    int regRowid =
223a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
223b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
223c0 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
223d0 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74  rowid */.    int
223e0 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c   iLoopBody = sql
223f0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
22400 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72 74 20  l(v);  /* Start 
22410 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a  of loop body */.
22420 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e 69 74      int iRetInit
22430 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22450 20 41 64 64 72 65 73 73 20 6f 66 20 72 65 67 52   Address of regR
22460 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20  eturn init */.  
22470 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64 54 65    int untestedTe
22480 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  rms = 0;        
22490 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72       /* Some ter
224a0 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  ms not completel
224b0 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 20 20  y tested */.    
224c0 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
224d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224e0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
224f0 65 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  er */.    Expr *
22500 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20 20  pAndExpr = 0;   
22510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22520 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29  An ".. AND (...)
22530 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  " expression */.
22540 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20     .    pTerm = 
22550 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  pLoop->aLTerm[0]
22560 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
22570 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  erm!=0 );.    as
22580 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
22590 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29  erator & WO_OR )
225a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
225b0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
225c0 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20  TERM_ORINFO)!=0 
225d0 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26  );.    pOrWc = &
225e0 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
225f0 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c  ->wc;.    pLevel
22600 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e  ->op = OP_Return
22610 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
22620 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20   = regReturn;.. 
22630 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e     /* Set up a n
22640 65 77 20 53 72 63 4c 69 73 74 20 69 6e 20 70 4f  ew SrcList in pO
22650 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rTab containing 
22660 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
22670 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62  scanned.    ** b
22680 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74  y this loop in t
22690 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64  he a[0] slot and
226a0 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61   all notReady ta
226b0 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73  bles in a[1..] s
226c0 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69  lots..    ** Thi
226d0 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72  s becomes the Sr
226e0 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65 63  cList in the rec
226f0 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73  ursive call to s
22700 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
22710 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ()..    */.    i
22720 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  f( pWInfo->nLeve
22730 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  l>1 ){.      int
22740 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20   nNotReady;     
22750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22760 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74  he number of not
22770 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a  Ready tables */.
22780 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
22790 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53  List_item *origS
227a0 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  rc;     /* Origi
227b0 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c  nal list of tabl
227c0 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74  es */.      nNot
227d0 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e  Ready = pWInfo->
227e0 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20  nLevel - iLevel 
227f0 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61  - 1;.      pOrTa
22800 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b  b = sqlite3Stack
22810 41 6c 6c 6f 63 52 61 77 28 64 62 2c 0a 20 20 20  AllocRaw(db,.   
22820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22830 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
22840 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65  *pOrTab)+ nNotRe
22850 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61  ady*sizeof(pOrTa
22860 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20  b->a[0]));.     
22870 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20 29   if( pOrTab==0 )
22880 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79   return notReady
22890 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e  ;.      pOrTab->
228a0 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29 28 6e 4e  nAlloc = (u8)(nN
228b0 6f 74 52 65 61 64 79 20 2b 20 31 29 3b 0a 20 20  otReady + 1);.  
228c0 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63      pOrTab->nSrc
228d0 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f   = pOrTab->nAllo
228e0 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  c;.      memcpy(
228f0 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61 62 49  pOrTab->a, pTabI
22900 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61  tem, sizeof(*pTa
22910 62 49 74 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f  bItem));.      o
22920 72 69 67 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d  rigSrc = pWInfo-
22930 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20  >pTabList->a;.  
22940 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d      for(k=1; k<=
22950 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b  nNotReady; k++){
22960 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
22970 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26  &pOrTab->a[k], &
22980 6f 72 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b  origSrc[pLevel[k
22990 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66  ].iFrom], sizeof
229a0 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b  (pOrTab->a[k]));
229b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
229c0 73 65 7b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  se{.      pOrTab
229d0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
229e0 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ist;.    }..    
229f0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
22a00 65 20 72 6f 77 73 65 74 20 72 65 67 69 73 74 65  e rowset registe
22a10 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c  r to contain NUL
22a20 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69  L. An SQL NULL i
22a30 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76 61  s .    ** equiva
22a40 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74 79  lent to an empty
22a50 20 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a   rowset..    **.
22a60 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74      ** Also init
22a70 69 61 6c 69 7a 65 20 72 65 67 52 65 74 75 72 6e  ialize regReturn
22a80 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
22a90 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69  address of the i
22aa0 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20 20 20 20  nstruction .    
22ab0 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ** immediately f
22ac0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f  ollowing the OP_
22ad0 52 65 74 75 72 6e 20 61 74 20 74 68 65 20 62 6f  Return at the bo
22ae0 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ttom of the loop
22af0 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73  . This.    ** is
22b00 20 72 65 71 75 69 72 65 64 20 69 6e 20 61 20 66   required in a f
22b10 65 77 20 6f 62 73 63 75 72 65 20 4c 45 46 54 20  ew obscure LEFT 
22b20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68 65 72 65  JOIN cases where
22b30 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20   control jumps. 
22b40 20 20 20 2a 2a 20 6f 76 65 72 20 74 68 65 20 74     ** over the t
22b50 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  op of the loop i
22b60 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20  nto the body of 
22b70 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  it. In this case
22b80 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72   the .    ** cor
22b90 72 65 63 74 20 72 65 73 70 6f 6e 73 65 20 66 6f  rect response fo
22ba0 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f  r the end-of-loo
22bb0 70 20 63 6f 64 65 20 28 74 68 65 20 4f 50 5f 52  p code (the OP_R
22bc0 65 74 75 72 6e 29 20 69 73 20 74 6f 20 0a 20 20  eturn) is to .  
22bd0 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67    ** fall throug
22be0 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
22bf0 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20  struction, just 
22c00 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f  as an OP_Next do
22c10 65 73 20 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c  es if.    ** cal
22c20 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74  led on an uninit
22c30 69 61 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a  ialized cursor..
22c40 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
22c50 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
22c60 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49  gs & WHERE_DUPLI
22c70 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a  CATES_OK)==0 ){.
22c80 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20        regRowset 
22c90 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
22ca0 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64  ;.      regRowid
22cb0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
22cc0 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
22cd0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
22ce0 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77  _Null, 0, regRow
22cf0 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  set);.    }.    
22d00 69 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74  iRetInit = sqlit
22d10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22d20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
22d30 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20  egReturn);..    
22d40 2f 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  /* If the origin
22d50 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  al WHERE clause 
22d60 69 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d  is z of the form
22d70 3a 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20  :  (x1 OR x2 OR 
22d80 2e 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a  ...) AND y.    *
22d90 2a 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79  * Then for every
22da0 20 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61   term xN, evalua
22db0 74 65 20 61 73 20 74 68 65 20 73 75 62 65 78 70  te as the subexp
22dc0 72 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20  ression: xN AND 
22dd0 7a 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61  z.    ** That wa
22de0 79 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68  y, terms in y th
22df0 61 74 20 61 72 65 20 66 61 63 74 6f 72 65 64 20  at are factored 
22e00 69 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63  into the disjunc
22e10 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  tion will.    **
22e20 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 62 79   be picked up by
22e30 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63   the recursive c
22e40 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57  alls to sqlite3W
22e50 68 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f  hereBegin() belo
22e60 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  w..    **.    **
22e70 20 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20   Actually, each 
22e80 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
22e90 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78   converted to "x
22ea0 4e 20 41 4e 44 20 77 22 20 77 68 65 72 65 20 77  N AND w" where w
22eb0 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22   is.    ** the "
22ec0 69 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65 72  interesting" ter
22ed0 6d 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20  ms of z - terms 
22ee0 74 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69  that did not ori
22ef0 67 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20  ginate in the.  
22f00 20 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47    ** ON or USING
22f10 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46   clause of a LEF
22f20 54 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d  T JOIN, and term
22f30 73 20 74 68 61 74 20 61 72 65 20 75 73 61 62 6c  s that are usabl
22f40 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64  e as .    ** ind
22f50 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ices..    **.   
22f60 20 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a   ** This optimiz
22f70 61 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20  ation also only 
22f80 61 70 70 6c 69 65 73 20 69 66 20 74 68 65 20 28  applies if the (
22f90 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29  x1 OR x2 OR ...)
22fa0 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20   term.    ** is 
22fb0 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
22fc0 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f   the ON clause o
22fd0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20  f a LEFT JOIN.. 
22fe0 20 20 20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74     ** See ticket
22ff0 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69   http://www.sqli
23000 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f  te.org/src/info/
23010 66 32 33 36 39 33 30 34 65 34 0a 20 20 20 20 2a  f2369304e4.    *
23020 2f 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 6e  /.    if( pWC->n
23030 54 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20  Term>1 ){.      
23040 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 20  int iTerm;.     
23050 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69 54   for(iTerm=0; iT
23060 65 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  erm<pWC->nTerm; 
23070 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  iTerm++){.      
23080 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
23090 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45  pWC->a[iTerm].pE
230a0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
230b0 20 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20   &pWC->a[iTerm] 
230c0 3d 3d 20 70 54 65 72 6d 20 29 20 63 6f 6e 74 69  == pTerm ) conti
230d0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
230e0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
230f0 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
23100 6f 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  oin) ) continue;
23110 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57 43  .        if( pWC
23120 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61  ->a[iTerm].wtFla
23130 67 73 20 26 20 28 54 45 52 4d 5f 4f 52 49 4e 46  gs & (TERM_ORINF
23140 4f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  O) ) continue;. 
23150 20 20 20 20 20 20 20 69 66 28 20 28 70 57 43 2d         if( (pWC-
23160 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61  >a[iTerm].eOpera
23170 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30  tor & WO_ALL)==0
23180 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23190 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
231a0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
231b0 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
231c0 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71     pAndExpr = sq
231d0 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
231e0 20 70 41 6e 64 45 78 70 72 2c 20 70 45 78 70 72   pAndExpr, pExpr
231f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
23200 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b   if( pAndExpr ){
23210 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70  .        pAndExp
23220 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
23230 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c  (pParse, TK_AND,
23240 20 30 2c 20 70 41 6e 64 45 78 70 72 2c 20 30 29   0, pAndExpr, 0)
23250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23260 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
23270 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20  i<pOrWc->nTerm; 
23280 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65  ii++){.      Whe
23290 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20  reTerm *pOrTerm 
232a0 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b  = &pOrWc->a[ii];
232b0 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
232c0 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
232d0 69 43 75 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d  iCur || (pOrTerm
232e0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
232f0 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  _AND)!=0 ){.    
23300 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70      WhereInfo *p
23310 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  SubWInfo;       
23320 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73     /* Info for s
23330 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63  ingle OR-term sc
23340 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  an */.        Ex
23350 70 72 20 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f  pr *pOrExpr = pO
23360 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  rTerm->pExpr;.  
23370 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78        if( pAndEx
23380 70 72 20 26 26 20 21 45 78 70 72 48 61 73 50 72  pr && !ExprHasPr
23390 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c 20  operty(pOrExpr, 
233a0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
233b0 20 20 20 20 20 20 20 20 20 20 70 41 6e 64 45 78            pAndEx
233c0 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45  pr->pLeft = pOrE
233d0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  xpr;.          p
233e0 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78 70  OrExpr = pAndExp
233f0 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
23400 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
23410 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69  ough table entri
23420 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65  es that match te
23430 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20  rm pOrTerm. */. 
23440 20 20 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f         pSubWInfo
23450 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
23460 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 4f 72  egin(pParse, pOr
23470 54 61 62 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c  Tab, pOrExpr, 0,
23480 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
23490 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
234a0 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53  E_OMIT_OPEN_CLOS
234b0 45 20 7c 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e  E | WHERE_AND_ON
234c0 4c 59 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  LY |.           
234d0 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
234e0 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c  RE_FORCE_TABLE |
234f0 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
23500 4f 4e 4c 59 2c 20 69 43 6f 76 43 75 72 29 3b 0a  ONLY, iCovCur);.
23510 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23520 70 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61  pSubWInfo || pPa
23530 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
23540 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
23550 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75  .        if( pSu
23560 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  bWInfo ){.      
23570 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
23580 53 75 62 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  SubLoop;.       
23590 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61     explainOneSca
235a0 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n(.             
235b0 20 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c   pParse, pOrTab,
235c0 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30   &pSubWInfo->a[0
235d0 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65  ], iLevel, pLeve
235e0 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20  l->iFrom, 0.    
235f0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
23600 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
23610 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
23620 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b  RE_DUPLICATES_OK
23630 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
23640 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28      int iSet = (
23650 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  (ii==pOrWc->nTer
23660 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20  m-1)?-1:ii);.   
23670 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a           int r;.
23680 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20              r = 
23690 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
236a0 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
236b0 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c   pTabItem->pTab,
236c0 20 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20 20 20   -1, iCur, .    
236d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236f0 20 20 20 20 20 72 65 67 52 6f 77 69 64 2c 20 30       regRowid, 0
23700 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
23710 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
23720 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74  Int(v, OP_RowSet
23730 54 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c  Test, regRowset,
23740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23760 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
23770 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72  rentAddr(v)+2, r
23780 2c 20 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20  , iSet);.       
23790 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
237a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
237b0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
237c0 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f  gReturn, iLoopBo
237d0 64 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  dy);..          
237e0 2f 2a 20 54 68 65 20 70 53 75 62 57 49 6e 66 6f  /* The pSubWInfo
237f0 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
23800 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20  flag means that 
23810 74 68 69 73 20 4f 52 20 74 65 72 6d 0a 20 20 20  this OR term.   
23820 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
23830 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ned one or more 
23840 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20 61 20  AND term from a 
23850 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 2e 20  notReady table. 
23860 20 54 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   The.          *
23870 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  * terms from the
23880 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 20   notReady table 
23890 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 65 73  could not be tes
238a0 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20  ted and will.   
238b0 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74         ** need t
238c0 6f 20 62 65 20 74 65 73 74 65 64 20 6c 61 74 65  o be tested late
238d0 72 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  r..          */.
238e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
238f0 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65  ubWInfo->unteste
23900 64 54 65 72 6d 73 20 29 20 75 6e 74 65 73 74 65  dTerms ) unteste
23910 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20  dTerms = 1;..   
23920 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
23930 20 6f 66 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65   of the OR-conne
23940 63 74 65 64 20 74 65 72 6d 73 20 61 72 65 20 6f  cted terms are o
23950 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 74  ptimized using t
23960 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20  he same.        
23970 20 20 2a 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20    ** index, and 
23980 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f 70 65  the index is ope
23990 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61  ned using the sa
239a0 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  me cursor number
239b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79  .          ** by
239c0 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71   each call to sq
239d0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
239e0 29 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 6c  ) made by this l
239f0 6f 6f 70 2c 20 69 74 20 6d 61 79 0a 20 20 20 20  oop, it may.    
23a00 20 20 20 20 20 20 2a 2a 20 62 65 20 70 6f 73 73        ** be poss
23a10 69 62 6c 65 20 74 6f 20 75 73 65 20 74 68 61 74  ible to use that
23a20 20 69 6e 64 65 78 20 61 73 20 61 20 63 6f 76 65   index as a cove
23a30 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20 20  ring index..    
23a40 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
23a50 20 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c     ** If the cal
23a60 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  l to sqlite3Wher
23a70 65 42 65 67 69 6e 28 29 20 61 62 6f 76 65 20 72  eBegin() above r
23a80 65 73 75 6c 74 65 64 20 69 6e 20 61 20 73 63 61  esulted in a sca
23a90 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  n that.         
23aa0 20 2a 2a 20 75 73 65 73 20 61 6e 20 69 6e 64 65   ** uses an inde
23ab0 78 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 65  x, and this is e
23ac0 69 74 68 65 72 20 74 68 65 20 66 69 72 73 74 20  ither the first 
23ad0 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72  OR-connected ter
23ae0 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  m.          ** p
23af0 72 6f 63 65 73 73 65 64 20 6f 72 20 74 68 65 20  rocessed or the 
23b00 69 6e 64 65 78 20 69 73 20 74 68 65 20 73 61 6d  index is the sam
23b10 65 20 61 73 20 74 68 61 74 20 75 73 65 64 20 62  e as that used b
23b20 79 20 61 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20  y all previous. 
23b30 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d           ** term
23b40 73 2c 20 73 65 74 20 70 43 6f 76 20 74 6f 20 74  s, set pCov to t
23b50 68 65 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76  he candidate cov
23b60 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68  ering index. Oth
23b70 65 72 77 69 73 65 2c 20 73 65 74 20 0a 20 20 20  erwise, set .   
23b80 20 20 20 20 20 20 20 2a 2a 20 70 43 6f 76 20 74         ** pCov t
23b90 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61  o NULL to indica
23ba0 74 65 20 74 68 61 74 20 6e 6f 20 63 61 6e 64 69  te that no candi
23bb0 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e  date covering in
23bc0 64 65 78 20 77 69 6c 6c 20 0a 20 20 20 20 20 20  dex will .      
23bd0 20 20 20 20 2a 2a 20 62 65 20 61 76 61 69 6c 61      ** be availa
23be0 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ble..          *
23bf0 2f 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62  /.          pSub
23c00 4c 6f 6f 70 20 3d 20 70 53 75 62 57 49 6e 66 6f  Loop = pSubWInfo
23c10 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20  ->a[0].pWLoop;. 
23c20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
23c30 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c   (pSubLoop->wsFl
23c40 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
23c50 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20  _INDEX)==0 );.  
23c60 20 20 20 20 20 20 20 20 69 66 28 20 28 70 53 75          if( (pSu
23c70 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  bLoop->wsFlags &
23c80 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
23c90 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
23ca0 20 28 69 69 3d 3d 30 20 7c 7c 20 70 53 75 62 4c   (ii==0 || pSubL
23cb0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
23cc0 64 65 78 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20  dex==pCov).     
23cd0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
23ce0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
23cf0 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78  WInfo->a[0].iIdx
23d00 43 75 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b 0a  Cur==iCovCur );.
23d10 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76              pCov
23d20 20 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62   = pSubLoop->u.b
23d30 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
23d40 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23d50 20 20 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d            pCov =
23d60 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
23d70 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  .          /* Fi
23d80 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70 20 74 68  nish the loop th
23d90 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72  rough table entr
23da0 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  ies that match t
23db0 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a  erm pOrTerm. */.
23dc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23dd0 33 57 68 65 72 65 45 6e 64 28 70 53 75 62 57 49  3WhereEnd(pSubWI
23de0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nfo);.        }.
23df0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23e00 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76    pLevel->u.pCov
23e10 69 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20  idx = pCov;.    
23e20 69 66 28 20 70 43 6f 76 20 29 20 70 4c 65 76 65  if( pCov ) pLeve
23e30 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 43 6f  l->iIdxCur = iCo
23e40 76 43 75 72 3b 0a 20 20 20 20 69 66 28 20 70 41  vCur;.    if( pA
23e50 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  ndExpr ){.      
23e60 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20  pAndExpr->pLeft 
23e70 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
23e80 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
23e90 20 70 41 6e 64 45 78 70 72 29 3b 0a 20 20 20 20   pAndExpr);.    
23ea0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
23eb0 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52 65  eChangeP1(v, iRe
23ec0 74 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56 64  tInit, sqlite3Vd
23ed0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
23ee0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
23ef0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
23f00 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  oto, 0, pLevel->
23f10 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 73 71  addrBrk);.    sq
23f20 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
23f30 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f  Label(v, iLoopBo
23f40 64 79 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 57  dy);..    if( pW
23f50 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29  Info->nLevel>1 )
23f60 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65   sqlite3StackFre
23f70 65 28 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20  e(db, pOrTab);. 
23f80 20 20 20 69 66 28 20 21 75 6e 74 65 73 74 65 64     if( !untested
23f90 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65 54  Terms ) disableT
23fa0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
23fb0 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  m);.  }else.#end
23fc0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
23fd0 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
23fe0 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a  N */..  {.    /*
23ff0 20 43 61 73 65 20 36 3a 20 20 54 68 65 72 65 20   Case 6:  There 
24000 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64  is no usable ind
24010 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20  ex.  We must do 
24020 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a  a complete.    *
24030 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e 20  *          scan 
24040 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 61  of the entire ta
24050 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
24060 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
24070 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e  aStep[] = { OP_N
24080 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a  ext, OP_Prev };.
24090 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
240a0 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b   u8 aStart[] = {
240b0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c   OP_Rewind, OP_L
240c0 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72  ast };.    asser
240d0 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52  t( bRev==0 || bR
240e0 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 70 4c 65  ev==1 );.    pLe
240f0 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b  vel->op = aStep[
24100 62 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65  bRev];.    pLeve
24110 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
24120 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31    pLevel->p2 = 1
24130 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
24140 64 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62  dOp2(v, aStart[b
24150 52 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72  Rev], iCur, addr
24160 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Brk);.    pLevel
24170 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54  ->p5 = SQLITE_ST
24180 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
24190 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 65  N_STEP;.  }.  ne
241a0 77 4e 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74 52  wNotReady = notR
241b0 65 61 64 79 20 26 20 7e 67 65 74 4d 61 73 6b 28  eady & ~getMask(
241c0 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
241d0 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20  t, iCur);..  /* 
241e0 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74  Insert code to t
241f0 65 73 74 20 65 76 65 72 79 20 73 75 62 65 78 70  est every subexp
24200 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e  ression that can
24210 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20   be completely. 
24220 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69   ** computed usi
24230 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ng the current s
24240 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20  et of tables..  
24250 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  */.  for(pTerm=p
24260 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54  WC->a, j=pWC->nT
24270 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  erm; j>0; j--, p
24280 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Term++){.    Exp
24290 72 20 2a 70 45 3b 0a 20 20 20 20 74 65 73 74 63  r *pE;.    testc
242a0 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
242b0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
242c0 41 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  AL );.    testca
242d0 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
242e0 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20  gs & TERM_CODED 
242f0 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
24300 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
24310 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
24320 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
24330 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
24340 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 65  ->prereqAll & ne
24350 77 4e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b  wNotReady)!=0 ){
24360 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
24370 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
24380 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20  dTerms==0.      
24390 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
243a0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
243b0 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
243c0 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20  _ONLY)!=0 );.   
243d0 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73     pWInfo->untes
243e0 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20  tedTerms = 1;.  
243f0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
24400 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65    }.    pE = pTe
24410 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61  rm->pExpr;.    a
24420 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a  ssert( pE!=0 );.
24430 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
24440 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78  iLeftJoin && !Ex
24450 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
24460 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
24470 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
24480 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
24490 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
244a0 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43  Parse, pE, addrC
244b0 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
244c0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65  IFNULL);.    pTe
244d0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
244e0 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a  ERM_CODED;.  }..
244f0 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65    /* Insert code
24500 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6d 70   to test for imp
24510 6c 69 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73  lied constraints
24520 20 62 61 73 65 64 20 6f 6e 20 74 72 61 6e 73 69   based on transi
24530 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74  tivity.  ** of t
24540 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72  he "==" operator
24550 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
24560 70 6c 65 3a 20 49 66 20 74 68 65 20 57 48 45 52  ple: If the WHER
24570 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
24580 73 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e  s "t1.a=t2.b" an
24590 64 20 22 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a  d "t2.b=123".  *
245a0 2a 20 61 6e 64 20 77 65 20 61 72 65 20 63 6f 64  * and we are cod
245b0 69 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ing the t1 loop 
245c0 61 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f 70 20  and the t2 loop 
245d0 68 61 73 20 6e 6f 74 20 79 65 74 20 63 6f 64 65  has not yet code
245e0 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65 20  d,.  ** then we 
245f0 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20 22  cannot use the "
24600 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74  t1.a=t2.b" const
24610 72 61 69 6e 74 2c 20 62 75 74 20 77 65 20 63 61  raint, but we ca
24620 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20  n code.  ** the 
24630 69 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d 31 32  implied "t1.a=12
24640 33 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  3" constraint.. 
24650 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   */.  for(pTerm=
24660 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e  pWC->a, j=pWC->n
24670 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
24680 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
24690 70 72 20 2a 70 45 2c 20 2a 70 45 41 6c 74 3b 0a  pr *pE, *pEAlt;.
246a0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
246b0 41 6c 74 3b 0a 20 20 20 20 69 66 28 20 70 54 65  Alt;.    if( pTe
246c0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
246d0 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
246e0 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
246f0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
24700 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28 57  m->eOperator!=(W
24710 4f 5f 45 51 55 49 56 7c 57 4f 5f 45 51 29 20 29  O_EQUIV|WO_EQ) )
24720 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
24730 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
24740 72 73 6f 72 21 3d 69 43 75 72 20 29 20 63 6f 6e  rsor!=iCur ) con
24750 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
24760 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
24770 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
24780 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pE = pTerm->pEx
24790 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
247a0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
247b0 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  (pE, EP_FromJoin
247c0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
247d0 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
247e0 69 67 68 74 20 26 20 6e 65 77 4e 6f 74 52 65 61  ight & newNotRea
247f0 64 79 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 41  dy)!=0 );.    pA
24800 6c 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  lt = findTerm(pW
24810 43 2c 20 69 43 75 72 2c 20 70 54 65 72 6d 2d 3e  C, iCur, pTerm->
24820 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f  u.leftColumn, no
24830 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f  tReady, WO_EQ|WO
24840 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  _IN, 0);.    if(
24850 20 70 41 6c 74 3d 3d 30 20 29 20 63 6f 6e 74 69   pAlt==0 ) conti
24860 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 41 6c  nue;.    if( pAl
24870 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  t->wtFlags & (TE
24880 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
24890 69 6e 75 65 3b 0a 20 20 20 20 74 65 73 74 63 61  inue;.    testca
248a0 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61  se( pAlt->eOpera
248b0 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20  tor & WO_EQ );. 
248c0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41 6c     testcase( pAl
248d0 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
248e0 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 56 64 62 65  O_IN );.    Vdbe
248f0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
24900 22 62 65 67 69 6e 20 74 72 61 6e 73 69 74 69 76  "begin transitiv
24910 65 20 63 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b  e constraint"));
24920 0a 20 20 20 20 70 45 41 6c 74 20 3d 20 73 71 6c  .    pEAlt = sql
24930 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61  ite3StackAllocRa
24940 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 45  w(db, sizeof(*pE
24950 41 6c 74 29 29 3b 0a 20 20 20 20 69 66 28 20 70  Alt));.    if( p
24960 45 41 6c 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  EAlt ){.      *p
24970 45 41 6c 74 20 3d 20 2a 70 41 6c 74 2d 3e 70 45  EAlt = *pAlt->pE
24980 78 70 72 3b 0a 20 20 20 20 20 20 70 45 41 6c 74  xpr;.      pEAlt
24990 2d 3e 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c  ->pLeft = pE->pL
249a0 65 66 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eft;.      sqlit
249b0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
249c0 61 72 73 65 2c 20 70 45 41 6c 74 2c 20 61 64 64  arse, pEAlt, add
249d0 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55  rCont, SQLITE_JU
249e0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
249f0 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65   sqlite3StackFre
24a00 65 28 64 62 2c 20 70 45 41 6c 74 29 3b 0a 20 20  e(db, pEAlt);.  
24a10 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f    }.  }..  /* Fo
24a20 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  r a LEFT OUTER J
24a30 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f  OIN, generate co
24a40 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63  de that will rec
24a50 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
24a60 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20  t.  ** at least 
24a70 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  one row of the r
24a80 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d  ight table has m
24a90 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20  atched the left 
24aa0 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20  table.  .  */.  
24ab0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
24ac0 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65  tJoin ){.    pLe
24ad0 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d  vel->addrFirst =
24ae0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
24af0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
24b00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24b10 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
24b20 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   1, pLevel->iLef
24b30 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65  tJoin);.    Vdbe
24b40 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63  Comment((v, "rec
24b50 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69  ord LEFT JOIN hi
24b60 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t"));.    sqlite
24b70 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
24b80 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72  pParse);.    for
24b90 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
24ba0 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d  =0; j<pWC->nTerm
24bb0 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
24bc0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
24bd0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
24be0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
24bf0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
24c00 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
24c10 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b   & TERM_CODED );
24c20 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
24c30 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
24c40 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
24c50 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
24c60 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
24c70 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
24c80 6e 65 77 4e 6f 74 52 65 61 64 79 29 21 3d 30 20  newNotReady)!=0 
24c90 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
24ca0 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  t( pWInfo->untes
24cb0 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20  tedTerms );.    
24cc0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
24cd0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
24ce0 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
24cf0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
24d00 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
24d10 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  rse, pTerm->pExp
24d20 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  r, addrCont, SQL
24d30 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
24d40 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
24d50 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
24d60 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  DED;.    }.  }. 
24d70 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
24d80 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69  empReg(pParse, i
24d90 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20 20  ReleaseReg);..  
24da0 72 65 74 75 72 6e 20 6e 65 77 4e 6f 74 52 65 61  return newNotRea
24db0 64 79 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48  dy;.}..#ifdef WH
24dc0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
24dd0 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57  ./*.** Print a W
24de0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
24df0 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70 75  for debugging pu
24e00 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63  rposes.*/.static
24e10 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50   void whereLoopP
24e20 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a  rint(WhereLoop *
24e30 70 2c 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  p, SrcList *pTab
24e40 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 6e 62 20  List){.  int nb 
24e50 3d 20 31 2b 28 70 54 61 62 4c 69 73 74 2d 3e 6e  = 1+(pTabList->n
24e60 53 72 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75  Src+7)/8;.  stru
24e70 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
24e80 2a 70 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73  *pItem = pTabLis
24e90 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a  t->a + p->iTab;.
24ea0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
24eb0 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73  pItem->pTab;.  s
24ec0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24ed0 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e  f("%c%2d.%0*llx.
24ee0 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c  %0*llx", p->cId,
24ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24f00 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e        p->iTab, n
24f10 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20  b, p->maskSelf, 
24f20 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a  nb, p->prereq);.
24f30 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24f40 69 6e 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20  intf(" %12s",.  
24f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f60 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
24f70 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73   ? pItem->zAlias
24f80 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b   : pTab->zName);
24f90 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  .  if( (p->wsFla
24fa0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
24fb0 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20  ALTABLE)==0 ){. 
24fc0 20 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65     if( p->u.btre
24fd0 65 2e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  e.pIndex ){.    
24fe0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
24ff0 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65  ame = p->u.btree
25000 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 0a  .pIndex->zName;.
25010 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d        if( zName=
25020 3d 30 20 29 20 7a 4e 61 6d 65 20 3d 20 22 69 70  =0 ) zName = "ip
25030 6b 22 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  k";.      if( st
25040 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  rncmp(zName, "sq
25050 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22  lite_autoindex_"
25060 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 17)==0 ){.    
25070 20 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69      int i = sqli
25080 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
25090 65 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  e) - 1;.        
250a0 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21  while( zName[i]!
250b0 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20  ='_' ) i--;.    
250c0 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a      zName += i;.
250d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
250e0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
250f0 28 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a  (".%-16s %2d", z
25100 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65  Name, p->u.btree
25110 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65  .nEq);.    }else
25120 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
25130 65 62 75 67 50 72 69 6e 74 66 28 22 25 32 30 73  ebugPrintf("%20s
25140 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ","");.    }.  }
25150 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
25160 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e  z;.    if( p->u.
25170 76 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20  vtab.idxStr ){. 
25180 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
25190 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22  _mprintf("(%d,\"
251a0 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20  %s\",%x)",.     
251b0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e             p->u.
251c0 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e  vtab.idxNum, p->
251d0 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70  u.vtab.idxStr, p
251e0 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73  ->u.vtab.omitMas
251f0 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  k);.    }else{. 
25200 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
25210 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78  _mprintf("(%d,%x
25220 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64  )", p->u.vtab.id
25230 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e  xNum, p->u.vtab.
25240 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d  omitMask);.    }
25250 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
25260 67 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22  gPrintf(" %-19s"
25270 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , z);.    sqlite
25280 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20  3_free(z);.  }. 
25290 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
252a0 6e 74 66 28 22 20 66 20 25 30 34 78 20 4e 20 25  ntf(" f %04x N %
252b0 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20  d", p->wsFlags, 
252c0 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 73 71  p->nLTerm);.  sq
252d0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
252e0 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c 25 64  (" cost %d,%d,%d
252f0 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20  \n", p->rSetup, 
25300 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74  p->rRun, p->nOut
25310 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
25320 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20  ** Convert bulk 
25330 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76 61  memory into a va
25340 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70 20 74 68  lid WhereLoop th
25350 61 74 20 63 61 6e 20 62 65 20 70 61 73 73 65 64  at can be passed
25360 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70  .** to whereLoop
25370 43 6c 65 61 72 20 68 61 72 6d 6c 65 73 73 6c 79  Clear harmlessly
25380 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
25390 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57   whereLoopInit(W
253a0 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
253b0 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61  p->aLTerm = p->a
253c0 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d  LTermSpace;.  p-
253d0 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  >nLTerm = 0;.  p
253e0 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79  ->nLSlot = Array
253f0 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70  Size(p->aLTermSp
25400 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61  ace);.  p->wsFla
25410 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gs = 0;.}../*.**
25420 20 43 6c 65 61 72 20 74 68 65 20 57 68 65 72 65   Clear the Where
25430 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c  Loop.u union.  L
25440 65 61 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70  eave WhereLoop.p
25450 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f  LTerm intact..*/
25460 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
25470 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e  reLoopClearUnion
25480 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
25490 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69  ereLoop *p){.  i
254a0 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  f( p->wsFlags & 
254b0 28 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41  (WHERE_VIRTUALTA
254c0 42 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49  BLE|WHERE_AUTO_I
254d0 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 69 66 28  NDEX) ){.    if(
254e0 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
254f0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
25500 45 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74  E)!=0 && p->u.vt
25510 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20  ab.needFree ){. 
25520 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
25530 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  e(p->u.vtab.idxS
25540 74 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  tr);.      p->u.
25550 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
25560 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74  0;.      p->u.vt
25570 61 62 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20  ab.idxStr = 0;. 
25580 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d     }else if( (p-
25590 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
255a0 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20  _AUTO_INDEX)!=0 
255b0 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  && p->u.btree.pI
255c0 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20  ndex!=0 ){.     
255d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
255e0 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  b, p->u.btree.pI
255f0 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  ndex->zColAff);.
25600 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
25610 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72  ree(db, p->u.btr
25620 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  ee.pIndex);.    
25630 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e    p->u.btree.pIn
25640 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  dex = 0;.    }. 
25650 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c   }.}../*.** Deal
25660 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c 20  locate internal 
25670 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61  memory used by a
25680 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
25690 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
256a0 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28   whereLoopClear(
256b0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
256c0 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66  reLoop *p){.  if
256d0 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e  ( p->aLTerm!=p->
256e0 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71  aLTermSpace ) sq
256f0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
25700 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68  p->aLTerm);.  wh
25710 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f  ereLoopClearUnio
25720 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77 68 65 72  n(db, p);.  wher
25730 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a  eLoopInit(p);.}.
25740 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20  ./*.** Increase 
25750 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
25760 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d  ation for pLoop-
25770 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20  >aLTerm[] to be 
25780 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73  at least n..*/.s
25790 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
257a0 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65  oopResize(sqlite
257b0 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
257c0 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57   *p, int n){.  W
257d0 68 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77  hereTerm **paNew
257e0 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f  ;.  if( p->nLSlo
257f0 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20 53 51  t>=n ) return SQ
25800 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28  LITE_OK;.  n = (
25810 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77  n+7)&~7;.  paNew
25820 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
25830 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
25840 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e  (p->aLTerm[0])*n
25850 29 3b 0a 20 20 69 66 28 20 70 61 4e 65 77 3d 3d  );.  if( paNew==
25860 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
25870 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70  E_NOMEM;.  memcp
25880 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65  y(paNew, p->aLTe
25890 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  rm, sizeof(p->aL
258a0 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c  Term[0])*p->nLSl
258b0 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c  ot);.  if( p->aL
258c0 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53  Term!=p->aLTermS
258d0 70 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62  pace ) sqlite3Db
258e0 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65  Free(db, p->aLTe
258f0 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d  rm);.  p->aLTerm
25900 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e   = paNew;.  p->n
25910 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74  LSlot = n;.  ret
25920 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
25930 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  ../*.** Transfer
25940 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
25950 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69  e second pLoop i
25960 6e 74 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a  nto the first..*
25970 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
25980 72 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74  reLoopXfer(sqlit
25990 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
259a0 70 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f  p *pTo, WhereLoo
259b0 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28  p *pFrom){.  if(
259c0 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
259d0 28 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d  (db, pTo, pFrom-
259e0 3e 6e 4c 54 65 72 6d 29 20 29 20 72 65 74 75 72  >nLTerm) ) retur
259f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
25a00 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
25a10 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a  Union(db, pTo);.
25a20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46    memcpy(pTo, pF
25a30 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f  rom, WHERE_LOOP_
25a40 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63  XFER_SZ);.  memc
25a50 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20  py(pTo->aLTerm, 
25a60 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70  pFrom->aLTerm, p
25a70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f  To->nLTerm*sizeo
25a80 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d  f(pTo->aLTerm[0]
25a90 29 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  ));.  if( pFrom-
25aa0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
25ab0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
25ac0 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74  .    pFrom->u.vt
25ad0 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
25ae0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46  .  }else if( (pF
25af0 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
25b00 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
25b10 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d  !=0 ){.    pFrom
25b20 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
25b30 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
25b40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
25b50 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
25b60 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
25b70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25b80 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28  whereLoopDelete(
25b90 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
25ba0 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68  reLoop *p){.  wh
25bb0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
25bc0 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62   p);.  sqlite3Db
25bd0 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
25be0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65  /*.** Free a Whe
25bf0 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
25c00 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25c10 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71  whereInfoFree(sq
25c20 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
25c30 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
25c40 20 69 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e   if( ALWAYS(pWIn
25c50 66 6f 29 20 29 7b 0a 20 20 20 20 77 68 65 72 65  fo) ){.    where
25c60 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57 49  ClauseClear(&pWI
25c70 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77  nfo->sWC);.    w
25c80 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c  hile( pWInfo->pL
25c90 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68  oops ){.      Wh
25ca0 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49  ereLoop *p = pWI
25cb0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20  nfo->pLoops;.   
25cc0 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70     pWInfo->pLoop
25cd0 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  s = p->pNextLoop
25ce0 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
25cf0 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a  pDelete(db, p);.
25d00 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
25d10 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e  3DbFree(db, pWIn
25d20 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  fo);.  }.}../*.*
25d30 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c  * Insert or repl
25d40 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  ace a WhereLoop 
25d50 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20  entry using the 
25d60 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65  template supplie
25d70 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  d..**.** An exis
25d80 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65  ting WhereLoop e
25d90 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76  ntry might be ov
25da0 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
25db0 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a   new template.**
25dc0 20 69 73 20 62 65 74 74 65 72 20 61 6e 64 20 68   is better and h
25dd0 61 73 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  as fewer depende
25de0 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74  ncies.  Or the t
25df0 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20  emplate will be 
25e00 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e  ignored.** and n
25e10 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63  o insert will oc
25e20 63 75 72 20 69 66 20 61 6e 20 65 78 69 73 74 69  cur if an existi
25e30 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ng WhereLoop is 
25e40 66 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a  faster and has.*
25e50 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  * fewer dependen
25e60 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 74 65  cies than the te
25e70 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69  mplate.  Otherwi
25e80 73 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f  se a new WhereLo
25e90 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62  op is.** added b
25ea0 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70  ased on the temp
25eb0 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  late..**.** If p
25ec0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
25ed0 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
25ee0 20 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62   we only care ab
25ef0 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  out only the.** 
25f00 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61 6e  prerequisites an
25f10 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20  d rRun and nOut 
25f20 63 6f 73 74 73 20 6f 66 20 74 68 65 20 4e 20 62  costs of the N b
25f30 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74  est loops.  That
25f40 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
25f50 69 73 20 67 61 74 68 65 72 65 64 20 69 6e 20 74  is gathered in t
25f60 68 65 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  he pBuilder->pOr
25f70 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69  Set object.  Thi
25f80 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f  s special.** pro
25f90 63 65 73 73 69 6e 67 20 6d 6f 64 65 20 69 73 20  cessing mode is 
25fa0 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52  used only for OR
25fb0 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
25fc0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ng..**.** When a
25fd0 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74  ccumulating mult
25fe0 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e  iple loops (when
25ff0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
26000 74 20 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a  t is NULL) we.**
26010 20 73 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65   still might ove
26020 72 77 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c  rwrite similar l
26030 6f 6f 70 73 20 77 69 74 68 20 74 68 65 20 6e 65  oops with the ne
26040 77 20 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68  w template if th
26050 65 0a 2a 2a 20 74 65 6d 70 6c 61 74 65 20 69 73  e.** template is
26060 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20   better.  Loops 
26070 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69 74 74  may be overwritt
26080 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  en if the follow
26090 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  ing .** conditio
260a0 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a  ns are met:.**.*
260b0 2a 20 20 20 20 28 31 29 20 20 54 68 65 79 20 68  *    (1)  They h
260c0 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 54 61  ave the same iTa
260d0 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68  b..**    (2)  Th
260e0 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
260f0 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20   iSortIdx..**   
26100 20 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61   (3)  The templa
26110 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66  te has same or f
26120 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
26130 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  s than the curre
26140 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34  nt loop.**    (4
26150 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
26160 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20  has the same or 
26170 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20  lower cost than 
26180 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
26190 0a 2a 2a 20 20 20 20 28 35 29 20 20 54 68 65 20  .**    (5)  The 
261a0 74 65 6d 70 6c 61 74 65 20 75 73 65 73 20 6d 6f  template uses mo
261b0 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  re terms of the 
261c0 73 61 6d 65 20 69 6e 64 65 78 20 62 75 74 20 68  same index but h
261d0 61 73 20 6e 6f 20 61 64 64 69 74 69 6f 6e 61 6c  as no additional
261e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 70 65  .**         depe
261f0 6e 64 65 6e 63 69 65 73 20 20 20 20 20 20 20 20  ndencies        
26200 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74    .*/.static int
26210 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
26220 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
26230 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65  r *pBuilder, Whe
26240 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74  reLoop *pTemplat
26250 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  e){.  WhereLoop 
26260 2a 2a 70 70 50 72 65 76 2c 20 2a 70 2c 20 2a 70  **ppPrev, *p, *p
26270 4e 65 78 74 20 3d 20 30 3b 0a 20 20 57 68 65 72  Next = 0;.  Wher
26280 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
26290 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
262a0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
262b0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
262c0 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  ->db;..  /* If p
262d0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
262e0 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  is defined, then
262f0 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b   only keep track
26300 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20   of the costs.  
26310 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a  ** and prereqs..
26320 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c    */.  if( pBuil
26330 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29  der->pOrSet!=0 )
26340 7b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  {.#if WHERETRACE
26350 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 75 31 36  _ENABLED.    u16
26360 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70   n = pBuilder->p
26370 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e  OrSet->n;.    in
26380 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20  t x =.#endif.   
26390 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70   whereOrInsert(p
263a0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c  Builder->pOrSet,
263b0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
263c0 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72  eq, pTemplate->r
263d0 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Run,.           
263e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263f0 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
26400 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57  te->nOut);.#if W
26410 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
26420 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  D.    if( sqlite
26430 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
26440 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  8 ){.      sqlit
26450 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 78 3f  e3DebugPrintf(x?
26460 22 20 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20  "   or-%d:  ":" 
26470 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a    or-X:  ", n);.
26480 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
26490 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
264a0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
264b0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
264c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
264d0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
264e0 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78  Search for an ex
264f0 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
26500 20 74 6f 20 6f 76 65 72 77 72 69 74 65 2c 20 6f   to overwrite, o
26510 72 20 77 68 69 63 68 20 74 61 6b 65 73 0a 20 20  r which takes.  
26520 2a 2a 20 70 72 69 6f 72 69 74 79 20 6f 76 65 72  ** priority over
26530 20 70 54 65 6d 70 6c 61 74 65 2e 0a 20 20 2a 2f   pTemplate..  */
26540 0a 20 20 66 6f 72 28 70 70 50 72 65 76 3d 26 70  .  for(ppPrev=&p
26550 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70  WInfo->pLoops, p
26560 3d 2a 70 70 50 72 65 76 3b 20 70 3b 20 70 70 50  =*ppPrev; p; ppP
26570 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f  rev=&p->pNextLoo
26580 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20  p, p=*ppPrev){. 
26590 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d     if( p->iTab!=
265a0 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20  pTemplate->iTab 
265b0 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d  || p->iSortIdx!=
265c0 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74  pTemplate->iSort
265d0 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Idx ){.      /* 
265e0 49 66 20 65 69 74 68 65 72 20 74 68 65 20 69 54  If either the iT
265f0 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76  ab or iSortIdx v
26600 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68  alues for two Wh
26610 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66  ereLoop are diff
26620 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74  erent.      ** t
26630 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c  hen those WhereL
26640 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20  oops need to be 
26650 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61 72  considered separ
26660 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20  ately.  Neither 
26670 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61  is.      ** a ca
26680 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61  ndidate to repla
26690 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f  ce the other. */
266a0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
266b0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e  .    }.    /* In
266c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   the current imp
266d0 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65  lementation, the
266e0 20 72 53 65 74 75 70 20 76 61 6c 75 65 20 69 73   rSetup value is
266f0 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20   either zero.   
26700 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20   ** or the cost 
26710 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61  of building an a
26720 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28  utomatic index (
26730 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e  NlogN) and the N
26740 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74  logN.    ** is t
26750 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70  he same for comp
26760 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70  atible WhereLoop
26770 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  s. */.    assert
26780 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c  ( p->rSetup==0 |
26790 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  | pTemplate->rSe
267a0 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  tup==0 .        
267b0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72           || p->r
267c0 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65  Setup==pTemplate
267d0 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20  ->rSetup );..   
267e0 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64   /* whereLoopAdd
267f0 42 74 72 65 65 28 29 20 61 6c 77 61 79 73 20 67  Btree() always g
26800 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73  enerates and ins
26810 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74  erts the automat
26820 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20  ic index.    ** 
26830 63 61 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e  case first.  Hen
26840 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61  ce compatible ca
26850 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f  ndidate WhereLoo
26860 70 73 20 6e 65 76 65 72 20 68 61 76 65 20 61 20  ps never have a 
26870 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53  larger.    ** rS
26880 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20  etup. Call this 
26890 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20  SETUP-INVARIANT 
268a0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
268b0 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c  ->rSetup>=pTempl
268c0 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a  ate->rSetup );..
268d0 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
268e0 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e  eq & pTemplate->
268f0 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72  prereq)==p->prer
26900 65 71 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53  eq.     && p->rS
26910 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d  etup<=pTemplate-
26920 3e 72 53 65 74 75 70 0a 20 20 20 20 20 26 26 20  >rSetup.     && 
26930 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61  p->rRun<=pTempla
26940 74 65 2d 3e 72 52 75 6e 0a 20 20 20 20 29 7b 0a  te->rRun.    ){.
26950 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
26960 61 6e 63 68 20 74 61 6b 65 6e 20 77 68 65 6e 20  anch taken when 
26970 70 20 69 73 20 65 71 75 61 6c 20 6f 72 20 62 65  p is equal or be
26980 74 74 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c  tter than pTempl
26990 61 74 65 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a  ate in .      **
269a0 20 61 6c 6c 20 6f 66 20 28 31 29 20 64 65 70 65   all of (1) depe
269b0 6e 64 65 6e 63 65 73 20 28 32 29 20 73 65 74 75  ndences (2) setu
269c0 70 2d 63 6f 73 74 2c 20 61 6e 64 20 28 33 29 20  p-cost, and (3) 
269d0 72 75 6e 2d 63 6f 73 74 2e 20 2a 2f 0a 20 20 20  run-cost. */.   
269e0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
269f0 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  etup==pTemplate-
26a00 3e 72 53 65 74 75 70 20 29 3b 0a 20 20 20 20 20  >rSetup );.     
26a10 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 3c 70   if( p->nLTerm<p
26a20 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d  Template->nLTerm
26a30 0a 20 20 20 20 20 20 20 26 26 20 28 70 2d 3e 77  .       && (p->w
26a40 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
26a50 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20  NDEXED)!=0.     
26a60 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d    && (pTemplate-
26a70 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
26a80 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20  _INDEXED)!=0.   
26a90 20 20 20 20 26 26 20 70 2d 3e 75 2e 62 74 72 65      && p->u.btre
26aa0 65 2e 70 49 6e 64 65 78 3d 3d 70 54 65 6d 70 6c  e.pIndex==pTempl
26ab0 61 74 65 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  ate->u.btree.pIn
26ac0 64 65 78 0a 20 20 20 20 20 20 20 26 26 20 70 2d  dex.       && p-
26ad0 3e 70 72 65 72 65 71 3d 3d 70 54 65 6d 70 6c 61  >prereq==pTempla
26ae0 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20  te->prereq.     
26af0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
26b00 76 65 72 77 72 69 74 65 20 61 6e 20 65 78 69 73  verwrite an exis
26b10 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 77  ting WhereLoop w
26b20 69 74 68 20 61 6e 20 73 69 6d 69 6c 61 72 20 6f  ith an similar o
26b30 6e 65 20 74 68 61 74 20 75 73 65 73 0a 20 20 20  ne that uses.   
26b40 20 20 20 20 20 2a 2a 20 6d 6f 72 65 20 74 65 72       ** more ter
26b50 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ms of the index 
26b60 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74  */.        pNext
26b70 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b   = p->pNextLoop;
26b80 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
26b90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26ba0 20 20 20 20 20 2f 2a 20 70 54 65 6d 70 6c 61 74       /* pTemplat
26bb0 65 20 69 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c  e is not helpful
26bc0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65 74  ..        ** Ret
26bd0 75 72 6e 20 77 69 74 68 6f 75 74 20 63 68 61 6e  urn without chan
26be0 67 69 6e 67 20 6f 72 20 61 64 64 69 6e 67 20 61  ging or adding a
26bf0 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20  nything */.     
26c00 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f     goto whereLoo
26c10 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20  pInsert_noop;.  
26c20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
26c30 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26  if( (p->prereq &
26c40 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
26c50 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  eq)==pTemplate->
26c60 70 72 65 72 65 71 0a 20 20 20 20 20 26 26 20 70  prereq.     && p
26c70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74  ->rRun>=pTemplat
26c80 65 2d 3e 72 52 75 6e 0a 20 20 20 20 20 26 26 20  e->rRun.     && 
26c90 41 4c 57 41 59 53 28 70 2d 3e 72 53 65 74 75 70  ALWAYS(p->rSetup
26ca0 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  >=pTemplate->rSe
26cb0 74 75 70 29 20 2f 2a 20 53 65 65 20 53 45 54 55  tup) /* See SETU
26cc0 50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76  P-INVARIANT abov
26cd0 65 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20  e */.    ){.    
26ce0 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 61    /* Overwrite a
26cf0 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  n existing Where
26d00 4c 6f 6f 70 20 77 69 74 68 20 61 20 62 65 74 74  Loop with a bett
26d10 65 72 20 6f 6e 65 3a 20 6f 6e 65 20 74 68 61 74  er one: one that
26d20 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 62 65 74   is.      ** bet
26d30 74 65 72 20 61 74 20 6f 6e 65 20 6f 66 20 28 31  ter at one of (1
26d40 29 20 64 65 70 65 6e 64 65 6e 63 65 73 2c 20 28  ) dependences, (
26d50 32 29 20 73 65 74 75 70 2d 63 6f 73 74 2c 20 6f  2) setup-cost, o
26d60 72 20 28 33 29 20 72 75 6e 2d 63 6f 73 74 0a 20  r (3) run-cost. 
26d70 20 20 20 20 20 2a 2a 20 61 6e 64 20 69 73 20 6e       ** and is n
26d80 6f 20 77 6f 72 73 65 20 69 6e 20 61 6e 79 20 6f  o worse in any o
26d90 66 20 74 68 6f 73 65 20 63 61 74 65 67 6f 72 69  f those categori
26da0 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  es. */.      pNe
26db0 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  xt = p->pNextLoo
26dc0 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  p;.      break;.
26dd0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
26de0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
26df0 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20   point it means 
26e00 74 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20  that either p[] 
26e10 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72  should be overwr
26e20 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20  itten.  ** with 
26e30 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70  pTemplate[] if p
26e40 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66  [] exists, or if
26e50 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c   p==NULL then al
26e60 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a  locate a new.  *
26e70 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20  * WhereLoop and 
26e80 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a  insert it..  */.
26e90 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
26ea0 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
26eb0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
26ec0 20 30 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20   0x8 ){.    if( 
26ed0 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p!=0 ){.      sq
26ee0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
26ef0 28 22 69 6e 73 2d 64 65 6c 3a 20 20 22 29 3b 0a  ("ins-del:  ");.
26f00 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
26f10 72 69 6e 74 28 70 2c 20 70 57 49 6e 66 6f 2d 3e  rint(p, pWInfo->
26f20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d  pTabList);.    }
26f30 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
26f40 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 6e 65 77  gPrintf("ins-new
26f50 3a 20 20 22 29 3b 0a 20 20 20 20 77 68 65 72 65  :  ");.    where
26f60 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
26f70 61 74 65 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ate, pWInfo->pTa
26f80 62 4c 69 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64  bList);.  }.#end
26f90 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  if.  if( p==0 ){
26fa0 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
26fb0 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
26fc0 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
26fd0 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  ));.    if( p==0
26fe0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
26ff0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72  _NOMEM;.    wher
27000 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20  eLoopInit(p);.  
27010 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 58 66 65  }.  whereLoopXfe
27020 72 28 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61  r(db, p, pTempla
27030 74 65 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 4c  te);.  p->pNextL
27040 6f 6f 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 2a  oop = pNext;.  *
27050 70 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 69 66  ppPrev = p;.  if
27060 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
27070 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
27080 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e  LE)==0 ){.    In
27090 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d  dex *pIndex = p-
270a0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
270b0 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20  .    if( pIndex 
270c0 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d  && pIndex->tnum=
270d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75  =0 ){.      p->u
270e0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
270f0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
27100 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27110 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
27120 20 69 66 20 74 68 65 20 69 6e 73 65 72 74 20 69   if the insert i
27130 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 77 68 65  s a no-op */.whe
27140 72 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f  reLoopInsert_noo
27150 70 3a 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  p:.#if WHERETRAC
27160 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
27170 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
27180 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 73  e & 0x8 ){.    s
27190 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
271a0 66 28 22 69 6e 73 2d 6e 6f 6f 70 3a 20 22 29 3b  f("ins-noop: ");
271b0 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72  .    whereLoopPr
271c0 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  int(pTemplate, p
271d0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29  WInfo->pTabList)
271e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
271f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27200 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68    .}../*.** We h
27210 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68  ave so far match
27220 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  ed pBuilder->pNe
27230 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74  w->u.btree.nEq t
27240 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65  erms of the inde
27250 78 20 70 49 6e 64 65 78 2e 0a 2a 2a 20 54 72 79  x pIndex..** Try
27260 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f   to match one mo
27270 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72  re..**.** If pPr
27280 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68  obe->tnum==0, th
27290 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20  at means pIndex 
272a0 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20  is a fake index 
272b0 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  used for the.** 
272c0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
272d0 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  KEY..*/.static i
272e0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  nt whereLoopAddB
272f0 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65  treeIndex(.  Whe
27300 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
27310 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20  Builder,     /* 
27320 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61  The WhereLoop fa
27330 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63  ctory */.  struc
27340 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
27350 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52  pSrc,      /* FR
27360 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62  OM clause term b
27370 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  eing analyzed */
27380 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65  .  Index *pProbe
27390 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
273a0 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f     /* An index o
273b0 6e 20 70 53 72 63 20 2a 2f 0a 20 20 57 68 65 72  n pSrc */.  Wher
273c0 65 43 6f 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20  eCost nInMul    
273d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c              /* l
273e0 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65  og(Number of ite
273f0 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49  rations due to I
27400 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  N) */.){.  Where
27410 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
27420 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
27430 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
27440 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
27450 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
27460 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20  pWInfo->pParse; 
27470 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
27480 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
27490 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
274a0 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f  rse->db;       /
274b0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
274c0 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e  ction malloc con
274d0 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
274e0 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  oop *pNew;      
274f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
27500 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20  plate WhereLoop 
27510 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
27520 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  on */.  WhereTer
27530 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
27540 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65          /* A Whe
27550 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e  reTerm under con
27560 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  sideration */.  
27570 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20  int opMask;     
27580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27590 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f  /* Valid operato
275a0 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e  rs for constrain
275b0 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61  ts */.  WhereSca
275c0 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20  n scan;         
275d0 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
275e0 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65  tor for WHERE te
275f0 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  rms */.  Bitmask
27600 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20   saved_prereq;  
27610 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
27620 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
27630 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20  ew->prereq */.  
27640 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d  u16 saved_nLTerm
27650 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27660 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
27670 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  e of pNew->nLTer
27680 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  m */.  int saved
27690 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  _nEq;           
276a0 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
276b0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
276c0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f  ->u.btree.nEq */
276d0 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77 73 46  .  u32 saved_wsF
276e0 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
276f0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
27700 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73  alue of pNew->ws
27710 46 6c 61 67 73 20 2a 2f 0a 20 20 57 68 65 72 65  Flags */.  Where
27720 43 6f 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b  Cost saved_nOut;
27730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
27740 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
27750 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20  pNew->nOut */.  
27760 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
27770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27780 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
27790 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
277a0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ble */.  int rc 
277b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
277c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
277d0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 57 68 65  rn code */.  Whe
277e0 72 65 43 6f 73 74 20 6e 52 6f 77 45 73 74 3b 20  reCost nRowEst; 
277f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27800 45 73 74 69 6d 61 74 65 64 20 69 6e 64 65 78 20  Estimated index 
27810 73 65 6c 65 63 74 69 76 69 74 79 20 2a 2f 0a 20  selectivity */. 
27820 20 57 68 65 72 65 43 6f 73 74 20 72 4c 6f 67 53   WhereCost rLogS
27830 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
27840 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66   /* Logarithm of
27850 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20   table size */. 
27860 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70   WhereTerm *pTop
27870 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b   = 0, *pBtm = 0;
27880 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74 74   /* Top and bott
27890 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  om range constra
278a0 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20  ints */..  pNew 
278b0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
278c0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
278d0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
278e0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
278f0 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77  .  assert( (pNew
27900 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
27910 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
27920 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
27930 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
27940 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
27950 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e  )==0 );.  if( pN
27960 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
27970 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
27980 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f  .    opMask = WO
27990 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c  _LT|WO_LE;.  }el
279a0 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74  se if( pProbe->t
279b0 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70 53 72 63 2d  num<=0 || (pSrc-
279c0 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  >jointype & JT_L
279d0 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f  EFT)!=0 ){.    o
279e0 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f  pMask = WO_EQ|WO
279f0 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  _IN|WO_GT|WO_GE|
27a00 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d  WO_LT|WO_LE;.  }
27a10 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b  else{.    opMask
27a20 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57   = WO_EQ|WO_IN|W
27a30 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57  O_ISNULL|WO_GT|W
27a40 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
27a50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f  ;.  }.  if( pPro
27a60 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  be->bUnordered )
27a70 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f   opMask &= ~(WO_
27a80 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
27a90 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74  O_LE);..  assert
27aa0 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
27ab0 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f  nEq<=pProbe->nCo
27ac0 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 70 4e  lumn );.  if( pN
27ad0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
27ae0 3c 20 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  < pProbe->nColum
27af0 6e 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  n ){.    iCol = 
27b00 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
27b10 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  [pNew->u.btree.n
27b20 45 71 5d 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74  Eq];.    nRowEst
27b30 20 3d 20 77 68 65 72 65 43 6f 73 74 28 70 50 72   = whereCost(pPr
27b40 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 70 4e  obe->aiRowEst[pN
27b50 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b  ew->u.btree.nEq+
27b60 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f  1]);.    if( nRo
27b70 77 45 73 74 3d 3d 30 20 26 26 20 70 50 72 6f 62  wEst==0 && pProb
27b80 65 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e  e->onError==OE_N
27b90 6f 6e 65 20 29 20 6e 52 6f 77 45 73 74 20 3d 20  one ) nRowEst = 
27ba0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
27bb0 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 6e  iCol = -1;.    n
27bc0 52 6f 77 45 73 74 20 3d 20 30 3b 0a 20 20 7d 0a  RowEst = 0;.  }.
27bd0 20 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53    pTerm = whereS
27be0 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70  canInit(&scan, p
27bf0 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53  Builder->pWC, pS
27c00 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 69 43 6f  rc->iCursor, iCo
27c10 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
27c20 20 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73             opMas
27c30 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 73 61  k, pProbe);.  sa
27c40 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e  ved_nEq = pNew->
27c50 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73  u.btree.nEq;.  s
27c60 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e  aved_nLTerm = pN
27c70 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61  ew->nLTerm;.  sa
27c80 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e  ved_wsFlags = pN
27c90 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73  ew->wsFlags;.  s
27ca0 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e  aved_prereq = pN
27cb0 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61  ew->prereq;.  sa
27cc0 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d  ved_nOut = pNew-
27cd0 3e 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72  >nOut;.  pNew->r
27ce0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 4c 6f  Setup = 0;.  rLo
27cf0 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 77  gSize = estLog(w
27d00 68 65 72 65 43 6f 73 74 28 70 50 72 6f 62 65 2d  hereCost(pProbe-
27d10 3e 61 69 52 6f 77 45 73 74 5b 30 5d 29 29 3b 0a  >aiRowEst[0]));.
27d20 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49    for(; rc==SQLI
27d30 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d  TE_OK && pTerm!=
27d40 30 3b 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65  0; pTerm = where
27d50 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 29  ScanNext(&scan))
27d60 7b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20  {.    int nIn = 
27d70 30 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  0;.    if( pTerm
27d80 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
27d90 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29  pNew->maskSelf )
27da0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
27db0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
27dc0 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  ator==WO_ISNULL 
27dd0 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  || (pTerm->wtFla
27de0 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d  gs&TERM_VNULL)!=
27df0 30 29 0a 20 20 20 20 20 26 26 20 28 69 43 6f 6c  0).     && (iCol
27e00 3c 30 20 7c 7c 20 70 53 72 63 2d 3e 70 54 61 62  <0 || pSrc->pTab
27e10 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74  ->aCol[iCol].not
27e20 4e 75 6c 6c 29 0a 20 20 20 20 29 7b 0a 20 20 20  Null).    ){.   
27e30 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20     continue; /* 
27e40 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20  ignore IS [NOT] 
27e50 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
27e60 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c   on NOT NULL col
27e70 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  umns */.    }.  
27e80 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
27e90 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  = saved_wsFlags;
27ea0 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
27eb0 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e  ee.nEq = saved_n
27ec0 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  Eq;.    pNew->nL
27ed0 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54  Term = saved_nLT
27ee0 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65  erm;.    if( whe
27ef0 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
27f00 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54   pNew, pNew->nLT
27f10 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20  erm+1) ) break; 
27f20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e  /* OOM */.    pN
27f30 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
27f40 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65  >nLTerm++] = pTe
27f50 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72  rm;.    pNew->pr
27f60 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72  ereq = (saved_pr
27f70 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72  ereq | pTerm->pr
27f80 65 72 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e  ereqRight) & ~pN
27f90 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  ew->maskSelf;.  
27fa0 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72    pNew->rRun = r
27fb0 4c 6f 67 53 69 7a 65 3b 20 2f 2a 20 42 61 73 65  LogSize; /* Base
27fc0 6c 69 6e 65 20 63 6f 73 74 20 69 73 20 6c 6f 67  line cost is log
27fd0 32 28 4e 29 2e 20 20 41 64 6a 75 73 74 6d 65 6e  2(N).  Adjustmen
27fe0 74 73 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  ts below */.    
27ff0 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
28000 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a  ator & WO_IN ){.
28010 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
28020 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
28030 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
28040 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
28050 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20  OLUMN_IN;.      
28060 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
28070 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
28080 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
28090 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45      /* "x IN (SE
280a0 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e  LECT ...)":  TUN
280b0 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20  ING: the SELECT 
280c0 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20  returns 25 rows 
280d0 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d  */.        nIn =
280e0 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34 36   46;  assert( 46
280f0 3d 3d 77 68 65 72 65 43 6f 73 74 28 32 35 29 20  ==whereCost(25) 
28100 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
28110 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
28120 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70  >x.pList && pExp
28130 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
28140 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
28150 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76   "x IN (value, v
28160 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20  alue, ...)" */. 
28170 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 77 68 65         nIn = whe
28180 72 65 43 6f 73 74 28 70 45 78 70 72 2d 3e 78 2e  reCost(pExpr->x.
28190 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  pList->nExpr);. 
281a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
281b0 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 3b 0a  w->rRun += nIn;.
281c0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
281d0 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20  ree.nEq++;.     
281e0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52   pNew->nOut = nR
281f0 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b  owEst + nInMul +
28200 20 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20   nIn;.    }else 
28210 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
28220 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 29 20 29  ator & (WO_EQ) )
28230 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
28240 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
28250 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e   (WHERE_COLUMN_N
28260 55 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ULL|WHERE_COLUMN
28270 5f 49 4e 29 29 21 3d 30 0a 20 20 20 20 20 20 20  _IN))!=0.       
28280 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6e 49             || nI
28290 6e 4d 75 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  nMul==0 );.     
282a0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
282b0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
282c0 51 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  Q;.      if( iCo
282d0 6c 3c 30 20 20 0a 20 20 20 20 20 20 20 7c 7c 20  l<0  .       || 
282e0 28 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72  (pProbe->onError
282f0 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 6e 49 6e  !=OE_None && nIn
28300 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  Mul==0.         
28310 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72    && pNew->u.btr
28320 65 65 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e  ee.nEq==pProbe->
28330 6e 43 6f 6c 75 6d 6e 2d 31 29 0a 20 20 20 20 20  nColumn-1).     
28340 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
28350 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
28360 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
28370 4e 5f 49 4e 29 3d 3d 30 20 7c 7c 20 69 43 6f 6c  N_IN)==0 || iCol
28380 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  <0 );.        pN
28390 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
283a0 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20  HERE_ONEROW;.   
283b0 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
283c0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a  >u.btree.nEq++;.
283d0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
283e0 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e   = nRowEst + nIn
283f0 4d 75 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  Mul;.    }else i
28400 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
28410 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c  tor & (WO_ISNULL
28420 29 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ) ){.      pNew-
28430 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
28440 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20  E_COLUMN_NULL;. 
28450 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
28460 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20  ee.nEq++;.      
28470 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 53 20 4e 55  /* TUNING: IS NU
28480 4c 4c 20 73 65 6c 65 63 74 73 20 32 20 72 6f 77  LL selects 2 row
28490 73 20 2a 2f 0a 20 20 20 20 20 20 6e 49 6e 20 3d  s */.      nIn =
284a0 20 31 30 3b 20 20 61 73 73 65 72 74 28 20 31 30   10;  assert( 10
284b0 3d 3d 77 68 65 72 65 43 6f 73 74 28 32 29 20 29  ==whereCost(2) )
284c0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ;.      pNew->nO
284d0 75 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e  ut = nRowEst + n
284e0 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20  InMul + nIn;.   
284f0 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d   }else if( pTerm
28500 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
28510 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20  O_GT|WO_GE) ){. 
28520 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
28530 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
28540 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20  & WO_GT );.     
28550 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
28560 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
28570 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  _GE );.      pNe
28580 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
28590 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
285a0 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  |WHERE_BTM_LIMIT
285b0 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70  ;.      pBtm = p
285c0 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70  Term;.      pTop
285d0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
285e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
285f0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
28600 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20  & (WO_LT|WO_LE) 
28610 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
28620 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
28630 74 6f 72 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20  tor & WO_LT );. 
28640 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
28650 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
28660 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20  & WO_LE );.     
28670 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
28680 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  = WHERE_COLUMN_R
28690 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  ANGE|WHERE_TOP_L
286a0 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 54 6f 70  IMIT;.      pTop
286b0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
286c0 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73  pBtm = (pNew->ws
286d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
286e0 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20  M_LIMIT)!=0 ?.  
286f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28700 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
28710 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20  pNew->nLTerm-2] 
28720 3a 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  : 0;.    }.    i
28730 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  f( pNew->wsFlags
28740 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
28750 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f  RANGE ){.      /
28760 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 61 6e  * Adjust nOut an
28770 64 20 72 52 75 6e 20 66 6f 72 20 53 54 41 54 33  d rRun for STAT3
28780 20 72 61 6e 67 65 20 76 61 6c 75 65 73 20 2a 2f   range values */
28790 0a 20 20 20 20 20 20 57 68 65 72 65 43 6f 73 74  .      WhereCost
287a0 20 72 44 69 76 3b 0a 20 20 20 20 20 20 77 68 65   rDiv;.      whe
287b0 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70  reRangeScanEst(p
287c0 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70  Parse, pProbe, p
287d0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
287e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
287f0 20 20 20 20 20 20 20 20 20 20 70 42 74 6d 2c 20            pBtm, 
28800 70 54 6f 70 2c 20 26 72 44 69 76 29 3b 0a 20 20  pTop, &rDiv);.  
28810 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
28820 20 73 61 76 65 64 5f 6e 4f 75 74 3e 72 44 69 76   saved_nOut>rDiv
28830 2b 31 30 20 3f 20 73 61 76 65 64 5f 6e 4f 75 74  +10 ? saved_nOut
28840 20 2d 20 72 44 69 76 20 3a 20 31 30 3b 0a 20 20   - rDiv : 10;.  
28850 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
28860 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20  E_ENABLE_STAT3. 
28870 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 62     if( pNew->u.b
28880 74 72 65 65 2e 6e 45 71 3d 3d 31 20 26 26 20 70  tree.nEq==1 && p
28890 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 0a 20  Probe->nSample. 
288a0 20 20 20 20 26 26 20 20 4f 70 74 69 6d 69 7a 61      &&  Optimiza
288b0 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
288c0 53 51 4c 49 54 45 5f 53 74 61 74 33 29 20 29 7b  SQLITE_Stat3) ){
288d0 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e  .      tRowcnt n
288e0 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  Out = 0;.      i
288f0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
28900 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f  ator & (WO_EQ|WO
28910 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a  _ISNULL))!=0 ){.
28920 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
28930 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
28940 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
28950 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28960 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
28970 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
28980 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
28990 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70  reEqualScanEst(p
289a0 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70  Parse, pProbe, p
289b0 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
289c0 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20  ght, &nOut);.   
289d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54     }else if( (pT
289e0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
289f0 20 57 4f 5f 49 4e 29 0a 20 20 20 20 20 20 20 20   WO_IN).        
28a00 20 20 20 20 20 26 26 20 20 21 45 78 70 72 48 61       &&  !ExprHa
28a10 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
28a20 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
28a30 6c 65 63 74 29 20 20 29 7b 0a 20 20 20 20 20 20  lect)  ){.      
28a40 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53 63    rc = whereInSc
28a50 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 50  anEst(pParse, pP
28a60 72 6f 62 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78  robe, pTerm->pEx
28a70 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f  pr->x.pList, &nO
28a80 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ut);.      }.   
28a90 20 20 20 61 73 73 65 72 74 28 20 6e 4f 75 74 3d     assert( nOut=
28aa0 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
28ab0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
28ac0 20 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f   nOut ) pNew->nO
28ad0 75 74 20 3d 20 77 68 65 72 65 43 6f 73 74 28 6e  ut = whereCost(n
28ae0 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Out);.    }.#end
28af0 69 66 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77  if.    if( (pNew
28b00 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
28b10 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52  RE_IDX_ONLY|WHER
28b20 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20  E_IPK))==0 ){.  
28b30 20 20 20 20 2f 2a 20 45 61 63 68 20 72 6f 77 20      /* Each row 
28b40 69 6e 76 6f 6c 76 65 73 20 61 20 73 74 65 70 20  involves a step 
28b50 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68  of the index, th
28b60 65 6e 20 61 20 62 69 6e 61 72 79 20 73 65 61 72  en a binary sear
28b70 63 68 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ch of.      ** t
28b80 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 2a 2f  he main table */
28b90 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
28ba0 6e 20 3d 20 20 77 68 65 72 65 43 6f 73 74 41 64  n =  whereCostAd
28bb0 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72 4c  d(pNew->rRun, rL
28bc0 6f 67 53 69 7a 65 3e 32 37 20 3f 20 72 4c 6f 67  ogSize>27 ? rLog
28bd0 53 69 7a 65 2d 31 37 20 3a 20 31 30 29 3b 0a 20  Size-17 : 10);. 
28be0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 53 74 65 70     }.    /* Step
28bf0 20 63 6f 73 74 20 66 6f 72 20 65 61 63 68 20 6f   cost for each o
28c00 75 74 70 75 74 20 72 6f 77 20 2a 2f 0a 20 20 20  utput row */.   
28c10 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 77 68   pNew->rRun = wh
28c20 65 72 65 43 6f 73 74 41 64 64 28 70 4e 65 77 2d  ereCostAdd(pNew-
28c30 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75  >rRun, pNew->nOu
28c40 74 29 3b 0a 20 20 20 20 2f 2a 20 54 42 44 3a 20  t);.    /* TBD: 
28c50 41 64 6a 75 73 74 20 6e 4f 75 74 20 66 6f 72 20  Adjust nOut for 
28c60 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e 73 74  additional const
28c70 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 72 63  raints */.    rc
28c80 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
28c90 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
28ca0 77 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65  w);.    if( (pNe
28cb0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
28cc0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30  RE_TOP_LIMIT)==0
28cd0 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75  .     && pNew->u
28ce0 2e 62 74 72 65 65 2e 6e 45 71 3c 28 70 50 72 6f  .btree.nEq<(pPro
28cf0 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20 28 70  be->nColumn + (p
28d00 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 21 3d 30 29  Probe->zName!=0)
28d10 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77  ).    ){.      w
28d20 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
28d30 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20  Index(pBuilder, 
28d40 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49  pSrc, pProbe, nI
28d50 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d  nMul+nIn);.    }
28d60 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72 65  .  }.  pNew->pre
28d70 72 65 71 20 3d 20 73 61 76 65 64 5f 70 72 65 72  req = saved_prer
28d80 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74  eq;.  pNew->u.bt
28d90 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
28da0 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46  nEq;.  pNew->wsF
28db0 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46  lags = saved_wsF
28dc0 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f  lags;.  pNew->nO
28dd0 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
28de0 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
28df0 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a  = saved_nLTerm;.
28e00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28e10 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75  /*.** Return Tru
28e20 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
28e30 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78 20  ble that pIndex 
28e40 6d 69 67 68 74 20 62 65 20 75 73 65 66 75 6c 20  might be useful 
28e50 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69  in.** implementi
28e60 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ng the ORDER BY 
28e70 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64  clause in pBuild
28e80 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
28e90 20 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64   False if pBuild
28ea0 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  er does not cont
28eb0 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ain an ORDER BY 
28ec0 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20  clause or.** if 
28ed0 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
28ee0 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65  for pIndex to be
28ef0 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65   useful in imple
28f00 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20  menting that.** 
28f10 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
28f20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
28f30 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
28f40 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72  hOrderBy(.  Wher
28f50 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
28f60 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20  uilder,.  Index 
28f70 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69  *pIndex,.  int i
28f80 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72  Cursor.){.  Expr
28f90 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 69 6e 74  List *pOB;.  int
28fa0 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20   ii, jj;..  if( 
28fb0 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72  pIndex->bUnorder
28fc0 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ed ) return 0;. 
28fd0 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69   if( (pOB = pBui
28fe0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f  lder->pWInfo->pO
28ff0 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65 74  rderBy)==0 ) ret
29000 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d  urn 0;.  for(ii=
29010 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72  0; ii<pOB->nExpr
29020 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  ; ii++){.    Exp
29030 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74  r *pExpr = sqlit
29040 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
29050 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78  e(pOB->a[ii].pEx
29060 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  pr);.    if( pEx
29070 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
29080 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
29090 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
290a0 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a  ble==iCursor ){.
290b0 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20        for(jj=0; 
290c0 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  jj<pIndex->nColu
290d0 6d 6e 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  mn; jj++){.     
290e0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
290f0 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61  olumn==pIndex->a
29100 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65  iColumn[jj] ) re
29110 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
29120 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
29130 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
29140 65 74 75 72 6e 20 61 20 62 69 74 6d 61 73 6b 20  eturn a bitmask 
29150 77 68 65 72 65 20 31 73 20 69 6e 64 69 63 61 74  where 1s indicat
29160 65 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65  e that the corre
29170 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20  sponding column 
29180 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  of.** the table 
29190 69 73 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e  is used by an in
291a0 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66  dex.  Only the f
291b0 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20  irst 63 columns 
291c0 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a  are considered..
291d0 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
291e0 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78  k columnsInIndex
291f0 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
29200 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a   Bitmask m = 0;.
29210 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a    int j;.  for(j
29220 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31  =pIdx->nColumn-1
29230 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20  ; j>=0; j--){.  
29240 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e    int x = pIdx->
29250 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
29260 20 61 73 73 65 72 74 28 20 78 3e 3d 30 20 29 3b   assert( x>=0 );
29270 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78  .    testcase( x
29280 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 74  ==BMS-1 );.    t
29290 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d  estcase( x==BMS-
292a0 32 20 29 3b 0a 20 20 20 20 69 66 28 20 78 3c 42  2 );.    if( x<B
292b0 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b  MS-1 ) m |= MASK
292c0 42 49 54 28 78 29 3b 0a 20 20 7d 0a 20 20 72 65  BIT(x);.  }.  re
292d0 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68  turn m;.}../* Ch
292e0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20  eck to see if a 
292f0 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 77 69  partial index wi
29300 74 68 20 70 50 61 72 74 49 6e 64 65 78 57 68 65  th pPartIndexWhe
29310 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a  re can be used.*
29320 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * in the current
29330 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 20   query.  Return 
29340 74 72 75 65 20 69 66 20 69 74 20 63 61 6e 20 62  true if it can b
29350 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e  e and false if n
29360 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
29370 74 20 77 68 65 72 65 55 73 61 62 6c 65 50 61 72  t whereUsablePar
29380 74 69 61 6c 49 6e 64 65 78 28 69 6e 74 20 69 54  tialIndex(int iT
29390 61 62 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20  ab, WhereClause 
293a0 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 57 68 65  *pWC, Expr *pWhe
293b0 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  re){.  int i;.  
293c0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
293d0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65  ;.  for(i=0, pTe
293e0 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
293f0 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
29400 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
29410 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
29420 65 73 45 78 70 72 28 70 54 65 72 6d 2d 3e 70 45  esExpr(pTerm->pE
29430 78 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61  xpr, pWhere, iTa
29440 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  b) ) return 1;. 
29450 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
29460 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
29470 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
29480 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74  s for a single t
29490 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
294a0 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c 65   where the table
294b0 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69 65 64 20  .** is idenfied 
294c0 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  by pBuilder->pNe
294d0 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74  w->iTab.  That t
294e0 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65  able is guarante
294f0 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d  ed to be.** a b-
29500 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  tree table, not 
29510 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
29520 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
29530 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
29540 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
29550 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
29560 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
29570 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
29580 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20   Bitmask mExtra 
29590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
295a0 45 78 74 72 61 20 70 72 65 72 65 71 75 65 73 69  Extra prerequesi
295b0 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68  tes for using th
295c0 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  is table */.){. 
295d0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
295e0 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fo;          /* 
295f0 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63  WHERE analysis c
29600 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
29610 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20  x *pProbe;      
29620 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
29630 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75  dex we are evalu
29640 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78  ating */.  Index
29650 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20   sPk;           
29660 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65         /* A fake
29670 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f   index object fo
29680 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  r the primary ke
29690 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61  y */.  tRowcnt a
296a0 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20  iRowEstPk[2];   
296b0 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 45     /* The aiRowE
296c0 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74  st[] value for t
296d0 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a  he sPk index */.
296e0 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e 50 6b    int aiColumnPk
296f0 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a   = -1;        /*
29700 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76   The aColumn[] v
29710 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
29720 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c   index */.  SrcL
29730 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20  ist *pTabList;  
29740 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
29750 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
29760 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
29770 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54  tem *pSrc;  /* T
29780 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62  he FROM clause b
29790 74 72 65 65 20 74 65 72 6d 20 74 6f 20 61 64 64  tree term to add
297a0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
297b0 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
297c0 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68    /* Template Wh
297d0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
297e0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
297f0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
29800 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
29810 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 49 64 78  /.  int iSortIdx
29820 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
29830 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20  /* Index number 
29840 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20 20 20  */.  int b;     
29850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29860 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61   /* A boolean va
29870 6c 75 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  lue */.  WhereCo
29880 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20  st rSize;       
29890 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f       /* number o
298a0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
298b0 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  ble */.  WhereCo
298c0 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20  st rLogSize;    
298d0 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68       /* Logarith
298e0 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  m of the number 
298f0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
29900 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  able */.  WhereC
29910 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20  lause *pWC;     
29920 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
29930 73 65 64 20 57 48 45 52 45 20 63 6c 61 75 73 65  sed WHERE clause
29940 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20   */.  .  pNew = 
29950 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
29960 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
29970 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
29980 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
29990 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53  ->pTabList;.  pS
299a0 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  rc = pTabList->a
299b0 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20   + pNew->iTab;. 
299c0 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d   pWC = pBuilder-
299d0 3e 70 57 43 3b 0a 20 20 61 73 73 65 72 74 28 20  >pWC;.  assert( 
299e0 21 49 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d  !IsVirtual(pSrc-
299f0 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66 28  >pTab) );..  if(
29a00 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b   pSrc->pIndex ){
29a10 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58  .    /* An INDEX
29a20 45 44 20 42 59 20 63 6c 61 75 73 65 20 73 70 65  ED BY clause spe
29a30 63 69 66 69 65 73 20 61 20 70 61 72 74 69 63 75  cifies a particu
29a40 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65  lar index to use
29a50 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65 20 3d   */.    pProbe =
29a60 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20   pSrc->pIndex;. 
29a70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
29a80 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58  here is no INDEX
29a90 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43  ED BY clause.  C
29aa0 72 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64  reate a fake Ind
29ab0 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63  ex object in loc
29ac0 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  al.    ** variab
29ad0 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73  le sPk to repres
29ae0 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72  ent the rowid pr
29af0 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e  imary key index.
29b00 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20    Make this.    
29b10 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68  ** fake index th
29b20 65 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61  e first in a cha
29b30 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65  in of Index obje
29b40 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20  cts with all of 
29b50 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20  the real.    ** 
29b60 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f  indices to follo
29b70 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  w */.    Index *
29b80 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
29b90 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
29ba0 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65  t of real indice
29bb0 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s on the table *
29bc0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50  /.    memset(&sP
29bd0 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64  k, 0, sizeof(Ind
29be0 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 43  ex));.    sPk.nC
29bf0 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73  olumn = 1;.    s
29c00 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61  Pk.aiColumn = &a
29c10 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73  iColumnPk;.    s
29c20 50 6b 2e 61 69 52 6f 77 45 73 74 20 3d 20 61 69  Pk.aiRowEst = ai
29c30 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50  RowEstPk;.    sP
29c40 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52  k.onError = OE_R
29c50 65 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e  eplace;.    sPk.
29c60 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70  pTable = pSrc->p
29c70 54 61 62 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Tab;.    aiRowEs
29c80 74 50 6b 5b 30 5d 20 3d 20 70 53 72 63 2d 3e 70  tPk[0] = pSrc->p
29c90 54 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20  Tab->nRowEst;.  
29ca0 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20    aiRowEstPk[1] 
29cb0 3d 20 31 3b 0a 20 20 20 20 70 46 69 72 73 74 20  = 1;.    pFirst 
29cc0 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49  = pSrc->pTab->pI
29cd0 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53  ndex;.    if( pS
29ce0 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  rc->notIndexed==
29cf0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
29d00 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f  e real indices o
29d10 66 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  f the table are 
29d20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20  only considered 
29d30 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  if the.      ** 
29d40 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c  NOT INDEXED qual
29d50 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64  ifier is omitted
29d60 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63   from the FROM c
29d70 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73  lause */.      s
29d80 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73  Pk.pNext = pFirs
29d90 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72  t;.    }.    pPr
29da0 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a  obe = &sPk;.  }.
29db0 20 20 72 53 69 7a 65 20 3d 20 77 68 65 72 65 43    rSize = whereC
29dc0 6f 73 74 28 70 53 72 63 2d 3e 70 54 61 62 2d 3e  ost(pSrc->pTab->
29dd0 6e 52 6f 77 45 73 74 29 3b 0a 20 20 72 4c 6f 67  nRowEst);.  rLog
29de0 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53  Size = estLog(rS
29df0 69 7a 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ize);..#ifndef S
29e00 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
29e10 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 2f 2a 20  ATIC_INDEX.  /* 
29e20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65  Automatic indexe
29e30 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75 69  s */.  if( !pBui
29e40 6c 64 65 72 2d 3e 70 4f 72 53 65 74 0a 20 20 20  lder->pOrSet.   
29e50 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  && (pWInfo->pPar
29e60 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
29e70 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78  SQLITE_AutoIndex
29e80 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72 63 2d  )!=0.   && pSrc-
29e90 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 26 26  >pIndex==0.   &&
29ea0 20 21 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f 75   !pSrc->viaCorou
29eb0 74 69 6e 65 0a 20 20 20 26 26 20 21 70 53 72 63  tine.   && !pSrc
29ec0 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a 20 20 20  ->notIndexed.   
29ed0 26 26 20 21 70 53 72 63 2d 3e 69 73 43 6f 72 72  && !pSrc->isCorr
29ee0 65 6c 61 74 65 64 0a 20 20 29 7b 0a 20 20 20 20  elated.  ){.    
29ef0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f  /* Generate auto
29f00 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70  -index WhereLoop
29f10 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  s */.    WhereTe
29f20 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57  rm *pTerm;.    W
29f30 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64  hereTerm *pWCEnd
29f40 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d   = pWC->a + pWC-
29f50 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28  >nTerm;.    for(
29f60 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63  pTerm=pWC->a; rc
29f70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
29f80 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
29f90 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  rm++){.      if(
29fa0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
29fb0 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ght & pNew->mask
29fc0 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Self ) continue;
29fd0 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 43  .      if( termC
29fe0 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
29ff0 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a  rm, pSrc, 0) ){.
2a000 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
2a010 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
2a020 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
2a030 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
2a040 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
2a050 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
2a060 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
2a070 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
2a080 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f      /* TUNING: O
2a090 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72  ne-time cost for
2a0a0 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61   computing the a
2a0b0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
2a0c0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70  s.        ** app
2a0d0 72 6f 78 69 6d 61 74 65 6c 79 20 37 2a 4e 2a 6c  roximately 7*N*l
2a0e0 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69  og2(N) where N i
2a0f0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2a100 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20  rows in.        
2a110 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
2a120 6e 67 20 69 6e 64 65 78 65 64 2e 20 2a 2f 0a 20  ng indexed. */. 
2a130 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65         pNew->rSe
2a140 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b  tup = rLogSize +
2a150 20 72 53 69 7a 65 20 2b 20 32 38 3b 20 20 61 73   rSize + 28;  as
2a160 73 65 72 74 28 20 32 38 3d 3d 77 68 65 72 65 43  sert( 28==whereC
2a170 6f 73 74 28 37 29 20 29 3b 0a 20 20 20 20 20 20  ost(7) );.      
2a180 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63    /* TUNING: Eac
2a190 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79  h index lookup y
2a1a0 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e  ields 20 rows in
2a1b0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69   the table.  Thi
2a1c0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  s.        ** is 
2a1d0 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75 73  more than the us
2a1e0 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20  ual guess of 10 
2a1f0 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68  rows, since we h
2a200 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20  ave no way.     
2a210 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 6e 69 6e     ** of knownin
2a220 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20  g how selective 
2a230 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75  the index will u
2a240 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49  ltimately be.  I
2a250 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20  t would.        
2a260 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73  ** not be unreas
2a270 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74  onable to make t
2a280 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c  his value much l
2a290 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  arger. */.      
2a2a0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34    pNew->nOut = 4
2a2b0 33 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d  3;  assert( 43==
2a2c0 77 68 65 72 65 43 6f 73 74 28 32 30 29 20 29 3b  whereCost(20) );
2a2d0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
2a2e0 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 41  Run = whereCostA
2a2f0 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77  dd(rLogSize,pNew
2a300 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  ->nOut);.       
2a310 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
2a320 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
2a330 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  X;.        pNew-
2a340 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61  >prereq = mExtra
2a350 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   | pTerm->prereq
2a360 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72  Right;.        r
2a370 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
2a380 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2a390 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
2a3a0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
2a3b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2a3c0 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
2a3d0 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  .  /* Loop over 
2a3e0 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f  all indices.  */
2a3f0 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c  .  for(; rc==SQL
2a400 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65  ITE_OK && pProbe
2a410 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d  ; pProbe=pProbe-
2a420 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78  >pNext, iSortIdx
2a430 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72  ++){.    if( pPr
2a440 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65  obe->pPartIdxWhe
2a450 72 65 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77  re!=0.     && !w
2a460 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
2a470 6c 49 6e 64 65 78 28 70 4e 65 77 2d 3e 69 54 61  lIndex(pNew->iTa
2a480 62 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e  b, pWC, pProbe->
2a490 70 50 61 72 74 49 64 78 57 68 65 72 65 29 20 29  pPartIdxWhere) )
2a4a0 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
2a4b0 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e  ;  /* Partial in
2a4c0 64 65 78 20 69 6e 61 70 70 72 6f 70 72 69 61 74  dex inappropriat
2a4d0 65 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79  e for this query
2a4e0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e   */.    }.    pN
2a4f0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
2a500 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  = 0;.    pNew->n
2a510 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70  LTerm = 0;.    p
2a520 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
2a530 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53 65  0;.    pNew->rSe
2a540 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  tup = 0;.    pNe
2a550 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74  w->prereq = mExt
2a560 72 61 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ra;.    pNew->nO
2a570 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20  ut = rSize;.    
2a580 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
2a590 6e 64 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20  ndex = pProbe;. 
2a5a0 20 20 20 62 20 3d 20 69 6e 64 65 78 4d 69 67 68     b = indexMigh
2a5b0 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79  tHelpWithOrderBy
2a5c0 28 70 42 75 69 6c 64 65 72 2c 20 70 50 72 6f 62  (pBuilder, pProb
2a5d0 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e, pSrc->iCursor
2a5e0 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e  );.    /* The ON
2a5f0 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 66 6c  EPASS_DESIRED fl
2a600 61 67 73 20 6e 65 76 65 72 20 6f 63 63 75 72 73  ags never occurs
2a610 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 4f   together with O
2a620 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 61  RDER BY */.    a
2a630 73 73 65 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e  ssert( (pWInfo->
2a640 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2a650 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
2a660 45 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29  ED)==0 || b==0 )
2a670 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65  ;.    if( pProbe
2a680 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20  ->tnum<=0 ){.   
2a690 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72     /* Integer pr
2a6a0 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20  imary key index 
2a6b0 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  */.      pNew->w
2a6c0 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49  sFlags = WHERE_I
2a6d0 50 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75  PK;..      /* Fu
2a6e0 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f  ll table scan */
2a6f0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f  .      pNew->iSo
2a700 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72  rtIdx = b ? iSor
2a710 74 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20  tIdx : 0;.      
2a720 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
2a730 6f 66 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63  of full table sc
2a740 61 6e 20 69 73 20 33 2a 28 4e 20 2b 20 6c 6f 67  an is 3*(N + log
2a750 32 28 4e 29 29 2e 0a 20 20 20 20 20 20 2a 2a 20  2(N))..      ** 
2a760 20 2b 20 20 54 68 65 20 65 78 74 72 61 20 33 20   +  The extra 3 
2a770 66 61 63 74 6f 72 20 69 73 20 74 6f 20 65 6e 63  factor is to enc
2a780 6f 75 72 61 67 65 20 74 68 65 20 75 73 65 20 6f  ourage the use o
2a790 66 20 69 6e 64 65 78 65 64 20 6c 6f 6f 6b 75 70  f indexed lookup
2a7a0 73 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f  s.      **     o
2a7b0 76 65 72 20 66 75 6c 6c 20 73 63 61 6e 73 2e 20  ver full scans. 
2a7c0 20 41 20 73 6d 61 6c 6c 65 72 20 63 6f 6e 73 74   A smaller const
2a7d0 61 6e 74 20 32 20 69 73 20 75 73 65 64 20 66 6f  ant 2 is used fo
2a7e0 72 20 63 6f 76 65 72 69 6e 67 0a 20 20 20 20 20  r covering.     
2a7f0 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 73 63   **     index sc
2a800 61 6e 73 20 73 6f 20 74 68 61 74 20 61 20 63 6f  ans so that a co
2a810 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61  vering index sca
2a820 6e 20 77 69 6c 6c 20 62 65 20 66 61 76 6f 72 65  n will be favore
2a830 64 20 6f 76 65 72 0a 20 20 20 20 20 20 2a 2a 20  d over.      ** 
2a840 20 20 20 20 61 20 74 61 62 6c 65 20 73 63 61 6e      a table scan
2a850 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  . */.      pNew-
2a860 3e 72 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73  >rRun = whereCos
2a870 74 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53  tAdd(rSize,rLogS
2a880 69 7a 65 29 20 2b 20 31 36 3b 0a 20 20 20 20 20  ize) + 16;.     
2a890 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
2a8a0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
2a8b0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28  pNew);.      if(
2a8c0 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
2a8d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69   }else{.      Bi
2a8e0 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e  tmask m = pSrc->
2a8f0 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d  colUsed & ~colum
2a900 6e 73 49 6e 49 6e 64 65 78 28 70 50 72 6f 62 65  nsInIndex(pProbe
2a910 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  );.      pNew->w
2a920 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20  sFlags = (m==0) 
2a930 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  ? (WHERE_IDX_ONL
2a940 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  Y|WHERE_INDEXED)
2a950 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   : WHERE_INDEXED
2a960 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c  ;..      /* Full
2a970 20 73 63 61 6e 20 76 69 61 20 69 6e 64 65 78 20   scan via index 
2a980 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 0a 20  */.      if( b. 
2a990 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a        || ( m==0.
2a9a0 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f           && pPro
2a9b0 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  be->bUnordered==
2a9c0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  0.         && (p
2a9d0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2a9e0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
2a9f0 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20  S_DESIRED)==0.  
2aa00 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
2aa10 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55  3GlobalConfig.bU
2aa20 73 65 43 69 73 0a 20 20 20 20 20 20 20 20 20 26  seCis.         &
2aa30 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
2aa40 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50  abled(pWInfo->pP
2aa50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45  arse->db, SQLITE
2aa60 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20  _CoverIdxScan). 
2aa70 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20           ).     
2aa80 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
2aa90 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f  ->iSortIdx = b ?
2aaa0 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20   iSortIdx : 0;. 
2aab0 20 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30 20         if( m==0 
2aac0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2aad0 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20  TUNING: Cost of 
2aae0 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
2aaf0 20 73 63 61 6e 20 69 73 20 32 2a 28 4e 20 2b 20   scan is 2*(N + 
2ab00 6c 6f 67 32 28 4e 29 29 2e 0a 20 20 20 20 20 20  log2(N))..      
2ab10 20 20 20 20 2a 2a 20 20 2b 20 20 54 68 65 20 65      **  +  The e
2ab20 78 74 72 61 20 32 20 66 61 63 74 6f 72 20 69 73  xtra 2 factor is
2ab30 20 74 6f 20 65 6e 63 6f 75 72 61 67 65 20 74 68   to encourage th
2ab40 65 20 75 73 65 20 6f 66 20 69 6e 64 65 78 65 64  e use of indexed
2ab50 20 6c 6f 6f 6b 75 70 73 0a 20 20 20 20 20 20 20   lookups.       
2ab60 20 20 20 2a 2a 20 20 20 20 20 6f 76 65 72 20 69     **     over i
2ab70 6e 64 65 78 20 73 63 61 6e 73 2e 20 20 41 20 74  ndex scans.  A t
2ab80 61 62 6c 65 20 73 63 61 6e 20 75 73 65 73 20 61  able scan uses a
2ab90 20 66 61 63 74 6f 72 20 6f 66 20 33 20 73 6f 20   factor of 3 so 
2aba0 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a  that.          *
2abb0 2a 20 20 20 20 20 69 6e 64 65 78 20 73 63 61 6e  *     index scan
2abc0 73 20 61 72 65 20 66 61 76 6f 72 65 64 20 6f 76  s are favored ov
2abd0 65 72 20 74 61 62 6c 65 20 73 63 61 6e 73 2e 0a  er table scans..
2abe0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20            **  + 
2abf0 20 49 66 20 74 68 69 73 20 63 6f 76 65 72 69 6e   If this coverin
2ac00 67 20 69 6e 64 65 78 20 6d 69 67 68 74 20 61 6c  g index might al
2ac10 73 6f 20 68 65 6c 70 20 73 61 74 69 73 66 79 20  so help satisfy 
2ac20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20  the ORDER BY.   
2ac30 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 63 6c         **     cl
2ac40 61 75 73 65 2c 20 74 68 65 6e 20 74 68 65 20 63  ause, then the c
2ac50 6f 73 74 20 69 73 20 66 75 64 67 65 64 20 64 6f  ost is fudged do
2ac60 77 6e 20 73 6c 69 67 68 74 6c 79 20 73 6f 20 74  wn slightly so t
2ac70 68 61 74 20 74 68 69 73 0a 20 20 20 20 20 20 20  hat this.       
2ac80 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20     **     index 
2ac90 69 73 20 66 61 76 6f 72 65 64 20 61 62 6f 76 65  is favored above
2aca0 20 6f 74 68 65 72 20 69 6e 64 69 63 65 73 20 74   other indices t
2acb0 68 61 74 20 68 61 76 65 20 6e 6f 20 68 6f 70 65  hat have no hope
2acc0 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   of.          **
2acd0 20 20 20 20 20 68 65 6c 70 69 6e 67 20 77 69 74       helping wit
2ace0 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 20  h the ORDER BY. 
2acf0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  */.          pNe
2ad00 77 2d 3e 72 52 75 6e 20 3d 20 31 30 20 2b 20 77  w->rRun = 10 + w
2ad10 68 65 72 65 43 6f 73 74 41 64 64 28 72 53 69 7a  hereCostAdd(rSiz
2ad20 65 2c 72 4c 6f 67 53 69 7a 65 29 20 2d 20 62 3b  e,rLogSize) - b;
2ad30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2ad40 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2ad50 28 20 62 21 3d 30 20 29 3b 20 0a 20 20 20 20 20  ( b!=0 ); .     
2ad60 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
2ad70 43 6f 73 74 20 6f 66 20 73 63 61 6e 6e 69 6e 67  Cost of scanning
2ad80 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20   a non-covering 
2ad90 69 6e 64 65 78 20 69 73 20 28 4e 2b 31 29 2a 6c  index is (N+1)*l
2ada0 6f 67 32 28 4e 29 0a 20 20 20 20 20 20 20 20 20  og2(N).         
2adb0 20 2a 2a 20 77 68 69 63 68 20 77 65 20 77 69 6c   ** which we wil
2adc0 6c 20 73 69 6d 70 6c 69 66 79 20 74 6f 20 6a 75  l simplify to ju
2add0 73 74 20 4e 2a 6c 6f 67 32 28 4e 29 20 2a 2f 0a  st N*log2(N) */.
2ade0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2adf0 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 72  rRun = rSize + r
2ae00 4c 6f 67 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  LogSize;.       
2ae10 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
2ae20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
2ae30 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
2ae40 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
2ae50 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
2ae60 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2ae70 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
2ae80 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c  eIndex(pBuilder,
2ae90 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 30   pSrc, pProbe, 0
2aea0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2aeb0 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58  ere was an INDEX
2aec0 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ED BY clause, th
2aed0 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65  en only that one
2aee0 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a   index is.    **
2aef0 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a   considered. */.
2af00 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49      if( pSrc->pI
2af10 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 20 20  ndex ) break;.  
2af20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2af30 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2af40 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2af50 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  LE./*.** Add all
2af60 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
2af70 74 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f  ts for a table o
2af80 66 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74  f the join ident
2af90 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69  ified by.** pBui
2afa0 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
2afb0 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
2afc0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
2afd0 65 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  e a virtual tabl
2afe0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2aff0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
2b000 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f  tual(.  WhereLoo
2b010 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
2b020 65 72 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c  er   /* WHERE cl
2b030 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
2b040 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
2b050 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
2b060 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61        /* WHERE a
2b070 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20  nalysis context 
2b080 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
2b090 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
2b0a0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
2b0b0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
2b0c0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
2b0d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2b0e0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
2b0f0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
2b100 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20  st_item *pSrc;  
2b110 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
2b120 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
2b130 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  ch */.  Table *p
2b140 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Tab;.  sqlite3 *
2b150 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  db;.  sqlite3_in
2b160 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
2b170 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  fo;.  struct sql
2b180 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
2b190 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
2b1a0 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
2b1b0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
2b1c0 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65  nt_usage *pUsage
2b1d0 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
2b1e0 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Term;.  int i, j
2b1f0 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d  ;.  int iTerm, m
2b200 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f  xTerm;.  int nCo
2b210 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20  nstraint;.  int 
2b220 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20  seenIn = 0;     
2b230 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2b240 20 69 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   if an IN operat
2b250 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20  or is seen */.  
2b260 69 6e 74 20 73 65 65 6e 56 61 72 20 3d 20 30 3b  int seenVar = 0;
2b270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b280 54 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63 6f  True if a non-co
2b290 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72 61 69 6e  nstant constrain
2b2a0 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69  t is seen */.  i
2b2b0 6e 74 20 69 50 68 61 73 65 3b 20 20 20 20 20 20  nt iPhase;      
2b2c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
2b2d0 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c 20  : const w/o IN, 
2b2e0 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20  1: const, 2: no 
2b2f0 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20 20  IN,  2: IN */.  
2b300 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
2b310 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2b320 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e 66 6f  TE_OK;..  pWInfo
2b330 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
2b340 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20  nfo;.  pParse = 
2b350 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
2b360 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
2b370 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c  b;.  pWC = pBuil
2b380 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77  der->pWC;.  pNew
2b390 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
2b3a0 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49  w;.  pSrc = &pWI
2b3b0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
2b3c0 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20  [pNew->iTab];.  
2b3d0 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61  pTab = pSrc->pTa
2b3e0 62 3b 0a 20 20 61 73 73 65 72 74 28 20 49 73 56  b;.  assert( IsV
2b3f0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a  irtual(pTab) );.
2b400 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c    pIdxInfo = all
2b410 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70  ocateIndexInfo(p
2b420 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63  Parse, pWC, pSrc
2b430 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64  , pBuilder->pOrd
2b440 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70 49 64  erBy);.  if( pId
2b450 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72  xInfo==0 ) retur
2b460 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2b470 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
2b480 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74   0;.  pNew->rSet
2b490 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  up = 0;.  pNew->
2b4a0 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
2b4b0 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20  VIRTUALTABLE;.  
2b4c0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  pNew->nLTerm = 0
2b4d0 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ;.  pNew->u.vtab
2b4e0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
2b4f0 20 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e   pUsage = pIdxIn
2b500 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
2b510 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61  sage;.  nConstra
2b520 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  int = pIdxInfo->
2b530 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69  nConstraint;.  i
2b540 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
2b550 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f  ze(db, pNew, nCo
2b560 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a 20 20 20  nstraint) ){.   
2b570 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2b580 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20  b, pIdxInfo);.  
2b590 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b5a0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f  NOMEM;.  }..  fo
2b5b0 72 28 69 50 68 61 73 65 3d 30 3b 20 69 50 68 61  r(iPhase=0; iPha
2b5c0 73 65 3c 3d 33 3b 20 69 50 68 61 73 65 2b 2b 29  se<=3; iPhase++)
2b5d0 7b 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 49  {.    if( !seenI
2b5e0 6e 20 26 26 20 28 69 50 68 61 73 65 26 31 29 21  n && (iPhase&1)!
2b5f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50 68 61  =0 ){.      iPha
2b600 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  se++;.      if( 
2b610 69 50 68 61 73 65 3e 33 20 29 20 62 72 65 61 6b  iPhase>3 ) break
2b620 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2b630 21 73 65 65 6e 56 61 72 20 26 26 20 69 50 68 61  !seenVar && iPha
2b640 73 65 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20 20  se>1 ) break;.  
2b650 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73    pIdxCons = *(s
2b660 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
2b670 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
2b680 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
2b690 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72  straint;.    for
2b6a0 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f  (i=0; i<pIdxInfo
2b6b0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
2b6c0 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b  ++, pIdxCons++){
2b6d0 0a 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43  .      j = pIdxC
2b6e0 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74  ons->iTermOffset
2b6f0 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
2b700 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20  &pWC->a[j];.    
2b710 20 20 73 77 69 74 63 68 28 20 69 50 68 61 73 65    switch( iPhase
2b720 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
2b730 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61   0:    /* Consta
2b740 6e 74 73 20 77 69 74 68 6f 75 74 20 49 4e 20 6f  nts without IN o
2b750 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
2b760 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
2b770 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  sable = 0;.     
2b780 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
2b790 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2b7a0 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)!=0 ){.      
2b7b0 20 20 20 20 20 20 73 65 65 6e 49 6e 20 3d 20 31        seenIn = 1
2b7c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2b7d0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
2b7e0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 21 3d  m->prereqRight!=
2b7f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2b800 20 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20   seenVar = 1;.  
2b810 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2b820 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
2b830 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20  tor & WO_IN)==0 
2b840 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
2b850 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
2b860 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
2b870 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2b880 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 31  ;.        case 1
2b890 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74  :    /* Constant
2b8a0 73 20 77 69 74 68 20 49 4e 20 6f 70 65 72 61 74  s with IN operat
2b8b0 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ors */.         
2b8c0 20 61 73 73 65 72 74 28 20 73 65 65 6e 49 6e 20   assert( seenIn 
2b8d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  );.          pId
2b8e0 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
2b8f0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
2b900 67 68 74 3d 3d 30 29 3b 0a 20 20 20 20 20 20 20  ght==0);.       
2b910 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2b920 20 20 63 61 73 65 20 32 3a 20 20 20 20 2f 2a 20    case 2:    /* 
2b930 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 6f 75  Variables withou
2b940 74 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20  t IN */.        
2b950 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61    assert( seenVa
2b960 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  r );.          p
2b970 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
2b980 3d 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  = (pTerm->eOpera
2b990 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b  tor & WO_IN)==0;
2b9a0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2b9b0 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  ;.        defaul
2b9c0 74 3a 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  t:   /* Variable
2b9d0 73 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20  s with IN */.   
2b9e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
2b9f0 65 65 6e 56 61 72 20 26 26 20 73 65 65 6e 49 6e  eenVar && seenIn
2ba00 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49   );.          pI
2ba10 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
2ba20 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
2ba30 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2ba40 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 55   }.    memset(pU
2ba50 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sage, 0, sizeof(
2ba60 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49  pUsage[0])*pIdxI
2ba70 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
2ba80 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49  );.    if( pIdxI
2ba90 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
2baa0 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f  dxStr ) sqlite3_
2bab0 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69  free(pIdxInfo->i
2bac0 64 78 53 74 72 29 3b 0a 20 20 20 20 70 49 64 78  dxStr);.    pIdx
2bad0 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30  Info->idxStr = 0
2bae0 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
2baf0 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20  idxNum = 0;.    
2bb00 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
2bb10 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
2bb20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72      pIdxInfo->or
2bb30 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
2bb40 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
2bb50 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
2bb60 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20   SQLITE_BIG_DBL 
2bb70 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20  / (double)2;.   
2bb80 20 72 63 20 3d 20 76 74 61 62 42 65 73 74 49 6e   rc = vtabBestIn
2bb90 64 65 78 28 70 50 61 72 73 65 2c 20 70 54 61 62  dex(pParse, pTab
2bba0 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20  , pIdxInfo);.   
2bbb0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77   if( rc ) goto w
2bbc0 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f  hereLoopAddVtab_
2bbd0 65 78 69 74 3b 0a 20 20 20 20 70 49 64 78 43 6f  exit;.    pIdxCo
2bbe0 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
2bbf0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
2bc00 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
2bc10 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
2bc20 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
2bc30 71 20 3d 20 30 3b 0a 20 20 20 20 6d 78 54 65 72  q = 0;.    mxTer
2bc40 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65  m = -1;.    asse
2bc50 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  rt( pNew->nLSlot
2bc60 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b  >=nConstraint );
2bc70 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2bc80 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
2bc90 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69  ) pNew->aLTerm[i
2bca0 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  ] = 0;.    pNew-
2bcb0 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
2bcc0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
2bcd0 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
2bce0 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
2bcf0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69  +){.      if( (i
2bd00 54 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d  Term = pUsage[i]
2bd10 2e 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e  .argvIndex - 1)>
2bd20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20  =0 ){.        j 
2bd30 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72  = pIdxCons->iTer
2bd40 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  mOffset;.       
2bd50 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e   if( iTerm>=nCon
2bd60 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 20  straint.        
2bd70 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 20   || j<0.        
2bd80 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72   || j>=pWC->nTer
2bd90 6d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e  m.         || pN
2bda0 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d  ew->aLTerm[iTerm
2bdb0 5d 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  ]!=0.        ){.
2bdc0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2bdd0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
2bde0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
2bdf0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2be00 25 73 2e 78 42 65 73 74 49 6e 64 65 78 28 29 20  %s.xBestIndex() 
2be10 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54  malfunction", pT
2be20 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
2be30 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
2be40 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74  LoopAddVtab_exit
2be50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2be60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
2be70 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  erm==nConstraint
2be80 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  -1 );.        te
2be90 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a  stcase( j==0 );.
2bea0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2beb0 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d  ( j==pWC->nTerm-
2bec0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  1 );.        pTe
2bed0 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b  rm = &pWC->a[j];
2bee0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
2bef0 72 65 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e  rereq |= pTerm->
2bf00 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
2bf10 20 20 20 20 20 61 73 73 65 72 74 28 20 69 54 65       assert( iTe
2bf20 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20  rm<pNew->nLSlot 
2bf30 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
2bf40 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d  >aLTerm[iTerm] =
2bf50 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
2bf60 69 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d  if( iTerm>mxTerm
2bf70 20 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72   ) mxTerm = iTer
2bf80 6d 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  m;.        testc
2bf90 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29  ase( iTerm==15 )
2bfa0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
2bfb0 73 65 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b  se( iTerm==16 );
2bfc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65  .        if( iTe
2bfd0 72 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b  rm<16 && pUsage[
2bfe0 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e  i].omit ) pNew->
2bff0 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
2c000 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20  |= 1<<iTerm;.   
2c010 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
2c020 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2c030 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)!=0 ){.      
2c040 20 20 20 20 69 66 28 20 70 55 73 61 67 65 5b 69      if( pUsage[i
2c050 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  ].omit==0 ){.   
2c060 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
2c070 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ot attempt to us
2c080 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  e an IN constrai
2c090 6e 74 20 69 66 20 74 68 65 20 76 69 72 74 75 61  nt if the virtua
2c0a0 6c 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  l table.        
2c0b0 20 20 20 20 2a 2a 20 73 61 79 73 20 74 68 61 74      ** says that
2c0c0 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
2c0d0 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  EQ constraint ca
2c0e0 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c 79 20 6f  nnot be safely o
2c0f0 6d 69 74 74 65 64 2e 0a 20 20 20 20 20 20 20 20  mitted..        
2c100 20 20 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20      ** If we do 
2c110 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 73  attempt to use s
2c120 75 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74  uch a constraint
2c130 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68  , some rows migh
2c140 74 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 20  t be.           
2c150 20 2a 2a 20 72 65 70 65 61 74 65 64 20 69 6e 20   ** repeated in 
2c160 74 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20  the output. */. 
2c170 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2c180 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2c190 20 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72          /* A vir
2c1a0 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20  tual table that 
2c1b0 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  is constrained b
2c1c0 79 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d  y an IN clause m
2c1d0 61 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 20  ay not.         
2c1e0 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20   ** consume the 
2c1f0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2c200 62 65 63 61 75 73 65 20 28 31 29 20 74 68 65 20  because (1) the 
2c210 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d  order of IN term
2c220 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  s.          ** i
2c230 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
2c240 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65  y related to the
2c250 20 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74   order of output
2c260 20 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20   terms and.     
2c270 20 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74       ** (2) Mult
2c280 69 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f  iple outputs fro
2c290 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61  m a single IN va
2c2a0 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72  lue will not mer
2c2b0 67 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ge.          ** 
2c2c0 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20  together.  */.  
2c2d0 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f          pIdxInfo
2c2e0 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
2c2f0 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  d = 0;.        }
2c300 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c310 20 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6e 73 74     if( i>=nConst
2c320 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 70  raint ){.      p
2c330 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78  New->nLTerm = mx
2c340 54 65 72 6d 2b 31 3b 0a 20 20 20 20 20 20 61 73  Term+1;.      as
2c350 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65  sert( pNew->nLTe
2c360 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  rm<=pNew->nLSlot
2c370 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
2c380 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20  u.vtab.idxNum = 
2c390 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
2c3a0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
2c3b0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
2c3c0 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
2c3d0 46 72 65 65 49 64 78 53 74 72 3b 0a 20 20 20 20  FreeIdxStr;.    
2c3e0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64    pIdxInfo->need
2c3f0 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30  ToFreeIdxStr = 0
2c400 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
2c410 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49  vtab.idxStr = pI
2c420 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a  dxInfo->idxStr;.
2c430 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74        pNew->u.vt
2c440 61 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28  ab.isOrdered = (
2c450 75 38 29 28 28 70 49 64 78 49 6e 66 6f 2d 3e 6e  u8)((pIdxInfo->n
2c460 4f 72 64 65 72 42 79 21 3d 30 29 0a 20 20 20 20  OrderBy!=0).    
2c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c490 20 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72   && pIdxInfo->or
2c4a0 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a  derByConsumed);.
2c4b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
2c4c0 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e  up = 0;.      pN
2c4d0 65 77 2d 3e 72 52 75 6e 20 3d 20 77 68 65 72 65  ew->rRun = where
2c4e0 43 6f 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70  CostFromDouble(p
2c4f0 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
2c500 65 64 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 2f  edCost);.      /
2c510 2a 20 54 55 4e 49 4e 47 3a 20 45 76 65 72 79 20  * TUNING: Every 
2c520 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 71 75  virtual table qu
2c530 65 72 79 20 72 65 74 75 72 6e 73 20 32 35 20 72  ery returns 25 r
2c540 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  ows */.      pNe
2c550 77 2d 3e 6e 4f 75 74 20 3d 20 34 36 3b 20 20 61  w->nOut = 46;  a
2c560 73 73 65 72 74 28 20 34 36 3d 3d 77 68 65 72 65  ssert( 46==where
2c570 43 6f 73 74 28 32 35 29 20 29 3b 0a 20 20 20 20  Cost(25) );.    
2c580 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72    whereLoopInser
2c590 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
2c5a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
2c5b0 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
2c5c0 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ee ){.        sq
2c5d0 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d  lite3_free(pNew-
2c5e0 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b  >u.vtab.idxStr);
2c5f0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
2c600 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
2c610 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
2c620 7d 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65 4c 6f  }.  }  ..whereLo
2c630 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3a 0a  opAddVtab_exit:.
2c640 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
2c650 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
2c660 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
2c670 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
2c680 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
2c690 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29  ee(db, pIdxInfo)
2c6a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2c6b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2c6c0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2c6d0 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64  BLE */../*.** Ad
2c6e0 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  d WhereLoop entr
2c6f0 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52  ies to handle OR
2c700 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f   terms.  This wo
2c710 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a  rks for either.*
2c720 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69 72 74  * btrees or virt
2c730 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73  ual tables..*/.s
2c740 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
2c750 6f 6f 70 41 64 64 4f 72 28 57 68 65 72 65 4c 6f  oopAddOr(WhereLo
2c760 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
2c770 64 65 72 2c 20 42 69 74 6d 61 73 6b 20 6d 45 78  der, Bitmask mEx
2c780 74 72 61 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  tra){.  WhereInf
2c790 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
2c7a0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
2c7b0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2c7c0 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
2c7d0 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  New;.  WhereTerm
2c7e0 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64   *pTerm, *pWCEnd
2c7f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2c800 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43  ITE_OK;.  int iC
2c810 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  ur;.  WhereClaus
2c820 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72  e tempWC;.  Wher
2c830 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75  eLoopBuilder sSu
2c840 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f  bBuild;.  WhereO
2c850 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75 72 2c  rSet sSum, sCur,
2c860 20 73 50 72 65 76 3b 0a 20 20 73 74 72 75 63 74   sPrev;.  struct
2c870 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2c880 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d  Item;.  .  pWC =
2c890 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
2c8a0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
2c8b0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2c8c0 5f 41 4e 44 5f 4f 4e 4c 59 20 29 20 72 65 74 75  _AND_ONLY ) retu
2c8d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2c8e0 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20  pWCEnd = pWC->a 
2c8f0 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20  + pWC->nTerm;.  
2c900 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
2c910 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28  >pNew;.  memset(
2c920 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &sSum, 0, sizeof
2c930 28 73 53 75 6d 29 29 3b 0a 0a 20 20 66 6f 72 28  (sSum));..  for(
2c940 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
2c950 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63  erm<pWCEnd && rc
2c960 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65  ==SQLITE_OK; pTe
2c970 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
2c980 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2c990 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20   & WO_OR)!=0.   
2c9a0 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70    && (pTerm->u.p
2c9b0 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
2c9c0 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  e & pNew->maskSe
2c9d0 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  lf)!=0 .    ){. 
2c9e0 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
2c9f0 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d   * const pOrWC =
2ca00 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
2ca10 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68  fo->wc;.      Wh
2ca20 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20  ereTerm * const 
2ca30 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57  pOrWCEnd = &pOrW
2ca40 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72  C->a[pOrWC->nTer
2ca50 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  m];.      WhereT
2ca60 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20  erm *pOrTerm;.  
2ca70 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31      int once = 1
2ca80 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  ;.      int i, j
2ca90 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 70 49 74  ;.    .      pIt
2caa0 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  em = pWInfo->pTa
2cab0 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d  bList->a + pNew-
2cac0 3e 69 54 61 62 3b 0a 20 20 20 20 20 20 69 43 75  >iTab;.      iCu
2cad0 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  r = pItem->iCurs
2cae0 6f 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75  or;.      sSubBu
2caf0 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b  ild = *pBuilder;
2cb00 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64  .      sSubBuild
2cb10 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
2cb20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
2cb30 4f 72 53 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a  OrSet = &sCur;..
2cb40 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72        for(pOrTer
2cb50 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54  m=pOrWC->a; pOrT
2cb60 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f  erm<pOrWCEnd; pO
2cb70 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
2cb80 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
2cb90 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
2cba0 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ND)!=0 ){.      
2cbb0 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57      sSubBuild.pW
2cbc0 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e  C = &pOrTerm->u.
2cbd0 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  pAndInfo->wc;.  
2cbe0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2cbf0 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
2cc00 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20  sor==iCur ){.   
2cc10 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 57         tempWC.pW
2cc20 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
2cc30 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  fo;.          te
2cc40 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57  mpWC.pOuter = pW
2cc50 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  C;.          tem
2cc60 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  pWC.op = TK_AND;
2cc70 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
2cc80 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  C.nTerm = 1;.   
2cc90 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20         tempWC.a 
2cca0 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20  = pOrTerm;.     
2ccb0 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
2ccc0 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20  WC = &tempWC;.  
2ccd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2cce0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2ccf0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2cd00 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23     sCur.n = 0;.#
2cd10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2cd20 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2cd30 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69          if( IsVi
2cd40 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61  rtual(pItem->pTa
2cd50 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
2cd60 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
2cd70 64 56 69 72 74 75 61 6c 28 26 73 53 75 62 42 75  dVirtual(&sSubBu
2cd80 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ild);.          
2cd90 66 6f 72 28 69 3d 30 3b 20 69 3c 73 43 75 72 2e  for(i=0; i<sCur.
2cda0 6e 3b 20 69 2b 2b 29 20 73 43 75 72 2e 61 5b 69  n; i++) sCur.a[i
2cdb0 5d 2e 70 72 65 72 65 71 20 7c 3d 20 6d 45 78 74  ].prereq |= mExt
2cdc0 72 61 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ra;.        }els
2cdd0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  e.#endif.       
2cde0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   {.          rc 
2cdf0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
2ce00 72 65 65 28 26 73 53 75 62 42 75 69 6c 64 2c 20  ree(&sSubBuild, 
2ce10 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 20  mExtra);.       
2ce20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
2ce30 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
2ce40 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30 20 29 3b   || sCur.n==0 );
2ce50 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 43 75  .        if( sCu
2ce60 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r.n==0 ){.      
2ce70 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a      sSum.n = 0;.
2ce80 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2ce90 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2cea0 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20  f( once ){.     
2ceb0 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65       whereOrMove
2cec0 28 26 73 53 75 6d 2c 20 26 73 43 75 72 29 3b 0a  (&sSum, &sCur);.
2ced0 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d            once =
2cee0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
2cef0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65  e{.          whe
2cf00 72 65 4f 72 4d 6f 76 65 28 26 73 50 72 65 76 2c  reOrMove(&sPrev,
2cf10 20 26 73 53 75 6d 29 3b 0a 20 20 20 20 20 20 20   &sSum);.       
2cf20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20     sSum.n = 0;. 
2cf30 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
2cf40 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b  ; i<sPrev.n; i++
2cf50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
2cf60 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e  or(j=0; j<sCur.n
2cf70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
2cf80 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73        whereOrIns
2cf90 65 72 74 28 26 73 53 75 6d 2c 20 73 50 72 65 76  ert(&sSum, sPrev
2cfa0 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20 73  .a[i].prereq | s
2cfb0 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c  Cur.a[j].prereq,
2cfc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2cfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
2cfe0 72 65 43 6f 73 74 41 64 64 28 73 50 72 65 76 2e  reCostAdd(sPrev.
2cff0 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e  a[i].rRun, sCur.
2d000 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20  a[j].rRun),.    
2d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d020 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6f 73          whereCos
2d030 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e  tAdd(sPrev.a[i].
2d040 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e  nOut, sCur.a[j].
2d050 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20  nOut));.        
2d060 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2d070 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2d080 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e    }.      pNew->
2d090 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
2d0a0 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30    pNew->aLTerm[0
2d0b0 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
2d0c0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
2d0d0 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b   WHERE_MULTI_OR;
2d0e0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65  .      pNew->rSe
2d0f0 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tup = 0;.      p
2d100 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
2d110 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  0;.      memset(
2d120 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a  &pNew->u, 0, siz
2d130 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20  eof(pNew->u));. 
2d140 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63       for(i=0; rc
2d150 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
2d160 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20  <sSum.n; i++){. 
2d170 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
2d180 3a 20 4d 75 6c 74 69 70 6c 65 20 62 79 20 33 2e  : Multiple by 3.
2d190 35 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  5 for the second
2d1a0 61 72 79 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70  ary table lookup
2d1b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
2d1c0 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b  ->rRun = sSum.a[
2d1d0 69 5d 2e 72 52 75 6e 20 2b 20 31 38 3b 0a 20 20  i].rRun + 18;.  
2d1e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
2d1f0 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75   = sSum.a[i].nOu
2d200 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  t;.        pNew-
2d210 3e 70 72 65 72 65 71 20 3d 20 73 53 75 6d 2e 61  >prereq = sSum.a
2d220 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20 20 20  [i].prereq;.    
2d230 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2d240 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
2d250 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
2d260 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
2d270 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2d280 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
2d290 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
2d2a0 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73  all tables .*/.s
2d2b0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
2d2c0 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c  oopAddAll(WhereL
2d2d0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
2d2e0 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e  lder){.  WhereIn
2d2f0 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
2d300 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
2d310 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20   Bitmask mExtra 
2d320 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  = 0;.  Bitmask m
2d330 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74  Prior = 0;.  int
2d340 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74   iTab;.  SrcList
2d350 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
2d360 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
2d370 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2d380 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
2d390 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
2d3a0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
2d3b0 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 20  .  int nTabList 
2d3c0 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
2d3d0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2d3e0 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 70 72 69  ITE_OK;.  u8 pri
2d3f0 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 30 3b 0a  orJoinType = 0;.
2d400 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
2d410 77 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76  w;..  /* Loop ov
2d420 65 72 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  er the tables in
2d430 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20   the join, from 
2d440 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f  left to right */
2d450 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
2d460 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72  er->pNew;.  wher
2d470 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b  eLoopInit(pNew);
2d480 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c 20 70  .  for(iTab=0, p
2d490 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  Item=pTabList->a
2d4a0 3b 20 69 54 61 62 3c 6e 54 61 62 4c 69 73 74 3b  ; iTab<nTabList;
2d4b0 20 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b   iTab++, pItem++
2d4c0 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61  ){.    pNew->iTa
2d4d0 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e  b = iTab;.    pN
2d4e0 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67  ew->maskSelf = g
2d4f0 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
2d500 73 4d 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d  sMaskSet, pItem-
2d510 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69  >iCursor);.    i
2d520 66 28 20 28 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e  f( ((pItem->join
2d530 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 54 79  type|priorJoinTy
2d540 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  pe) & (JT_LEFT|J
2d550 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a  T_CROSS))!=0 ){.
2d560 20 20 20 20 20 20 6d 45 78 74 72 61 20 3d 20 6d        mExtra = m
2d570 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Prior;.    }.   
2d580 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d   priorJoinType =
2d590 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65   pItem->jointype
2d5a0 3b 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74  ;.    if( IsVirt
2d5b0 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29  ual(pItem->pTab)
2d5c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
2d5d0 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
2d5e0 61 6c 28 70 42 75 69 6c 64 65 72 29 3b 0a 20 20  al(pBuilder);.  
2d5f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2d600 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
2d610 42 74 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20  Btree(pBuilder, 
2d620 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20  mExtra);.    }. 
2d630 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2d640 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
2d650 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f   = whereLoopAddO
2d660 72 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74  r(pBuilder, mExt
2d670 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  ra);.    }.    m
2d680 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d  Prior |= pNew->m
2d690 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66 28  askSelf;.    if(
2d6a0 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f   rc || db->mallo
2d6b0 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b  cFailed ) break;
2d6c0 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70  .  }.  whereLoop
2d6d0 43 6c 65 61 72 28 64 62 2c 20 70 4e 65 77 29 3b  Clear(db, pNew);
2d6e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2d6f0 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20 61  ./*.** Examine a
2d700 20 57 68 65 72 65 50 61 74 68 20 28 77 69 74 68   WherePath (with
2d710 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66   the addition of
2d720 20 74 68 65 20 65 78 74 72 61 20 57 68 65 72 65   the extra Where
2d730 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35 74 68 0a  Loop of the 5th.
2d740 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 29 20 74  ** parameters) t
2d750 6f 20 73 65 65 20 69 66 20 69 74 20 6f 75 74 70  o see if it outp
2d760 75 74 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20  uts rows in the 
2d770 72 65 71 75 65 73 74 65 64 20 4f 52 44 45 52 20  requested ORDER 
2d780 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55 50 20  BY.** (or GROUP 
2d790 42 59 29 20 77 69 74 68 6f 75 74 20 72 65 71 75  BY) without requ
2d7a0 69 72 69 6e 67 20 61 20 73 65 70 61 72 61 74 65  iring a separate
2d7b0 20 73 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e 2e   sort operation.
2d7c0 20 20 52 65 74 75 72 6e 3a 0a 2a 2a 20 0a 2a 2a    Return:.** .**
2d7d0 20 20 20 20 30 3a 20 20 4f 52 44 45 52 20 42 59      0:  ORDER BY
2d7e0 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65   is not satisfie
2d7f0 64 2e 20 20 53 6f 72 74 69 6e 67 20 72 65 71 75  d.  Sorting requ
2d800 69 72 65 64 0a 2a 2a 20 20 20 20 31 3a 20 20 4f  ired.**    1:  O
2d810 52 44 45 52 20 42 59 20 69 73 20 73 61 74 69 73  RDER BY is satis
2d820 66 69 65 64 2e 20 20 20 20 20 20 4f 6d 69 74 20  fied.      Omit 
2d830 73 6f 72 74 69 6e 67 0a 2a 2a 20 20 20 2d 31 3a  sorting.**   -1:
2d840 20 20 55 6e 6b 6e 6f 77 6e 20 61 74 20 74 68 69    Unknown at thi
2d850 73 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 4e 6f 74  s time.**.** Not
2d860 65 20 74 68 61 74 20 70 72 6f 63 65 73 73 69 6e  e that processin
2d870 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52 4f 55  g for WHERE_GROU
2d880 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f 44 49  PBY and WHERE_DI
2d890 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f 74 20  STINCTBY is not 
2d8a0 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20 20 57  as.** strict.  W
2d8b0 69 74 68 20 47 52 4f 55 50 20 42 59 20 61 6e 64  ith GROUP BY and
2d8c0 20 44 49 53 54 49 4e 43 54 20 74 68 65 20 6f 6e   DISTINCT the on
2d8d0 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74 20 69  ly requirement i
2d8e0 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69 76 61  s that.** equiva
2d8f0 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65 61 72  lent rows appear
2d900 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 64 6a   immediately adj
2d910 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f  acent to one ano
2d920 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42 59 0a  ther.  GROUP BY.
2d930 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 54 20 64  ** and DISTINT d
2d940 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 72 6f  o not require ro
2d950 77 73 20 74 6f 20 61 70 70 65 61 72 20 69 6e 20  ws to appear in 
2d960 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 6f  any particular o
2d970 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20  rder as long.** 
2d980 61 73 20 65 71 75 69 76 65 6c 65 6e 74 20 72 6f  as equivelent ro
2d990 77 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 74  ws are grouped t
2d9a0 6f 67 65 74 68 65 72 2e 20 20 54 68 75 73 20 66  ogether.  Thus f
2d9b0 6f 72 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  or GROUP BY and 
2d9c0 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20  DISTINCT.** the 
2d9d0 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 63  pOrderBy terms c
2d9e0 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e  an be matched in
2d9f0 20 61 6e 79 20 6f 72 64 65 72 2e 20 20 57 69 74   any order.  Wit
2da00 68 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20  h ORDER BY, the 
2da10 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 74 65 72  .** pOrderBy ter
2da20 6d 73 20 6d 75 73 74 20 62 65 20 6d 61 74 63 68  ms must be match
2da30 65 64 20 69 6e 20 73 74 72 69 63 74 20 6c 65 66  ed in strict lef
2da40 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64 65 72  t-to-right order
2da50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2da60 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
2da70 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65  esOrderBy(.  Whe
2da80 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
2da90 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
2daa0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
2dab0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
2dac0 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f 72    /* ORDER BY or
2dad0 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44 49 53   GROUP BY or DIS
2dae0 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74 6f 20  TINCT clause to 
2daf0 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65  check */.  Where
2db00 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20 20 20  Path *pPath,    
2db10 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50 61 74   /* The WherePat
2db20 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  h to check */.  
2db30 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  u16 wctrlFlags, 
2db40 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20 63        /* Might c
2db50 6f 6e 74 61 69 6e 20 57 48 45 52 45 5f 47 52 4f  ontain WHERE_GRO
2db60 55 50 42 59 20 6f 72 20 57 48 45 52 45 5f 44 49  UPBY or WHERE_DI
2db70 53 54 49 4e 43 54 42 59 20 2a 2f 0a 20 20 75 31  STINCTBY */.  u1
2db80 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20  6 nLoop,        
2db90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2dba0 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61 74   entries in pPat
2dbb0 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20  h->aLoop[] */.  
2dbc0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74  WhereLoop *pLast
2dbd0 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69  ,     /* Add thi
2dbe0 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74  s WhereLoop to t
2dbf0 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68 2d  he end of pPath-
2dc00 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69  >aLoop[] */.  Bi
2dc10 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20  tmask *pRevMask 
2dc20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b      /* OUT: Mask
2dc30 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 74   of WhereLoops t
2dc40 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73 65  o run in reverse
2dc50 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75   order */.){.  u
2dc60 38 20 72 65 76 53 65 74 3b 20 20 20 20 20 20 20  8 revSet;       
2dc70 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2dc80 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a  rev is known */.
2dc90 20 20 75 38 20 72 65 76 3b 20 20 20 20 20 20 20    u8 rev;       
2dca0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f          /* Compo
2dcb0 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72 20  site sort order 
2dcc0 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b 20  */.  u8 revIdx; 
2dcd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2dce0 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20 2a  dex sort order *
2dcf0 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44 69  /.  u8 isOrderDi
2dd00 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c 6c  stinct;   /* All
2dd10 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70   prior WhereLoop
2dd20 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73 74  s are order-dist
2dd30 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69 73  inct */.  u8 dis
2dd40 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20 20  tinctColumns;   
2dd50 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6c  /* True if the l
2dd60 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20 4e  oop has UNIQUE N
2dd70 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20  OT NULL columns 
2dd80 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68 3b  */.  u8 isMatch;
2dd90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 43             /* iC
2dda0 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61 20  olumn matches a 
2ddb0 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45  term of the ORDE
2ddc0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
2ddd0 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20   u16 nColumn;   
2dde0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2ddf0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70   of columns in p
2de00 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e  Index */.  u16 n
2de10 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
2de20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d 73   /* Number terms
2de30 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
2de40 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
2de50 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   iLoop;         
2de60 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57     /* Index of W
2de70 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74  hereLoop in pPat
2de80 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  h being processe
2de90 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  d */.  int i, j;
2dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2deb0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
2dec0 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
2ded0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
2dee0 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75  or number for cu
2def0 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20  rrent WhereLoop 
2df00 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
2df10 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
2df20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69  column number wi
2df30 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75 72 20  thin table iCur 
2df40 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
2df50 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75  pLoop = 0; /* Cu
2df60 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20  rrent WhereLoop 
2df70 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e  being processed.
2df80 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
2df90 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41  *pTerm;     /* A
2dfa0 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
2dfb0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2dfc0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42 45   */.  Expr *pOBE
2dfd0 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  xpr;        /* A
2dfe0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
2dff0 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  m the ORDER BY c
2e000 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53  lause */.  CollS
2e010 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
2e020 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63   /* COLLATE func
2e030 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44  tion from an ORD
2e040 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
2e050 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  m */.  Index *pI
2e060 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  ndex;        /* 
2e070 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f 63 69  The index associ
2e080 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f 70 20  ated with pLoop 
2e090 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
2e0a0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
2e0b0 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62  e->db;  /* Datab
2e0c0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
2e0d0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 53 61  /.  Bitmask obSa
2e0e0 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73  t = 0;    /* Mas
2e0f0 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  k of ORDER BY te
2e100 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 73 6f  rms satisfied so
2e110 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73   far */.  Bitmas
2e120 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20 20  k obDone;       
2e130 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f  /* Mask of all O
2e140 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f  RDER BY terms */
2e150 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64 65 72  .  Bitmask order
2e160 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f  DistinctMask;  /
2e170 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65  * Mask of all we
2e180 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73  ll-ordered loops
2e190 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65   */.  Bitmask re
2e1a0 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
2e1b0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e    /* Mask of inn
2e1c0 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f  er loops */..  /
2e1d0 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68  *.  ** We say th
2e1e0 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22  e WhereLoop is "
2e1f0 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74 20 67  one-row" if it g
2e200 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65  enerates no more
2e210 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72   than one.  ** r
2e220 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 41  ow of output.  A
2e230 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e   WhereLoop is on
2e240 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20  e-row if all of 
2e250 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
2e260 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61  e true:.  **  (a
2e270 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75  ) All index colu
2e280 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68 20 57  mns match with W
2e290 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a  HERE_COLUMN_EQ..
2e2a0 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20 69 6e    **  (b) The in
2e2b0 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a 20 20  dex is unique.  
2e2c0 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70  ** Any WhereLoop
2e2d0 20 77 69 74 68 20 61 6e 20 57 48 45 52 45 5f 43   with an WHERE_C
2e2e0 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61  OLUMN_EQ constra
2e2f0 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64  int on the rowid
2e300 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a   is one-row..  *
2e310 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20  * Every one-row 
2e320 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68  WhereLoop will h
2e330 61 76 65 20 74 68 65 20 57 48 45 52 45 5f 4f 4e  ave the WHERE_ON
2e340 45 52 4f 57 20 62 69 74 20 73 65 74 20 69 6e 20  EROW bit set in 
2e350 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20  wsFlags..  **.  
2e360 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68  ** We say the Wh
2e370 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65  ereLoop is "orde
2e380 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66 20 74  r-distinct" if t
2e390 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e  he set of column
2e3a0 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74  s from.  ** that
2e3b0 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
2e3c0 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44 45 52  are in the ORDER
2e3d0 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 64   BY clause are d
2e3e0 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
2e3f0 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74  ry.  ** row of t
2e400 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45  he WhereLoop.  E
2e410 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65  very one-row Whe
2e420 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61  reLoop is automa
2e430 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64  tically.  ** ord
2e440 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20 20 41  er-distinct.   A
2e450 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
2e460 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69  has no columns i
2e470 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
2e480 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  lause.  ** is no
2e490 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  t order-distinct
2e4a0 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69  . To be order-di
2e4b0 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20 71 75  stinct is not qu
2e4c0 69 74 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  ite the same as 
2e4d0 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55  being.  ** UNIQU
2e4e0 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51 55 45  E since a UNIQUE
2e4f0 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78   column or index
2e500 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70   can have multip
2e510 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a 20 20  le rows that .  
2e520 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20  ** are NULL and 
2e530 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20  NULL values are 
2e540 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 20 74  equivalent for t
2e550 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 6f 72  he purpose of or
2e560 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20  der-distinct..  
2e570 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64  ** To be order-d
2e580 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c  istinct, the col
2e590 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55 4e 49  umns must be UNI
2e5a0 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c  QUE and NOT NULL
2e5b0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
2e5c0 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61 62 6c  rowid for a tabl
2e5d0 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e 49 51  e is always UNIQ
2e5e0 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20  UE and NOT NULL 
2e5f0 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a  so whenever the.
2e600 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70 65 61    ** rowid appea
2e610 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  rs in the ORDER 
2e620 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63  BY clause, the c
2e630 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65  orresponding Whe
2e640 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61  reLoop is.  ** a
2e650 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64  utomatically ord
2e660 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a  er-distinct..  *
2e670 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  /..  assert( pOr
2e680 64 65 72 42 79 21 3d 30 20 29 3b 0a 0a 20 20 2f  derBy!=0 );..  /
2e690 2a 20 53 6f 72 74 61 62 69 6c 69 74 79 20 6f 66  * Sortability of
2e6a0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
2e6b0 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
2e6c0 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20   the xBestIndex 
2e6d0 6d 65 74 68 6f 64 0a 20 20 2a 2a 20 6f 66 20 74  method.  ** of t
2e6e0 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
2e6f0 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20 69 66 28   itself */.  if(
2e700 20 70 4c 61 73 74 2d 3e 77 73 46 6c 61 67 73 20   pLast->wsFlags 
2e710 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
2e720 41 42 4c 45 20 29 7b 0a 20 20 20 20 74 65 73 74  ABLE ){.    test
2e730 63 61 73 65 28 20 6e 4c 6f 6f 70 3e 30 20 29 3b  case( nLoop>0 );
2e740 20 20 2f 2a 20 54 72 75 65 20 77 68 65 6e 20 6f    /* True when o
2e750 75 74 65 72 20 6c 6f 6f 70 73 20 61 72 65 20 6f  uter loops are o
2e760 6e 65 2d 72 6f 77 20 61 6e 64 20 6d 61 74 63 68  ne-row and match
2e770 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2e780 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e              ** n
2e790 6f 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  o ORDER BY terms
2e7a0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70   */.    return p
2e7b0 4c 61 73 74 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  Last->u.vtab.isO
2e7c0 72 64 65 72 65 64 3b 0a 20 20 7d 0a 20 20 69 66  rdered;.  }.  if
2e7d0 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d  ( nLoop && Optim
2e7e0 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
2e7f0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72  db, SQLITE_Order
2e800 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72 65 74  ByIdxJoin) ) ret
2e810 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72  urn 0;..  nOrder
2e820 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
2e830 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61 73 65  Expr;.  testcase
2e840 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d  ( nOrderBy==BMS-
2e850 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65  1 );.  if( nOrde
2e860 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65 74 75  rBy>BMS-1 ) retu
2e870 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74  rn 0;  /* Cannot
2e880 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79   optimize overly
2e890 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42 59 73   large ORDER BYs
2e8a0 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44 69 73   */.  isOrderDis
2e8b0 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44  tinct = 1;.  obD
2e8c0 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f  one = MASKBIT(nO
2e8d0 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64  rderBy)-1;.  ord
2e8e0 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d  erDistinctMask =
2e8f0 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20 30 3b   0;.  ready = 0;
2e900 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
2e910 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2e920 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20  && obSat<obDone 
2e930 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b  && iLoop<=nLoop;
2e940 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69   iLoop++){.    i
2e950 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61  f( iLoop>0 ) rea
2e960 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73  dy |= pLoop->mas
2e970 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4c 6f 6f 70  kSelf;.    pLoop
2e980 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f   = iLoop<nLoop ?
2e990 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c   pPath->aLoop[iL
2e9a0 6f 6f 70 5d 20 3a 20 70 4c 61 73 74 3b 0a 20 20  oop] : pLast;.  
2e9b0 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
2e9c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2e9d0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
2e9e0 3d 30 20 29 3b 0a 20 20 20 20 69 43 75 72 20 3d  =0 );.    iCur =
2e9f0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2ea00 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62  t->a[pLoop->iTab
2ea10 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20  ].iCursor;..    
2ea20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20  /* Mark off any 
2ea30 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 58 20  ORDER BY term X 
2ea40 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  that is a column
2ea50 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 66   in the table of
2ea60 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72  .    ** the curr
2ea70 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69  ent loop for whi
2ea80 63 68 20 74 68 65 72 65 20 69 73 20 74 65 72 6d  ch there is term
2ea90 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20 20   in the WHERE.  
2eaa0 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74    ** clause of t
2eab0 68 65 20 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c  he form X IS NUL
2eac0 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74 20 72 65  L or X=? that re
2ead0 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74  ference only out
2eae0 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e  er.    ** loops.
2eaf0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
2eb00 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
2eb10 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
2eb20 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62   MASKBIT(i) & ob
2eb30 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Sat ) continue;.
2eb40 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20        pOBExpr = 
2eb50 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
2eb60 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d  ollate(pOrderBy-
2eb70 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
2eb80 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
2eb90 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
2eba0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2ebb0 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54   if( pOBExpr->iT
2ebc0 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e  able!=iCur ) con
2ebd0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 54 65  tinue;.      pTe
2ebe0 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 70  rm = findTerm(&p
2ebf0 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72  WInfo->sWC, iCur
2ec00 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75  , pOBExpr->iColu
2ec10 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn,.            
2ec20 20 20 20 20 20 20 20 20 20 20 20 7e 72 65 61 64             ~read
2ec30 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55  y, WO_EQ|WO_ISNU
2ec40 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  LL, 0);.      if
2ec50 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e  ( pTerm==0 ) con
2ec60 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
2ec70 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
2ec80 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 26 26 20  or&WO_EQ)!=0 && 
2ec90 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
2eca0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
2ecb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 2a  onst char *z1, *
2ecc0 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  z2;.        pCol
2ecd0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
2ece0 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70  ollSeq(pWInfo->p
2ecf0 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
2ed00 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
2ed10 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
2ed20 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
2ed30 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
2ed40 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e    z1 = pColl->zN
2ed50 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  ame;.        pCo
2ed60 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
2ed70 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
2ed80 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
2ed90 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
2eda0 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
2edb0 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
2edc0 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20  l;.        z2 = 
2edd0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
2ede0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2edf0 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29  3StrICmp(z1, z2)
2ee00 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
2ee10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 62        }.      ob
2ee20 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  Sat |= MASKBIT(i
2ee30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
2ee40 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
2ee50 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
2ee60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
2ee70 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
2ee80 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a   & WHERE_IPK ){.
2ee90 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d          pIndex =
2eea0 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c   0;.        nCol
2eeb0 75 6d 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  umn = 0;.      }
2eec0 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64 65 78  else if( (pIndex
2eed0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
2eee0 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20  e.pIndex)==0 || 
2eef0 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72  pIndex->bUnorder
2ef00 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ed ){.        re
2ef10 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65  turn 0;.      }e
2ef20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 43 6f  lse{.        nCo
2ef30 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e  lumn = pIndex->n
2ef40 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
2ef50 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2ef60 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  = pIndex->onErro
2ef70 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 20 20  r!=OE_None;.    
2ef80 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f    }..      /* Lo
2ef90 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63  op through all c
2efa0 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
2efb0 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69 74  dex and deal wit
2efc0 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20 20  h the ones.     
2efd0 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74   ** that are not
2efe0 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20   constrained by 
2eff0 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20  == or IN..      
2f000 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20 72  */.      rev = r
2f010 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  evSet = 0;.     
2f020 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
2f030 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
2f040 6a 3d 30 3b 20 6a 3c 3d 6e 43 6f 6c 75 6d 6e 3b  j=0; j<=nColumn;
2f050 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   j++){.        u
2f060 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72  8 bOnce;   /* Tr
2f070 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52  ue to run the OR
2f080 44 45 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f  DER BY search lo
2f090 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  op */..        /
2f0a0 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61  * Skip over == a
2f0b0 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d 73  nd IS NULL terms
2f0c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2f0d0 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  j<pLoop->u.btree
2f0e0 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26  .nEq.         &&
2f0f0 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c   ((i = pLoop->aL
2f100 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74  Term[j]->eOperat
2f110 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  or) & (WO_EQ|WO_
2f120 49 53 4e 55 4c 4c 29 29 21 3d 30 0a 20 20 20 20  ISNULL))!=0.    
2f130 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2f140 20 69 66 28 20 69 20 26 20 57 4f 5f 49 53 4e 55   if( i & WO_ISNU
2f150 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
2f160 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
2f170 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  derDistinct );. 
2f180 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
2f190 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
2f1a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f1b0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
2f1c0 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20   .        }..   
2f1d0 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20       /* Get the 
2f1e0 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e  column number in
2f1f0 20 74 68 65 20 74 61 62 6c 65 20 28 69 43 6f 6c   the table (iCol
2f200 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20 6f 72  umn) and sort or
2f210 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  der.        ** (
2f220 72 65 76 49 64 78 29 20 66 6f 72 20 74 68 65 20  revIdx) for the 
2f230 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  j-th column of t
2f240 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  he index..      
2f250 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2f260 20 6a 3c 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20   j<nColumn ){.  
2f270 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 72 6d 61          /* Norma
2f280 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  l index columns 
2f290 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  */.          iCo
2f2a0 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61  lumn = pIndex->a
2f2b0 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
2f2c0 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 70        revIdx = p
2f2d0 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
2f2e0 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  r[j];.          
2f2f0 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e  if( iColumn==pIn
2f300 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b  dex->pTable->iPK
2f310 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d  ey ) iColumn = -
2f320 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
2f330 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2f340 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20  he ROWID column 
2f350 61 74 20 74 68 65 20 65 6e 64 20 2a 2f 0a 20 20  at the end */.  
2f360 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f370 6a 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  j==nColumn );.  
2f380 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20          iColumn 
2f390 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
2f3a0 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  revIdx = 0;.    
2f3b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
2f3c0 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e  * An unconstrain
2f3d0 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d  ed column that m
2f3e0 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61  ight be NULL mea
2f3f0 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20 20 20  ns that this.   
2f400 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f       ** WhereLoo
2f410 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72  p is not well-or
2f420 64 65 72 65 64 20 0a 20 20 20 20 20 20 20 20 2a  dered .        *
2f430 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  /.        if( is
2f440 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a 20 20  OrderDistinct.  
2f450 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c 75 6d         && iColum
2f460 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  n>=0.         &&
2f470 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72   j>=pLoop->u.btr
2f480 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20  ee.nEq.         
2f490 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  && pIndex->pTabl
2f4a0 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d  e->aCol[iColumn]
2f4b0 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20  .notNull==0.    
2f4c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2f4d0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2f4e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
2f4f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64  .        /* Find
2f500 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65   the ORDER BY te
2f510 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  rm that correspo
2f520 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74 68 20  nds to the j-th 
2f530 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a  column.        *
2f540 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  * of the index a
2f550 6e 64 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74  nd and mark that
2f560 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f   ORDER BY term o
2f570 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ff .        */. 
2f580 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 31         bOnce = 1
2f590 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74 63  ;.        isMatc
2f5a0 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  h = 0;.        f
2f5b0 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26  or(i=0; bOnce &&
2f5c0 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
2f5d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2f5e0 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62   MASKBIT(i) & ob
2f5f0 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Sat ) continue;.
2f600 20 20 20 20 20 20 20 20 20 20 70 4f 42 45 78 70            pOBExp
2f610 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
2f620 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65  kipCollate(pOrde
2f630 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
2f640 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
2f650 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73  case( wctrlFlags
2f660 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
2f670 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   );.          te
2f680 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
2f690 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
2f6a0 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20 20 20  NCTBY );.       
2f6b0 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
2f6c0 67 73 20 26 20 28 57 48 45 52 45 5f 47 52 4f 55  gs & (WHERE_GROU
2f6d0 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54 49 4e  PBY|WHERE_DISTIN
2f6e0 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63  CTBY))==0 ) bOnc
2f6f0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
2f700 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70   if( pOBExpr->op
2f710 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f  !=TK_COLUMN ) co
2f720 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2f730 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69    if( pOBExpr->i
2f740 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f  Table!=iCur ) co
2f750 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2f760 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69    if( pOBExpr->i
2f770 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
2f780 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2f790 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
2f7a0 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
2f7b0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
2f7c0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2f7d0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
2f7e0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2f7f0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
2f800 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
2f810 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
2f820 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
2f830 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
2f840 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
2f850 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  e, pIndex->azCol
2f860 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69  l[j])!=0 ) conti
2f870 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
2f880 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d 61 74  .          isMat
2f890 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ch = 1;.        
2f8a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2f8b0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
2f8c0 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  sMatch ){.      
2f8d0 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c      if( iColumn<
2f8e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2f8f0 20 74 65 73 74 63 61 73 65 28 20 64 69 73 74 69   testcase( disti
2f900 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b  nctColumns==0 );
2f910 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73  .            dis
2f920 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31  tinctColumns = 1
2f930 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f940 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d          obSat |=
2f950 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
2f960 20 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e         if( (pWIn
2f970 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
2f980 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d   WHERE_GROUPBY)=
2f990 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2f9a0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
2f9b0 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73  he sort order is
2f9c0 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61   compatible in a
2f9d0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
2f9e0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  e..            *
2f9f0 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69 73 20  * Sort order is 
2fa00 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 61  irrelevant for a
2fa10 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2fa20 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
2fa30 20 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a 20   if( revSet ){. 
2fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2fa50 20 28 72 65 76 20 5e 20 72 65 76 49 64 78 29 21   (rev ^ revIdx)!
2fa60 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  =pOrderBy->a[i].
2fa70 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74 75  sortOrder ) retu
2fa80 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20  rn 0;.          
2fa90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2faa0 20 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76         rev = rev
2fab0 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e  Idx ^ pOrderBy->
2fac0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
2fad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2fae0 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73  ( rev ) *pRevMas
2faf0 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f  k |= MASKBIT(iLo
2fb00 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  op);.           
2fb10 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a 20     revSet = 1;. 
2fb20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2fb30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fb40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2fb50 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f    /* No match fo
2fb60 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
2fb70 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e   if( j==0 || j<n
2fb80 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
2fb90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2fba0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21  isOrderDistinct!
2fbb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2fbc0 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2fbd0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
2fbe0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
2fbf0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
2fc00 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f      } /* end Loo
2fc10 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78  p over all index
2fc20 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
2fc30 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f    if( distinctCo
2fc40 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20  lumns ){.       
2fc50 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
2fc60 65 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b  erDistinct==0 );
2fc70 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72  .        isOrder
2fc80 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20  Distinct = 1;.  
2fc90 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65      }.    } /* e
2fca0 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f  nd-if not one-ro
2fcb0 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72  w */..    /* Mar
2fcc0 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20  k off any other 
2fcd0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
2fce0 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c  hat reference pL
2fcf0 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  oop */.    if( i
2fd00 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29  sOrderDistinct )
2fd10 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69 73  {.      orderDis
2fd20 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f  tinctMask |= pLo
2fd30 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
2fd40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2fd50 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
2fd60 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a         Expr *p;.
2fd70 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b          if( MASK
2fd80 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29  BIT(i) & obSat )
2fd90 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2fda0 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d     p = pOrderBy-
2fdb0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
2fdc0 20 20 20 20 20 69 66 28 20 28 65 78 70 72 54 61       if( (exprTa
2fdd0 62 6c 65 55 73 61 67 65 28 26 70 57 49 6e 66 6f  bleUsage(&pWInfo
2fde0 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 29 26 7e  ->sMaskSet, p)&~
2fdf0 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
2fe00 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
2fe10 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
2fe20 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20  BIT(i);.        
2fe30 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2fe40 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c    } /* End the l
2fe50 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68 65  oop over all Whe
2fe60 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74  reLoops from out
2fe70 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20  er-most down to 
2fe80 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20  inner-most */.  
2fe90 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e  if( obSat==obDon
2fea0 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  e ) return 1;.  
2feb0 69 66 28 20 21 69 73 4f 72 64 65 72 44 69 73 74  if( !isOrderDist
2fec0 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  inct ) return 0;
2fed0 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
2fee0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
2fef0 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f  CE_ENABLED./* Fo
2ff00 72 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20  r debugging use 
2ff10 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20  only: */.static 
2ff20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65 72  const char *wher
2ff30 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65 50  ePathName(WhereP
2ff40 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74 20  ath *pPath, int 
2ff50 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70  nLoop, WhereLoop
2ff60 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61 74   *pLast){.  stat
2ff70 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35  ic char zName[65
2ff80 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ];.  int i;.  fo
2ff90 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20  r(i=0; i<nLoop; 
2ffa0 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d  i++){ zName[i] =
2ffb0 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d   pPath->aLoop[i]
2ffc0 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20 70  ->cId; }.  if( p
2ffd0 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b  Last ) zName[i++
2ffe0 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a  ] = pLast->cId;.
2fff0 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a    zName[i] = 0;.
30000 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a    return zName;.
30010 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
30020 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74 20   Given the list 
30030 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  of WhereLoop obj
30040 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e  ects at pWInfo->
30050 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f 75  pLoops, this rou
30060 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73  tine.** attempts
30070 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f 77   to find the low
30080 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 74 68  est cost path th
30090 61 74 20 76 69 73 69 74 73 20 65 61 63 68 20 57  at visits each W
300a0 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65  hereLoop.** once
300b0 2e 20 20 54 68 69 73 20 70 61 74 68 20 69 73 20  .  This path is 
300c0 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f  then loaded into
300d0 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d   the pWInfo->a[]
300e0 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a  .pWLoop fields..
300f0 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68 61  **.** Assume tha
30100 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  t the total numb
30110 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
30120 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64  s that will need
30130 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a   to be sorted.**
30140 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74   will be nRowEst
30150 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32   (in the 10*log2
30160 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 29   representation)
30170 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f  .  Or, ignore so
30180 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69  rting.** costs i
30190 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a  f nRowEst==0..**
301a0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
301b0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
301c0 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  or SQLITE_NOMEM 
301d0 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  of a memory allo
301e0 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20  cation.** error 
301f0 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
30200 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68 53  c int wherePathS
30210 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f 20  olver(WhereInfo 
30220 2a 70 57 49 6e 66 6f 2c 20 57 68 65 72 65 43 6f  *pWInfo, WhereCo
30230 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69  st nRowEst){.  i
30240 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20 20 20  nt mxChoice;    
30250 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
30260 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  mum number of si
30270 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73  multaneous paths
30280 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e   tracked */.  in
30290 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t nLoop;        
302a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
302b0 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
302c0 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73  e join */.  Pars
302d0 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
302e0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
302f0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
30300 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
30310 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
30320 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
30330 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f  on */.  int iLoo
30340 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
30350 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
30360 72 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73  r over the terms
30370 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
30380 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20    int ii, jj;   
30390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
303a0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
303b0 20 20 57 68 65 72 65 43 6f 73 74 20 72 43 6f 73    WhereCost rCos
303c0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
303d0 2a 20 43 6f 73 74 20 6f 66 20 61 20 70 61 74 68  * Cost of a path
303e0 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
303f0 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 20  mxCost = 0;     
30400 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f     /* Maximum co
30410 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70  st of a set of p
30420 61 74 68 73 20 2a 2f 0a 20 20 57 68 65 72 65 43  aths */.  WhereC
30430 6f 73 74 20 72 53 6f 72 74 43 6f 73 74 3b 20 20  ost rSortCost;  
30440 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 74         /* Cost t
30450 6f 20 64 6f 20 61 20 73 6f 72 74 20 2a 2f 0a 20  o do a sort */. 
30460 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b   int nTo, nFrom;
30470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
30480 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e  mber of valid en
30490 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61  tries in aTo[] a
304a0 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20  nd aFrom[] */.  
304b0 57 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d  WherePath *aFrom
304c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ;         /* All
304d0 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20   nFrom paths at 
304e0 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76  the previous lev
304f0 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  el */.  WherePat
30500 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20  h *aTo;         
30510 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73    /* The nTo bes
30520 74 20 70 61 74 68 73 20 61 74 20 74 68 65 20 63  t paths at the c
30530 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a  urrent level */.
30540 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 46 72    WherePath *pFr
30550 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  om;         /* A
30560 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72  n element of aFr
30570 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65  om[] that we are
30580 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20   working on */. 
30590 20 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b   WherePath *pTo;
305a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
305b0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b   element of aTo[
305c0 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f  ] that we are wo
305d0 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68  rking on */.  Wh
305e0 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b  ereLoop *pWLoop;
305f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
30600 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
30610 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65  objects */.  Whe
30620 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20  reLoop **pX;    
30630 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
30640 6f 20 64 69 76 79 20 75 70 20 74 68 65 20 70 53  o divy up the pS
30650 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  pace memory */. 
30660 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20   char *pSpace;  
30670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
30680 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75  mporary memory u
30690 73 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  sed by this rout
306a0 69 6e 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ine */..  pParse
306b0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
306c0 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  e;.  db = pParse
306d0 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20  ->db;.  nLoop = 
306e0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a  pWInfo->nLevel;.
306f0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72    /* TUNING: For
30700 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c   simple queries,
30710 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70   only the best p
30720 61 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a  ath is tracked..
30730 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a    ** For 2-way j
30740 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74  oins, the 5 best
30750 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f   paths are follo
30760 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f  wed..  ** For jo
30770 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65  ins of 3 or more
30780 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74   tables, track t
30790 68 65 20 31 30 20 62 65 73 74 20 70 61 74 68 73  he 10 best paths
307a0 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d   */.  mxChoice =
307b0 20 28 6e 4c 6f 6f 70 3d 3d 31 29 20 3f 20 31 20   (nLoop==1) ? 1 
307c0 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20  : (nLoop==2 ? 5 
307d0 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28  : 10);.  assert(
307e0 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e   nLoop<=pWInfo->
307f0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
30800 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  ;.  WHERETRACE(0
30810 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67  x002, ("---- beg
30820 69 6e 20 73 6f 6c 76 65 72 5c 6e 22 29 29 3b 0a  in solver\n"));.
30830 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
30840 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70  nd initialize sp
30850 61 63 65 20 66 6f 72 20 61 54 6f 20 61 6e 64 20  ace for aTo and 
30860 61 46 72 6f 6d 20 2a 2f 0a 20 20 69 69 20 3d 20  aFrom */.  ii = 
30870 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74  (sizeof(WherePat
30880 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  h)+sizeof(WhereL
30890 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43  oop*)*nLoop)*mxC
308a0 68 6f 69 63 65 2a 32 3b 0a 20 20 70 53 70 61 63  hoice*2;.  pSpac
308b0 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
308c0 6c 6f 63 52 61 77 28 64 62 2c 20 69 69 29 3b 0a  locRaw(db, ii);.
308d0 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20    if( pSpace==0 
308e0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
308f0 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28  NOMEM;.  aTo = (
30900 57 68 65 72 65 50 61 74 68 2a 29 70 53 70 61 63  WherePath*)pSpac
30910 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f  e;.  aFrom = aTo
30920 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d  +mxChoice;.  mem
30930 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69  set(aFrom, 0, si
30940 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b  zeof(aFrom[0]));
30950 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f  .  pX = (WhereLo
30960 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68  op**)(aFrom+mxCh
30970 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d  oice);.  for(ii=
30980 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f  mxChoice*2, pFro
30990 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d  m=aTo; ii>0; ii-
309a0 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b  -, pFrom++, pX +
309b0 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46  = nLoop){.    pF
309c0 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b  rom->aLoop = pX;
309d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 64 20  .  }..  /* Seed 
309e0 74 68 65 20 73 65 61 72 63 68 20 77 69 74 68 20  the search with 
309f0 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 50 61  a single WherePa
30a00 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65  th containing ze
30a10 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20  ro WhereLoops.. 
30a20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a   **.  ** TUNING:
30a30 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20   Do not let the 
30a40 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74  number of iterat
30a50 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20 32 35  ions go above 25
30a60 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74 0a 20  .  If the cost. 
30a70 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67   ** of computing
30a80 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
30a90 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69 64 20  dex is not paid 
30aa0 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20  back within the 
30ab0 66 69 72 73 74 20 32 35 0a 20 20 2a 2a 20 72 6f  first 25.  ** ro
30ac0 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ws, then do not 
30ad0 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69  use the automati
30ae0 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46  c index. */.  aF
30af0 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49  rom[0].nRow = MI
30b00 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  N(pParse->nQuery
30b10 4c 6f 6f 70 2c 20 34 36 29 3b 20 20 61 73 73 65  Loop, 46);  asse
30b20 72 74 28 20 34 36 3d 3d 77 68 65 72 65 43 6f 73  rt( 46==whereCos
30b30 74 28 32 35 29 20 29 3b 0a 20 20 6e 46 72 6f 6d  t(25) );.  nFrom
30b40 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 50 72 65 63   = 1;..  /* Prec
30b50 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 73 74 20  ompute the cost 
30b60 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65 20 66  of sorting the f
30b70 69 6e 61 6c 20 72 65 73 75 6c 74 20 73 65 74 2c  inal result set,
30b80 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 0a 20   if the caller. 
30b90 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 57 68   ** to sqlite3Wh
30ba0 65 72 65 42 65 67 69 6e 28 29 20 77 61 73 20 63  ereBegin() was c
30bb0 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 73  oncerned about s
30bc0 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 72 53 6f 72  orting */.  rSor
30bd0 74 43 6f 73 74 20 3d 20 30 3b 0a 20 20 69 66 28  tCost = 0;.  if(
30be0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
30bf0 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d  y==0 || nRowEst=
30c00 3d 30 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 5b  =0 ){.    aFrom[
30c10 30 5d 2e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  0].isOrderedVali
30c20 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 1;.  }else{.
30c30 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45      /* TUNING: E
30c40 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66  stimated cost of
30c50 20 73 6f 72 74 69 6e 67 20 69 73 20 4e 2a 6c 6f   sorting is N*lo
30c60 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73  g2(N) where N is
30c70 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62   the.    ** numb
30c80 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
30c90 73 2e 20 2a 2f 0a 20 20 20 20 72 53 6f 72 74 43  s. */.    rSortC
30ca0 6f 73 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20  ost = nRowEst + 
30cb0 65 73 74 4c 6f 67 28 6e 52 6f 77 45 73 74 29 3b  estLog(nRowEst);
30cc0 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
30cd0 30 78 30 30 32 2c 28 22 2d 2d 2d 2d 20 73 6f 72  0x002,("---- sor
30ce0 74 20 63 6f 73 74 3d 25 2d 33 64 5c 6e 22 2c 20  t cost=%-3d\n", 
30cf0 72 53 6f 72 74 43 6f 73 74 29 29 3b 0a 20 20 7d  rSortCost));.  }
30d00 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73  ..  /* Compute s
30d10 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67  uccessively long
30d20 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75 73  er WherePaths us
30d30 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75 73  ing the previous
30d40 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a   generation.  **
30d50 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20 61   of WherePaths a
30d60 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72 20  s the basis for 
30d70 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20  the next.  Keep 
30d80 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43  track of the mxC
30d90 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20  hoice.  ** best 
30da0 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67 65  paths at each ge
30db0 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f  neration */.  fo
30dc0 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70  r(iLoop=0; iLoop
30dd0 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  <nLoop; iLoop++)
30de0 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20  {.    nTo = 0;. 
30df0 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72     for(ii=0, pFr
30e00 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72  om=aFrom; ii<nFr
30e10 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b  om; ii++, pFrom+
30e20 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57  +){.      for(pW
30e30 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f  Loop=pWInfo->pLo
30e40 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c  ops; pWLoop; pWL
30e50 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78  oop=pWLoop->pNex
30e60 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20  tLoop){.        
30e70 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b  Bitmask maskNew;
30e80 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
30e90 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20   revMask = 0;.  
30ea0 20 20 20 20 20 20 75 38 20 69 73 4f 72 64 65 72        u8 isOrder
30eb0 65 64 56 61 6c 69 64 20 3d 20 70 46 72 6f 6d 2d  edValid = pFrom-
30ec0 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b  >isOrderedValid;
30ed0 0a 20 20 20 20 20 20 20 20 75 38 20 69 73 4f 72  .        u8 isOr
30ee0 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69  dered = pFrom->i
30ef0 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20  sOrdered;.      
30f00 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70    if( (pWLoop->p
30f10 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e  rereq & ~pFrom->
30f20 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63  maskLoop)!=0 ) c
30f30 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
30f40 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61   if( (pWLoop->ma
30f50 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e  skSelf & pFrom->
30f60 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63  maskLoop)!=0 ) c
30f70 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
30f80 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
30f90 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63  t, pWLoop is a c
30fa0 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74  andidate to be t
30fb0 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20  he next loop. . 
30fc0 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74         ** Comput
30fd0 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20  e its cost */.  
30fe0 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 77 68        rCost = wh
30ff0 65 72 65 43 6f 73 74 41 64 64 28 70 57 4c 6f 6f  ereCostAdd(pWLoo
31000 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70  p->rSetup,pWLoop
31010 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e  ->rRun + pFrom->
31020 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 72  nRow);.        r
31030 43 6f 73 74 20 3d 20 77 68 65 72 65 43 6f 73 74  Cost = whereCost
31040 41 64 64 28 72 43 6f 73 74 2c 20 70 46 72 6f 6d  Add(rCost, pFrom
31050 2d 3e 72 43 6f 73 74 29 3b 0a 20 20 20 20 20 20  ->rCost);.      
31060 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f    maskNew = pFro
31070 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57  m->maskLoop | pW
31080 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
31090 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73 4f          if( !isO
310a0 72 64 65 72 65 64 56 61 6c 69 64 20 29 7b 0a 20  rderedValid ){. 
310b0 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28           switch(
310c0 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
310d0 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66  iesOrderBy(pWInf
310e0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
310f0 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
31100 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f  ->pOrderBy, pFro
31110 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  m, pWInfo->wctrl
31120 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  Flags,.         
31130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 4c                iL
31140 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72 65  oop, pWLoop, &re
31150 76 4d 61 73 6b 29 20 29 7b 0a 20 20 20 20 20 20  vMask) ){.      
31160 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 20 2f        case 1:  /
31170 2a 20 59 65 73 2e 20 20 70 46 72 6f 6d 2b 70 57  * Yes.  pFrom+pW
31180 4c 6f 6f 70 20 64 6f 65 73 20 73 61 74 69 73 66  Loop does satisf
31190 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  y the ORDER BY c
311a0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20  lause */.       
311b0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
311c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
311d0 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c      isOrderedVal
311e0 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  id = 1;.        
311f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
31200 20 20 20 20 20 20 20 20 20 63 61 73 65 20 30 3a           case 0:
31210 20 20 2f 2a 20 4e 6f 2e 20 20 70 46 72 6f 6d 2b    /* No.  pFrom+
31220 70 57 4c 6f 6f 70 20 77 69 6c 6c 20 72 65 71 75  pWLoop will requ
31230 69 72 65 20 61 20 73 65 70 61 72 61 74 65 20 73  ire a separate s
31240 6f 72 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ort */.         
31250 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d       isOrdered =
31260 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
31270 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64    isOrderedValid
31280 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
31290 20 20 20 20 72 43 6f 73 74 20 3d 20 77 68 65 72      rCost = wher
312a0 65 43 6f 73 74 41 64 64 28 72 43 6f 73 74 2c 20  eCostAdd(rCost, 
312b0 72 53 6f 72 74 43 6f 73 74 29 3b 0a 20 20 20 20  rSortCost);.    
312c0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
312d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66  .            def
312e0 61 75 6c 74 3a 20 2f 2a 20 43 61 6e 6e 6f 74 20  ault: /* Cannot 
312f0 74 65 6c 6c 20 79 65 74 2e 20 20 54 72 79 20 61  tell yet.  Try a
31300 67 61 69 6e 20 6f 6e 20 74 68 65 20 6e 65 78 74  gain on the next
31310 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   iteration */.  
31320 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
31330 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
31340 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
31350 20 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20          revMask 
31360 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70  = pFrom->revLoop
31370 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31380 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
31390 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68  see if pWLoop sh
313a0 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f  ould be added to
313b0 20 74 68 65 20 6d 78 43 68 6f 69 63 65 20 62 65   the mxChoice be
313c0 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  st so far */.   
313d0 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70       for(jj=0, p
313e0 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20  To=aTo; jj<nTo; 
313f0 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  jj++, pTo++){.  
31400 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
31410 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e  >maskLoop==maskN
31420 65 77 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64  ew && pTo->isOrd
31430 65 72 65 64 56 61 6c 69 64 3d 3d 69 73 4f 72 64  eredValid==isOrd
31440 65 72 65 64 56 61 6c 69 64 20 29 7b 0a 20 20 20  eredValid ){.   
31450 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
31460 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a  e( jj==nTo-1 );.
31470 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
31480 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
31490 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
314a0 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a   if( jj>=nTo ){.
314b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54            if( nT
314c0 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 26 26 20 72  o>=mxChoice && r
314d0 43 6f 73 74 3e 3d 6d 78 43 6f 73 74 20 29 7b 0a  Cost>=mxCost ){.
314e0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
314f0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20  E_ENABLED.      
31500 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
31510 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
31520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
31530 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
31540 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20 63  ntf("Skip   %s c
31550 6f 73 74 3d 25 33 64 20 6f 72 64 65 72 3d 25 63  ost=%3d order=%c
31560 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
31570 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
31580 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
31590 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
315a0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
315b0 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61       isOrderedVa
315c0 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64  lid ? (isOrdered
315d0 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20   ? 'Y' : 'N') : 
315e0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
315f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
31600 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
31610 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31620 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20         /* Add a 
31630 6e 65 77 20 50 61 74 68 20 74 6f 20 74 68 65 20  new Path to the 
31640 61 54 6f 5b 5d 20 73 65 74 20 2a 2f 0a 20 20 20  aTo[] set */.   
31650 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d         if( nTo<m
31660 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20  xChoice ){.     
31670 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61         /* Increa
31680 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
31690 68 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f 6e  he aTo set by on
316a0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
316b0 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20   jj = nTo++;.   
316c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
316d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
316e0 20 70 61 74 68 20 72 65 70 6c 61 63 65 73 20 74   path replaces t
316f0 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20 74  he prior worst t
31700 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65 6c  o keep count bel
31710 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20  ow mxChoice */. 
31720 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
31730 6a 3d 6e 54 6f 2d 31 3b 20 61 54 6f 5b 6a 6a 5d  j=nTo-1; aTo[jj]
31740 2e 72 43 6f 73 74 3c 6d 78 43 6f 73 74 3b 20 6a  .rCost<mxCost; j
31750 6a 2d 2d 29 7b 20 61 73 73 65 72 74 28 6a 6a 3e  j--){ assert(jj>
31760 30 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20  0); }.          
31770 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f 20  }.          pTo 
31780 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64  = &aTo[jj];.#ifd
31790 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
317a0 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20  ABLED.          
317b0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
317c0 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
317d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
317e0 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77  DebugPrintf("New
317f0 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64      %s cost=%-3d
31800 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
31810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
31820 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
31830 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
31840 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20  ), rCost,.      
31850 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
31860 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72  redValid ? (isOr
31870 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e  dered ? 'Y' : 'N
31880 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
31890 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
318a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
318b0 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
318c0 72 43 6f 73 74 3c 3d 72 43 6f 73 74 20 29 7b 0a  rCost<=rCost ){.
318d0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
318e0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20  E_ENABLED.      
318f0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
31900 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
31910 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
31920 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
31930 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
31940 20 20 20 20 20 20 20 22 53 6b 69 70 20 20 20 25         "Skip   %
31950 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65  s cost=%-3d orde
31960 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  r=%c",.         
31970 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
31980 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
31990 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
319a0 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ost,.           
319b0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
319c0 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72  Valid ? (isOrder
319d0 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20  ed ? 'Y' : 'N') 
319e0 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
319f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
31a00 75 67 50 72 69 6e 74 66 28 22 20 20 20 76 73 20  ugPrintf("   vs 
31a10 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64  %s cost=%-3d ord
31a20 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
31a30 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
31a40 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
31a50 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
31a60 3e 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20  >rCost,.        
31a70 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
31a80 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20  sOrderedValid ? 
31a90 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20  (pTo->isOrdered 
31aa0 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27  ? 'Y' : 'N') : '
31ab0 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
31ac0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
31ad0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
31ae0 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73  pTo->rCost==rCos
31af0 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t );.           
31b00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
31b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31b20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e   testcase( pTo->
31b30 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29  rCost==rCost+1 )
31b40 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;.          /* A
31b50 20 6e 65 77 20 61 6e 64 20 62 65 74 74 65 72 20   new and better 
31b60 73 63 6f 72 65 20 66 6f 72 20 61 20 70 72 65 76  score for a prev
31b70 69 6f 75 73 6c 79 20 63 72 65 61 74 65 64 20 65  iously created e
31b80 71 75 69 76 61 6c 65 6e 74 20 70 61 74 68 20 2a  quivalent path *
31b90 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  /.#ifdef WHERETR
31ba0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
31bb0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
31bc0 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
31bd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
31be0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
31bf0 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
31c00 20 20 20 22 55 70 64 61 74 65 20 25 73 20 63 6f     "Update %s co
31c10 73 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63  st=%-3d order=%c
31c20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
31c30 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
31c40 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
31c50 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20  WLoop), rCost,. 
31c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
31c70 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20  sOrderedValid ? 
31c80 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27  (isOrdered ? 'Y'
31c90 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a   : 'N') : '?');.
31ca0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
31cb0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
31cc0 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d 25 2d    was %s cost=%-
31cd0 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
31ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cf0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54  wherePathName(pT
31d00 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20  o, iLoop+1, 0), 
31d10 70 54 6f 2d 3e 72 43 6f 73 74 2c 0a 20 20 20 20  pTo->rCost,.    
31d20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d              pTo-
31d30 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20  >isOrderedValid 
31d40 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  ? (pTo->isOrdere
31d50 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a  d ? 'Y' : 'N') :
31d60 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
31d70 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
31d80 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70    }.        /* p
31d90 57 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65  WLoop is a winne
31da0 72 2e 20 20 41 64 64 20 69 74 20 74 6f 20 74 68  r.  Add it to th
31db0 65 20 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f  e set of best so
31dc0 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   far */.        
31dd0 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20  pTo->maskLoop = 
31de0 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20  pFrom->maskLoop 
31df0 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  | pWLoop->maskSe
31e00 6c 66 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  lf;.        pTo-
31e10 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61  >revLoop = revMa
31e20 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  sk;.        pTo-
31e30 3e 6e 52 6f 77 20 3d 20 70 46 72 6f 6d 2d 3e 6e  >nRow = pFrom->n
31e40 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f  Row + pWLoop->nO
31e50 75 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  ut;.        pTo-
31e60 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a  >rCost = rCost;.
31e70 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
31e80 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 69 73  rderedValid = is
31e90 4f 72 64 65 72 65 64 56 61 6c 69 64 3b 0a 20 20  OrderedValid;.  
31ea0 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
31eb0 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72 65 64  ered = isOrdered
31ec0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
31ed0 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72  (pTo->aLoop, pFr
31ee0 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f  om->aLoop, sizeo
31ef0 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c  f(WhereLoop*)*iL
31f00 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 70 54  oop);.        pT
31f10 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20  o->aLoop[iLoop] 
31f20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  = pWLoop;.      
31f30 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f    if( nTo>=mxCho
31f40 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ice ){.         
31f50 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d   mxCost = aTo[0]
31f60 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  .rCost;.        
31f70 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d    for(jj=1, pTo=
31f80 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68  &aTo[1]; jj<mxCh
31f90 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b  oice; jj++, pTo+
31fa0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
31fb0 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d  if( pTo->rCost>m
31fc0 78 43 6f 73 74 20 29 20 6d 78 43 6f 73 74 20 3d  xCost ) mxCost =
31fd0 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20   pTo->rCost;.   
31fe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31ff0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
32000 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
32010 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
32020 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
32030 54 72 61 63 65 3e 3d 32 20 29 7b 0a 20 20 20 20  Trace>=2 ){.    
32040 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
32050 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72  intf("---- after
32060 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e   round %d ----\n
32070 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  ", iLoop);.     
32080 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61   for(ii=0, pTo=a
32090 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b  To; ii<nTo; ii++
320a0 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20  , pTo++){.      
320b0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
320c0 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25  intf(" %s cost=%
320d0 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72  -3d nrow=%-3d or
320e0 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
320f0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
32100 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
32110 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
32120 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
32130 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
32140 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f  eredValid ? (pTo
32150 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59  ->isOrdered ? 'Y
32160 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b  ' : 'N') : '?');
32170 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f  .        if( pTo
32180 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
32190 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72   && pTo->isOrder
321a0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
321b0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
321c0 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c  tf(" rev=0x%llx\
321d0 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70  n", pTo->revLoop
321e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
321f0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
32200 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
32210 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  \n");.        }.
32220 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
32230 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61  ndif..    /* Swa
32240 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61  p the roles of a
32250 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72  From and aTo for
32260 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61   the next genera
32270 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f  tion */.    pFro
32280 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f  m = aTo;.    aTo
32290 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46   = aFrom;.    aF
322a0 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20  rom = pFrom;.   
322b0 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20   nFrom = nTo;.  
322c0 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d  }..  if( nFrom==
322d0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
322e0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
322f0 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74   "no query solut
32300 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ion");.    sqlit
32310 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 70  e3DbFree(db, pSp
32320 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ace);.    return
32330 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
32340 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20   }.  .  /* Find 
32350 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
32360 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c  path.  pFrom wil
32370 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69  l be left pointi
32380 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74 68 20  ng to that path 
32390 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72  */.  pFrom = aFr
323a0 6f 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46  om;.  assert( nF
323b0 72 6f 6d 3d 3d 31 20 29 3b 0a 23 69 66 20 30 20  rom==1 );.#if 0 
323c0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
323d0 20 69 73 20 6e 65 65 64 65 64 20 69 66 20 6e 46   is needed if nF
323e0 72 6f 6d 20 69 73 20 65 76 65 72 20 6d 6f 72 65  rom is ever more
323f0 20 74 68 61 6e 20 31 20 2a 2f 0a 20 20 66 6f 72   than 1 */.  for
32400 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b  (ii=1; ii<nFrom;
32410 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
32420 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72  pFrom->rCost>aFr
32430 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20 70  om[ii].rCost ) p
32440 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69  From = &aFrom[ii
32450 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  ];.  }.#endif.  
32460 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
32470 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b  nLevel==nLoop );
32480 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c  .  /* Load the l
32490 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20  owest cost path 
324a0 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20  into pWInfo */. 
324b0 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c   for(iLoop=0; iL
324c0 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70  oop<nLoop; iLoop
324d0 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65  ++){.    WhereLe
324e0 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57  vel *pLevel = pW
324f0 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b  Info->a + iLoop;
32500 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  .    pLevel->pWL
32510 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70  oop = pWLoop = p
32520 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f  From->aLoop[iLoo
32530 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  p];.    pLevel->
32540 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e  iFrom = pWLoop->
32550 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iTab;.    pLevel
32560 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57 49 6e  ->iTabCur = pWIn
32570 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
32580 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69  pLevel->iFrom].i
32590 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  Cursor;.  }.  if
325a0 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
325b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
325c0 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 0a  NT_DISTINCT)!=0.
325d0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
325e0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
325f0 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d 3d 30  E_DISTINCTBY)==0
32600 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65  .   && pWInfo->e
32610 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f  Distinct==WHERE_
32620 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20  DISTINCT_NOOP.  
32630 20 26 26 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b   && nRowEst.  ){
32640 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  .    Bitmask not
32650 55 73 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63  Used;.    int rc
32660 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
32670 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
32680 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65  nfo, pWInfo->pRe
32690 73 75 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a  sultSet, pFrom,.
326a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
326b0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
326c0 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f  Y, nLoop-1, pFro
326d0 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31  m->aLoop[nLoop-1
326e0 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  ], &notUsed);.  
326f0 20 20 69 66 28 20 72 63 3d 3d 31 20 29 20 70 57    if( rc==1 ) pW
32700 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
32710 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
32720 5f 4f 52 44 45 52 45 44 3b 0a 20 20 7d 0a 20 20  _ORDERED;.  }.  
32730 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64  if( pFrom->isOrd
32740 65 72 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20  ered ){.    if( 
32750 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
32760 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
32770 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20 70  NCTBY ){.      p
32780 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
32790 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
327a0 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 7d  T_ORDERED;.    }
327b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49 6e  else{.      pWIn
327c0 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 31 3b 0a  fo->bOBSat = 1;.
327d0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65        pWInfo->re
327e0 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72  vMask = pFrom->r
327f0 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20 20  evLoop;.    }.  
32800 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  }.  pWInfo->nRow
32810 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Out = pFrom->nRo
32820 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65  w;..  /* Free te
32830 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61  mporary memory a
32840 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  nd return succes
32850 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62  s */.  sqlite3Db
32860 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29  Free(db, pSpace)
32870 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
32880 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
32890 6f 73 74 20 71 75 65 72 69 65 73 20 75 73 65 20  ost queries use 
328a0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
328b0 62 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f  ble (they are no
328c0 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76  t joins) and hav
328d0 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63  e.** simple == c
328e0 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e  onstraints again
328f0 73 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64  st indexed field
32900 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
32910 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20   attempts.** to 
32920 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c  plan those simpl
32930 65 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75  e cases using mu
32940 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79  ch less ceremony
32950 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e   than the.** gen
32960 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65  eral-purpose que
32970 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20  ry planner, and 
32980 74 68 65 72 65 62 79 20 79 69 65 6c 64 20 66 61  thereby yield fa
32990 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65  ster sqlite3_pre
329a0 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20  pare().** times 
329b0 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
329c0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ase..**.** Retur
329d0 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75  n non-zero on su
329e0 63 63 65 73 73 2c 20 69 66 20 74 68 69 73 20 71  ccess, if this q
329f0 75 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64  uery can be hand
32a00 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e  led by this.** n
32a10 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70  o-frills query p
32a20 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20  lanner.  Return 
32a30 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71 75 65  zero if this que
32a40 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a  ry needs the .**
32a50 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   general-purpose
32a60 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a   query planner..
32a70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
32a80 65 72 65 53 68 6f 72 74 43 75 74 28 57 68 65 72  ereShortCut(Wher
32a90 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
32aa0 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65  uilder){.  Where
32ab0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20  Info *pWInfo;.  
32ac0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
32ad0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68  tem *pItem;.  Wh
32ae0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a  ereClause *pWC;.
32af0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
32b00 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  rm;.  WhereLoop 
32b10 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43  *pLoop;.  int iC
32b20 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54  ur;.  int j;.  T
32b30 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
32b40 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20 20  dex *pIdx;.  .  
32b50 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
32b60 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28  r->pWInfo;.  if(
32b70 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
32b80 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43  ags & WHERE_FORC
32b90 45 5f 54 41 42 4c 45 20 29 20 72 65 74 75 72 6e  E_TABLE ) return
32ba0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   0;.  assert( pW
32bb0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
32bc0 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74  nSrc>=1 );.  pIt
32bd0 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  em = pWInfo->pTa
32be0 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62  bList->a;.  pTab
32bf0 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
32c00 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
32c10 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
32c20 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  ;.  if( pItem->z
32c30 49 6e 64 65 78 20 29 20 72 65 74 75 72 6e 20 30  Index ) return 0
32c40 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d  ;.  iCur = pItem
32c50 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43  ->iCursor;.  pWC
32c60 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b   = &pWInfo->sWC;
32c70 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c  .  pLoop = pBuil
32c80 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f  der->pNew;.  pLo
32c90 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b  op->wsFlags = 0;
32ca0 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54  .  pTerm = findT
32cb0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
32cc0 31 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 30 29 3b  1, 0, WO_EQ, 0);
32cd0 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a  .  if( pTerm ){.
32ce0 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
32cf0 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs = WHERE_COLUM
32d00 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57  N_EQ|WHERE_IPK|W
32d10 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20  HERE_ONEROW;.   
32d20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30   pLoop->aLTerm[0
32d30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70  ] = pTerm;.    p
32d40 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  Loop->nLTerm = 1
32d50 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62  ;.    pLoop->u.b
32d60 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20  tree.nEq = 1;.  
32d70 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
32d80 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f  t of a rowid loo
32d90 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20  kup is 10 */.   
32da0 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33   pLoop->rRun = 3
32db0 33 3b 20 20 2f 2a 20 33 33 3d 3d 77 68 65 72 65  3;  /* 33==where
32dc0 43 6f 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65  Cost(10) */.  }e
32dd0 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64  lse{.    for(pId
32de0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
32df0 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
32e00 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
32e10 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
32e20 3d 3d 4f 45 5f 4e 6f 6e 65 20 7c 7c 20 70 49 64  ==OE_None || pId
32e30 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
32e40 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
32e50 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
32e60 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
32e70 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54  j++){.        pT
32e80 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
32e90 57 43 2c 20 69 43 75 72 2c 20 70 49 64 78 2d 3e  WC, iCur, pIdx->
32ea0 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c 20  aiColumn[j], 0, 
32eb0 57 4f 5f 45 51 2c 20 70 49 64 78 29 3b 0a 20 20  WO_EQ, pIdx);.  
32ec0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
32ed0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
32ee0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 52 65 73      whereLoopRes
32ef0 69 7a 65 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  ize(pWInfo->pPar
32f00 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6a  se->db, pLoop, j
32f10 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  );.        pLoop
32f20 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54  ->aLTerm[j] = pT
32f30 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  erm;.      }.   
32f40 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e     if( j!=pIdx->
32f50 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e  nColumn ) contin
32f60 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ue;.      pLoop-
32f70 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
32f80 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
32f90 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e  _ONEROW|WHERE_IN
32fa0 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69 66 28  DEXED;.      if(
32fb0 20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64   (pItem->colUsed
32fc0 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64   & ~columnsInInd
32fd0 65 78 28 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a  ex(pIdx))==0 ){.
32fe0 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77          pLoop->w
32ff0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
33000 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  IDX_ONLY;.      
33010 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e  }.      pLoop->n
33020 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20  LTerm = j;.     
33030 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
33040 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70  nEq = j;.      p
33050 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
33060 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 20  ndex = pIdx;.   
33070 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
33080 73 74 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69  st of a unique i
33090 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31  ndex lookup is 1
330a0 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70  5 */.      pLoop
330b0 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a  ->rRun = 39;  /*
330c0 20 33 39 3d 3d 77 68 65 72 65 43 6f 73 74 28 31   39==whereCost(1
330d0 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  5) */.      brea
330e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
330f0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
33100 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  s ){.    pLoop->
33110 6e 4f 75 74 20 3d 20 28 57 68 65 72 65 43 6f 73  nOut = (WhereCos
33120 74 29 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  t)1;.    pWInfo-
33130 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70  >a[0].pWLoop = p
33140 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  Loop;.    pLoop-
33150 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d  >maskSelf = getM
33160 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
33170 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20  skSet, iCur);.  
33180 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69    pWInfo->a[0].i
33190 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20  TabCur = iCur;. 
331a0 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f     pWInfo->nRowO
331b0 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ut = 1;.    if( 
331c0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
331d0 20 29 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61   ) pWInfo->bOBSa
331e0 74 20 3d 20 20 31 3b 0a 20 20 20 20 69 66 28 20  t =  1;.    if( 
331f0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
33200 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
33210 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
33220 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
33230 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
33240 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20  INCT_UNIQUE;.   
33250 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
33260 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70  _DEBUG.    pLoop
33270 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e  ->cId = '0';.#en
33280 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31  dif.    return 1
33290 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
332a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
332b0 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ate the beginnin
332c0 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73  g of the loop us
332d0 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  ed for WHERE cla
332e0 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
332f0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
33300 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  lue is a pointer
33310 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74   to an opaque st
33320 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e  ructure that con
33330 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61  tains.** informa
33340 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74  tion needed to t
33350 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
33360 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63  p.  Later, the c
33370 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a  alling routine.*
33380 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  * should invoke 
33390 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
333a0 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72  ) with the retur
333b0 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
333c0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f  function.** in o
333d0 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
333e0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
333f0 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
33400 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
33410 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75  occurs, this rou
33420 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
33430 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73  L..**.** The bas
33440 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f  ic idea is to do
33450 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20   a nested loop, 
33460 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63  one loop for eac
33470 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68  h table in.** th
33480 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
33490 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53   a select.  (INS
334a0 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73  ERT and UPDATE s
334b0 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68  tatements are th
334c0 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53  e.** same as a S
334d0 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20  ELECT with only 
334e0 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
334f0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
33500 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  e.)  For.** exam
33510 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20  ple, if the SQL 
33520 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  is this:.**.**  
33530 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
33540 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
33550 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54  ERE ...;.**.** T
33560 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hen the code gen
33570 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70  erated is concep
33580 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20  tually like the 
33590 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
335a0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
335b0 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20  w1 in t1 do     
335c0 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
335d0 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
335e0 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
335f0 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62  t2 do      |-- b
33600 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
33610 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20  gin().**        
33620 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69    foreach row3 i
33630 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20  n t3 do   /.**  
33640 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
33650 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20            end   
33660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33670 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
33680 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
33690 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
336a0 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62             |-- b
336b0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  y sqlite3WhereEn
336c0 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20  d().**      end 
336d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
336e0 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20          /.**.** 
336f0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f  Note that the lo
33700 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ops might not be
33710 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f   nested in the o
33720 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  rder in which th
33730 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20  ey.** appear in 
33740 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
33750 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  if a different o
33760 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61  rder is better a
33770 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75  ble to make.** u
33780 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20  se of indices.  
33790 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77  Note also that w
337a0 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61  hen the IN opera
337b0 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a  tor appears in.*
337c0 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
337d0 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73  se, it might res
337e0 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61  ult in additiona
337f0 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66  l nested loops f
33800 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74  or.** scanning t
33810 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65  hrough all value
33820 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  s on the right-h
33830 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
33840 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  IN..**.** There 
33850 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72  are Btree cursor
33860 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
33870 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74  h each table.  t
33880 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a  1 uses cursor.**
33890 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74   number pTabList
338a0 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20  ->a[0].iCursor. 
338b0 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72   t2 uses the cur
338c0 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  sor pTabList->a[
338d0 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41  1].iCursor..** A
338e0 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68  nd so forth.  Th
338f0 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
33900 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65  ates code to ope
33910 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72  n those VDBE cur
33920 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  sors.** and sqli
33930 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65  te3WhereEnd() ge
33940 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
33950 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a   to close them..
33960 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74  **.** The code t
33970 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  hat sqlite3Where
33980 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65  Begin() generate
33990 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  s leaves the cur
339a0 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e  sors named.** in
339b0 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69   pTabList pointi
339c0 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72  ng at their appr
339d0 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e  opriate entries.
339e0 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65    The [...] code
339f0 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43  .** can use OP_C
33a00 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77  olumn and OP_Row
33a10 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68  id opcodes on th
33a20 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65  ese cursors to e
33a30 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66  xtract.** data f
33a40 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20  rom the various 
33a50 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f  tables of the lo
33a60 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
33a70 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
33a80 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65   empty, the fore
33a90 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65  ach loops must e
33aa0 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a  ach scan their.*
33ab0 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e  * entire tables.
33ac0 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77    Thus a three-w
33ad0 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28  ay join is an O(
33ae0 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20  N^3) operation. 
33af0 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74   But if.** the t
33b00 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63  ables have indic
33b10 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  es and there are
33b20 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
33b30 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a  ERE clause that.
33b40 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73  ** refer to thos
33b50 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d  e indices, a com
33b60 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e  plete table scan
33b70 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20   can be avoided 
33b80 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  and the.** code 
33b90 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61  will run much fa
33ba0 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74  ster.  Most of t
33bb0 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20  he work of this 
33bc0 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b  routine is check
33bd0 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ing.** to see if
33be0 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63   there are indic
33bf0 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  es that can be u
33c00 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20  sed to speed up 
33c10 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
33c20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  Terms of the WHE
33c30 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c  RE clause are al
33c40 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74  so used to limit
33c50 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75   which rows actu
33c60 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20  ally.** make it 
33c70 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20  to the "..." in 
33c80 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
33c90 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65  e loop.  After e
33ca0 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a  ach "foreach",.*
33cb0 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * terms of the W
33cc0 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
33cd0 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20   use only terms 
33ce0 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64  in that loop and
33cf0 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20   outer.** loops 
33d00 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e  are evaluated an
33d10 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d  d if false a jum
33d20 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64  p is made around
33d30 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
33d40 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28  ** inner loops (
33d50 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e  or around the ".
33d60 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20  .." if the test 
33d70 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
33d80 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74  e inner-.** most
33d90 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54   loop).**.** OUT
33da0 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41  ER JOINS.**.** A
33db0 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20  n outer join of 
33dc0 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32  tables t1 and t2
33dd0 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20   is conceptally 
33de0 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  coded as follows
33df0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61  :.**.**    forea
33e00 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
33e10 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20  .**      flag = 
33e20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  0.**      foreac
33e30 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a  h row2 in t2 do.
33e40 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a  **        start:
33e50 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  .**          ...
33e60 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61  .**          fla
33e70 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e  g = 1.**      en
33e80 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61  d.**      if fla
33e90 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20  g==0 then.**    
33ea0 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77      move the row
33eb0 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75  2 cursor to a nu
33ec0 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ll row.**       
33ed0 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20   goto start.**  
33ee0 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64      fi.**    end
33ef0 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  .**.** ORDER BY 
33f00 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e  CLAUSE PROCESSIN
33f10 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79  G.**.** pOrderBy
33f20 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
33f30 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
33f40 61 75 73 65 20 28 6f 72 20 74 68 65 20 47 52 4f  ause (or the GRO
33f50 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20  UP BY clause.** 
33f60 69 66 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f  if the WHERE_GRO
33f70 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65 74  UPBY flag is set
33f80 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29 20   in wctrlFlags) 
33f90 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
33fa0 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72  ement.** if ther
33fb0 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68  e is one.  If th
33fc0 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
33fd0 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20  BY clause or if 
33fe0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
33ff0 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61  is called from a
34000 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
34010 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  TE statement, th
34020 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e  en pOrderBy is N
34030 55 4c 4c 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66  ULL..*/.WhereInf
34040 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42  o *sqlite3WhereB
34050 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  egin(.  Parse *p
34060 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
34070 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
34080 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
34090 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f   *pTabList,    /
340a0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41  * FROM clause: A
340b0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62   list of all tab
340c0 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65  les to be scanne
340d0 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  d */.  Expr *pWh
340e0 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ere,         /* 
340f0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
34100 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
34110 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41  pOrderBy,   /* A
34120 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
34130 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  e, or NULL */.  
34140 45 78 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c  ExprList *pResul
34150 74 53 65 74 2c 20 2f 2a 20 52 65 73 75 6c 74 20  tSet, /* Result 
34160 73 65 74 20 6f 66 20 74 68 65 20 71 75 65 72 79  set of the query
34170 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
34180 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4f  lags,       /* O
34190 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f  ne of the WHERE_
341a0 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20  * flags defined 
341b0 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a  in sqliteInt.h *
341c0 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 20  /.  int iIdxCur 
341d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
341e0 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
341f0 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 6e 64 65  NLY is set, inde
34200 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  x cursor number 
34210 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  */.){.  int nByt
34220 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eWInfo;         
34230 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73     /* Num. bytes
34240 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57   allocated for W
34250 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20  hereInfo struct 
34260 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73  */.  int nTabLis
34270 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
34280 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
34290 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73  ments in pTabLis
342a0 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  t */.  WhereInfo
342b0 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
342c0 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65    /* Will become
342d0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
342e0 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
342f0 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  on */.  Vdbe *v 
34300 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
34310 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
34320 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e  l database engin
34330 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  e */.  Bitmask n
34340 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20  otReady;        
34350 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61    /* Cursors tha
34360 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f  t are not yet po
34370 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68  sitioned */.  Wh
34380 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73  ereLoopBuilder s
34390 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  WLB;     /* The 
343a0 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65  WhereLoop builde
343b0 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  r */.  WhereMask
343c0 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20  Set *pMaskSet;  
343d0 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
343e0 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a  ion mask set */.
343f0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
34400 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20  evel;        /* 
34410 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69  A single level i
34420 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f  n pWInfo->a[] */
34430 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
34440 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  oop;          /*
34450 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69   Pointer to a si
34460 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f  ngle WhereLoop o
34470 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
34480 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
34490 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
344a0 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  unter */.  sqlit
344b0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
344c0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
344d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
344e0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
344f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34500 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
34510 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69  .  /* Variable i
34520 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f  nitialization */
34530 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
34540 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57  db;.  memset(&sW
34550 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57  LB, 0, sizeof(sW
34560 4c 42 29 29 3b 0a 20 20 73 57 4c 42 2e 70 4f 72  LB));.  sWLB.pOr
34570 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
34580 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20  ;..  /* Disable 
34590 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74  the DISTINCT opt
345a0 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c  imization if SQL
345b0 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20  ITE_DistinctOpt 
345c0 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20  is set via.  ** 
345d0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72  sqlite3_test_ctr
345e0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
345f0 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c  L_OPTIMIZATIONS,
34600 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70  ...) */.  if( Op
34610 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
34620 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 69  ed(db, SQLITE_Di
34630 73 74 69 6e 63 74 4f 70 74 29 20 29 7b 0a 20 20  stinctOpt) ){.  
34640 20 20 77 63 74 72 6c 46 6c 61 67 73 20 26 3d 20    wctrlFlags &= 
34650 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54  ~WHERE_WANT_DIST
34660 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  INCT;.  }..  /* 
34670 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61  The number of ta
34680 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
34690 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74   clause is limit
346a0 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
346b0 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e   of.  ** bits in
346c0 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f   a Bitmask .  */
346d0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
346e0 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53  bList->nSrc==BMS
346f0 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69   );.  if( pTabLi
34700 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a  st->nSrc>BMS ){.
34710 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
34720 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 74 20  Msg(pParse, "at 
34730 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20 69  most %d tables i
34740 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b  n a join", BMS);
34750 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
34760 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75   }..  /* This fu
34770 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20  nction normally 
34780 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74  generates a nest
34790 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20  ed loop for all 
347a0 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20  tables in .  ** 
347b0 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69  pTabList.  But i
347c0 66 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 54  f the WHERE_ONET
347d0 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69  ABLE_ONLY flag i
347e0 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73  s set, then we s
347f0 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20  hould.  ** only 
34800 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  generate code fo
34810 72 20 74 68 65 20 66 69 72 73 74 20 74 61 62 6c  r the first tabl
34820 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e  e in pTabList an
34830 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20  d assume that.  
34840 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61  ** any cursors a
34850 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73  ssociated with s
34860 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73  ubsequent tables
34870 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a   are uninitializ
34880 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c  ed..  */.  nTabL
34890 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67  ist = (wctrlFlag
348a0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  s & WHERE_ONETAB
348b0 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20 70  LE_ONLY) ? 1 : p
348c0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a  TabList->nSrc;..
348d0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
348e0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  d initialize the
348f0 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
34900 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
34910 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72  ecome the.  ** r
34920 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73  eturn value. A s
34930 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  ingle allocation
34940 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
34950 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a  e the WhereInfo.
34960 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65    ** struct, the
34970 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65   contents of Whe
34980 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20  reInfo.a[], the 
34990 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
349a0 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74  cture.  ** and t
349b0 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  he WhereMaskSet 
349c0 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65  structure. Since
349d0 20 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e   WhereClause con
349e0 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a  tains an 8-byte.
349f0 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65    ** field (type
34a00 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73   Bitmask) it mus
34a10 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20  t be aligned on 
34a20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61  an 8-byte bounda
34a30 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20  ry on.  ** some 
34a40 61 72 63 68 69 74 65 63 74 75 72 65 73 2e 20 48  architectures. H
34a50 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28  ence the ROUND8(
34a60 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20  ) below..  */.  
34a70 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55  nByteWInfo = ROU
34a80 4e 44 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65  ND8(sizeof(Where
34a90 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d  Info)+(nTabList-
34aa0 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  1)*sizeof(WhereL
34ab0 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f  evel));.  pWInfo
34ac0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
34ad0 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
34ae0 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28 57  WInfo + sizeof(W
34af0 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69 66  hereLoop));.  if
34b00 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
34b10 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
34b20 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e  3DbFree(db, pWIn
34b30 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20  fo);.    pWInfo 
34b40 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68  = 0;.    goto wh
34b50 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
34b60 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   }.  pWInfo->nLe
34b70 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a  vel = nTabList;.
34b80 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65    pWInfo->pParse
34b90 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49   = pParse;.  pWI
34ba0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20  nfo->pTabList = 
34bb0 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  pTabList;.  pWIn
34bc0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  fo->pOrderBy = p
34bd0 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49 6e 66  OrderBy;.  pWInf
34be0 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  o->pResultSet = 
34bf0 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 70 57  pResultSet;.  pW
34c00 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73  Info->iBreak = s
34c10 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
34c20 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f  bel(v);.  pWInfo
34c30 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77  ->wctrlFlags = w
34c40 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49  ctrlFlags;.  pWI
34c50 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79  nfo->savedNQuery
34c60 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Loop = pParse->n
34c70 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61  QueryLoop;.  pMa
34c80 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d  skSet = &pWInfo-
34c90 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c  >sMaskSet;.  sWL
34ca0 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66  B.pWInfo = pWInf
34cb0 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d 20  o;.  sWLB.pWC = 
34cc0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20  &pWInfo->sWC;.  
34cd0 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68 65  sWLB.pNew = (Whe
34ce0 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a  reLoop*)(((char*
34cf0 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49  )pWInfo)+nByteWI
34d00 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
34d10 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
34d20 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77 29 20  MENT(sWLB.pNew) 
34d30 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e  );.  whereLoopIn
34d40 69 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23  it(sWLB.pNew);.#
34d50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
34d60 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e  UG.  sWLB.pNew->
34d70 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69  cId = '*';.#endi
34d80 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68  f..  /* Split th
34d90 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
34da0 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62  nto separate sub
34db0 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72  expressions wher
34dc0 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65  e each.  ** sube
34dd0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
34de0 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44  arated by an AND
34df0 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a   operator..  */.
34e00 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d    initMaskSet(pM
34e10 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65  askSet);.  where
34e20 43 6c 61 75 73 65 49 6e 69 74 28 26 70 57 49 6e  ClauseInit(&pWIn
34e30 66 6f 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29  fo->sWC, pWInfo)
34e40 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
34e50 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 70 50 61  odeConstants(pPa
34e60 72 73 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20  rse, pWhere);.  
34e70 77 68 65 72 65 53 70 6c 69 74 28 26 70 57 49 6e  whereSplit(&pWIn
34e80 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72 65 2c  fo->sWC, pWhere,
34e90 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 73 71 6c 69   TK_AND);.  sqli
34ea0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
34eb0 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b  ema(pParse, -1);
34ec0 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63   /* Insert the c
34ed0 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20 47  ookie verifier G
34ee0 6f 74 6f 20 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a  oto */.    .  /*
34ef0 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61   Special case: a
34f00 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
34f10 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20  at is constant. 
34f20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20   Evaluate the.  
34f30 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ** expression an
34f40 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76  d either jump ov
34f50 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f  er all of the co
34f60 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e  de or fall thru.
34f70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65  .  */.  if( pWhe
34f80 72 65 20 26 26 20 28 6e 54 61 62 4c 69 73 74 3d  re && (nTabList=
34f90 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70  =0 || sqlite3Exp
34fa0 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
34fb0 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20  in(pWhere)) ){. 
34fc0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
34fd0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57  False(pParse, pW
34fe0 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  here, pWInfo->iB
34ff0 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  reak, SQLITE_JUM
35000 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57  PIFNULL);.    pW
35010 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  here = 0;.  }.. 
35020 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
35030 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65  : No FROM clause
35040 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62  .  */.  if( nTab
35050 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  List==0 ){.    i
35060 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 57  f( pOrderBy ) pW
35070 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 31  Info->bOBSat = 1
35080 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c 46  ;.    if( wctrlF
35090 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
350a0 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
350b0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
350c0 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
350d0 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
350e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
350f0 73 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d  ssign a bit from
35100 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20   the bitmask to 
35110 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
35120 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20  e FROM clause.. 
35130 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73   **.  ** When as
35140 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20  signing bitmask 
35150 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20 63  values to FROM c
35160 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c 20 69  lause cursors, i
35170 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 74  t must be.  ** t
35180 68 65 20 63 61 73 65 20 74 68 61 74 20 69 66 20  he case that if 
35190 58 20 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b  X is the bitmask
351a0 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 46 52   for the N-th FR
351b0 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
351c0 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69 74  hen.  ** the bit
351d0 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f  mask for all FRO
351e0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  M clause terms t
351f0 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68  o the left of th
35200 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a  e N-th term.  **
35210 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41 6e 20   is (X-1).   An 
35220 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
35230 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  the ON clause of
35240 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e   a LEFT JOIN can
35250 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20 45 78   use.  ** its Ex
35260 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
35270 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69 6e 64  le value to find
35280 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f 66 20   the bitmask of 
35290 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a  the right table.
352a0 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e    ** of the join
352b0 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67 20 6f  .  Subtracting o
352c0 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69 67 68  ne from the righ
352d0 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73 6b 20  t table bitmask 
352e0 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62 69 74  gives a.  ** bit
352f0 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62  mask for all tab
35300 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
35310 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e  of the join.  Kn
35320 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73  owing the bitmas
35330 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74  k.  ** for all t
35340 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
35350 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e  t of a left join
35360 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20   is important.  
35370 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20  Ticket #3015..  
35380 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
35390 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63  t bitmasks are c
353a0 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70  reated for all p
353b0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61  TabList->nSrc ta
353c0 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61  bles in.  ** pTa
353d0 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20  bList, not just 
353e0 74 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69  the first nTabLi
353f0 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62  st tables.  nTab
35400 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  List is normally
35410 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70  .  ** equal to p
35420 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75  TabList->nSrc bu
35430 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  t might be short
35440 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74 68 65  ened to 1 if the
35450 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54  .  ** WHERE_ONET
35460 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69  ABLE_ONLY flag i
35470 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f  s set..  */.  fo
35480 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c  r(ii=0; ii<pTabL
35490 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29  ist->nSrc; ii++)
354a0 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b  {.    createMask
354b0 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c  (pMaskSet, pTabL
354c0 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73  ist->a[ii].iCurs
354d0 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  or);.  }.#ifndef
354e0 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20   NDEBUG.  {.    
354f0 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66  Bitmask toTheLef
35500 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  t = 0;.    for(i
35510 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74  i=0; ii<pTabList
35520 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20  ->nSrc; ii++){. 
35530 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
35540 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
35550 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
35560 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
35570 20 20 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29     assert( (m-1)
35580 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20  ==toTheLeft );. 
35590 20 20 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c       toTheLeft |
355a0 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = m;.    }.  }.#
355b0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c  endif..  /* Anal
355c0 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  yze all of the s
355d0 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  ubexpressions.  
355e0 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72 41 6e  Note that exprAn
355f0 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20  alyze() might.  
35600 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74 75  ** add new virtu
35610 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68  al terms onto th
35620 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
35630 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64  RE clause.  We d
35640 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20  o not.  ** want 
35650 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65  to analyze these
35660 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20   virtual terms, 
35670 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69  so start analyzi
35680 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20  ng at the end.  
35690 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77  ** and work forw
356a0 61 72 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  ard so that the 
356b0 61 64 64 65 64 20 76 69 72 74 75 61 6c 20 74 65  added virtual te
356c0 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70 72  rms are never pr
356d0 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  ocessed..  */.  
356e0 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
356f0 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f  TabList, &pWInfo
35700 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28 20 64 62  ->sWC);.  if( db
35710 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
35720 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  {.    goto where
35730 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
35740 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44  .  /* If the ORD
35750 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20  ER BY (or GROUP 
35760 42 59 29 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  BY) clause conta
35770 69 6e 73 20 72 65 66 65 72 65 6e 63 65 73 20 74  ins references t
35780 6f 20 67 65 6e 65 72 61 6c 0a 20 20 2a 2a 20 65  o general.  ** e
35790 78 70 72 65 73 73 69 6f 6e 73 2c 20 74 68 65 6e  xpressions, then
357a0 20 77 65 20 77 6f 6e 27 74 20 62 65 20 61 62 6c   we won't be abl
357b0 65 20 74 6f 20 73 61 74 69 73 66 79 20 69 74 20  e to satisfy it 
357c0 75 73 69 6e 67 20 69 6e 64 69 63 65 73 2c 20 73  using indices, s
357d0 6f 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61 64 20  o.  ** go ahead 
357e0 61 6e 64 20 64 69 73 61 62 6c 65 20 69 74 20 6e  and disable it n
357f0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ow..  */.  if( p
35800 4f 72 64 65 72 42 79 20 26 26 20 28 77 63 74 72  OrderBy && (wctr
35810 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
35820 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d 30  ANT_DISTINCT)!=0
35830 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   ){.    for(ii=0
35840 3b 20 69 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  ; ii<pOrderBy->n
35850 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
35860 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
35870 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
35880 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79  Collate(pOrderBy
35890 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a  ->a[ii].pExpr);.
358a0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
358b0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
358c0 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  {.        pWInfo
358d0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
358e0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
358f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
35900 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d  }else if( pExpr-
35910 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
35920 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
35930 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
35940 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
35950 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
35960 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 69 66  STINCT ){.    if
35970 28 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75  ( isDistinctRedu
35980 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54  ndant(pParse, pT
35990 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d  abList, &pWInfo-
359a0 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53 65 74  >sWC, pResultSet
359b0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
359c0 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69  e DISTINCT marki
359d0 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e  ng is pointless.
359e0 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a    Ignore it. */.
359f0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
35a00 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
35a10 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b  DISTINCT_UNIQUE;
35a20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
35a30 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
35a40 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52      /* Try to OR
35a50 44 45 52 20 42 59 20 74 68 65 20 72 65 73 75 6c  DER BY the resul
35a60 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69  t set to make di
35a70 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e  stinct processin
35a80 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20  g easier */.    
35a90 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46    pWInfo->wctrlF
35aa0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49  lags |= WHERE_DI
35ab0 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20  STINCTBY;.      
35ac0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
35ad0 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20   = pResultSet;. 
35ae0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
35af0 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57 68 65  onstruct the Whe
35b00 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a  reLoop objects *
35b10 2f 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  /.  WHERETRACE(0
35b20 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69  xffff,("*** Opti
35b30 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c  mizer Start ***\
35b40 6e 22 29 29 3b 0a 20 20 69 66 28 20 6e 54 61 62  n"));.  if( nTab
35b50 4c 69 73 74 21 3d 31 20 7c 7c 20 77 68 65 72 65  List!=1 || where
35b60 53 68 6f 72 74 43 75 74 28 26 73 57 4c 42 29 3d  ShortCut(&sWLB)=
35b70 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  =0 ){.    rc = w
35b80 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 26  hereLoopAddAll(&
35b90 73 57 4c 42 29 3b 0a 20 20 20 20 69 66 28 20 72  sWLB);.    if( r
35ba0 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  c ) goto whereBe
35bb0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 0a 20 20 20  ginError;.  .   
35bc0 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20   /* Display all 
35bd0 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
35be0 20 6f 62 6a 65 63 74 73 20 69 66 20 77 68 65 72   objects if wher
35bf0 65 74 72 61 63 65 20 69 73 20 65 6e 61 62 6c 65  etrace is enable
35c00 64 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52  d */.#ifdef WHER
35c10 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
35c20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
35c30 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ereTrace ){.    
35c40 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a    WhereLoop *p;.
35c50 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
35c60 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a     static char z
35c70 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33 34  Label[] = "01234
35c80 35 36 37 38 39 61 62 63 64 65 66 67 68 69 6a 6b  56789abcdefghijk
35c90 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a 22  lmnopqrstuvwyxz"
35ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35cc0 20 20 20 20 20 20 20 20 22 41 42 43 44 45 46 47          "ABCDEFG
35cd0 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
35ce0 59 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72 28  YXZ";.      for(
35cf0 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  p=pWInfo->pLoops
35d00 2c 20 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70  , i=0; p; p=p->p
35d10 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a  NextLoop, i++){.
35d20 20 20 20 20 20 20 20 20 70 2d 3e 63 49 64 20 3d          p->cId =
35d30 20 7a 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66   zLabel[i%sizeof
35d40 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20  (zLabel)];.     
35d50 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
35d60 74 28 70 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a  t(p, pTabList);.
35d70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
35d80 6e 64 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72  ndif.  .    wher
35d90 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e  ePathSolver(pWIn
35da0 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  fo, 0);.    if( 
35db0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
35dc0 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
35dd0 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28  inError;.    if(
35de0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
35df0 79 20 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72  y ){.       wher
35e00 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e  ePathSolver(pWIn
35e10 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  fo, pWInfo->nRow
35e20 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69  Out+1);.       i
35e30 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
35e40 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
35e50 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20  BeginError;.    
35e60 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e  }.  }.  if( pWIn
35e70 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  fo->pOrderBy==0 
35e80 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  && (db->flags & 
35e90 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72  SQLITE_ReverseOr
35ea0 64 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  der)!=0 ){.     
35eb0 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20  pWInfo->revMask 
35ec0 3d 20 28 42 69 74 6d 61 73 6b 29 28 2d 31 29 3b  = (Bitmask)(-1);
35ed0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
35ee0 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45 52  e->nErr || NEVER
35ef0 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  (db->mallocFaile
35f00 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77  d) ){.    goto w
35f10 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
35f20 20 20 7d 0a 23 69 66 64 65 66 20 57 48 45 52 45    }.#ifdef WHERE
35f30 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
35f40 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
35f50 54 72 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74  Trace ){.    int
35f60 20 69 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ii;.    sqlite3
35f70 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d  DebugPrintf("---
35f80 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d  - Solution nRow=
35f90 25 64 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  %d", pWInfo->nRo
35fa0 77 4f 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70  wOut);.    if( p
35fb0 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 29 7b  WInfo->bOBSat ){
35fc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
35fd0 62 75 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45  bugPrintf(" ORDE
35fe0 52 42 59 3d 30 78 25 6c 6c 78 22 2c 20 70 57 49  RBY=0x%llx", pWI
35ff0 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20  nfo->revMask);. 
36000 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28     }.    switch(
36010 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
36020 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  ct ){.      case
36030 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
36040 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20  UNIQUE: {.      
36050 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
36060 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
36070 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20  =unique");.     
36080 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
36090 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  }.      case WHE
360a0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
360b0 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  RED: {.        s
360c0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
360d0 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72  f("  DISTINCT=or
360e0 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20  dered");.       
360f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
36100 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
36110 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
36120 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  RED: {.        s
36130 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
36140 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e  f("  DISTINCT=un
36150 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20  ordered");.     
36160 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
36170 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
36180 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
36190 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69  \n");.    for(ii
361a0 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e  =0; ii<pWInfo->n
361b0 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20  Level; ii++){.  
361c0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
361d0 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d  nt(pWInfo->a[ii]
361e0 2e 70 57 4c 6f 6f 70 2c 20 70 54 61 62 4c 69 73  .pWLoop, pTabLis
361f0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  t);.    }.  }.#e
36200 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d 70  ndif.  /* Attemp
36210 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73  t to omit tables
36220 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74   from the join t
36230 68 61 74 20 64 6f 20 6e 6f 74 20 65 66 66 65 63  hat do not effec
36240 74 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  t the result */.
36250 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c    if( pWInfo->nL
36260 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52  evel>=2.   && pR
36270 65 73 75 6c 74 53 65 74 21 3d 30 0a 20 20 20 26  esultSet!=0.   &
36280 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
36290 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
362a0 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20  _OmitNoopJoin). 
362b0 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   ){.    Bitmask 
362c0 74 61 62 55 73 65 64 20 3d 20 65 78 70 72 4c 69  tabUsed = exprLi
362d0 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
362e0 73 6b 53 65 74 2c 20 70 52 65 73 75 6c 74 53 65  skSet, pResultSe
362f0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64  t);.    if( pOrd
36300 65 72 42 79 20 29 20 74 61 62 55 73 65 64 20 7c  erBy ) tabUsed |
36310 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
36320 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
36330 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 77 68  OrderBy);.    wh
36340 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ile( pWInfo->nLe
36350 76 65 6c 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20  vel>=2 ){.      
36360 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
36370 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 70  , *pEnd;.      p
36380 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  Loop = pWInfo->a
36390 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  [pWInfo->nLevel-
363a0 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20  1].pWLoop;.     
363b0 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 70 54   if( (pWInfo->pT
363c0 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d  abList->a[pLoop-
363d0 3e 69 54 61 62 5d 2e 6a 6f 69 6e 74 79 70 65 20  >iTab].jointype 
363e0 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20  & JT_LEFT)==0 ) 
363f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
36400 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
36410 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
36420 43 54 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  CT)==0.       &&
36430 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
36440 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29   & WHERE_ONEROW)
36450 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ==0.      ){.   
36460 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
36470 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 74    }.      if( (t
36480 61 62 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e  abUsed & pLoop->
36490 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 20 62  maskSelf)!=0 ) b
364a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64  reak;.      pEnd
364b0 20 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b   = sWLB.pWC->a +
364c0 20 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d   sWLB.pWC->nTerm
364d0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72  ;.      for(pTer
364e0 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70  m=sWLB.pWC->a; p
364f0 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d  Term<pEnd; pTerm
36500 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
36510 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
36520 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  ll & pLoop->mask
36530 53 65 6c 66 29 21 3d 30 0a 20 20 20 20 20 20 20  Self)!=0.       
36540 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
36550 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
36560 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
36570 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
36580 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
36590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
365a0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3c 70       if( pTerm<p
365b0 45 6e 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  End ) break;.   
365c0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
365d0 66 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20  ffff, ("-> drop 
365e0 6c 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73 65 64  loop %c not used
365f0 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29  \n", pLoop->cId)
36600 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  );.      pWInfo-
36610 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20  >nLevel--;.     
36620 20 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20   nTabList--;.   
36630 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52   }.  }.  WHERETR
36640 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a  ACE(0xffff,("***
36650 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73   Optimizer Finis
36660 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20  hed ***\n"));.  
36670 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
36680 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57  nQueryLoop += pW
36690 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a  Info->nRowOut;..
366a0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    /* If the call
366b0 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45 20  er is an UPDATE 
366c0 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
366d0 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71 75  ent that is requ
366e0 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75  esting.  ** to u
366f0 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c  se a one-pass al
36700 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69  gorithm, determi
36710 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61 70  ne if this is ap
36720 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20  propriate..  ** 
36730 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67  The one-pass alg
36740 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b  orithm only work
36750 73 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  s if the WHERE c
36760 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
36770 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65  s.  ** the state
36780 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20 61  ment to update a
36790 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a   single row..  *
367a0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74  /.  assert( (wct
367b0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
367c0 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
367d0 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e  ==0 || pWInfo->n
367e0 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66  Level==1 );.  if
367f0 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
36800 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
36810 53 49 52 45 44 29 21 3d 30 20 0a 20 20 20 26 26  SIRED)!=0 .   &&
36820 20 28 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70   (pWInfo->a[0].p
36830 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
36840 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d   WHERE_ONEROW)!=
36850 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  0 ){.    pWInfo-
36860 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a  >okOnePass = 1;.
36870 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
36880 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  .pWLoop->wsFlags
36890 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f   &= ~WHERE_IDX_O
368a0 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  NLY;.  }..  /* O
368b0 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  pen all tables i
368c0 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61  n the pTabList a
368d0 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73  nd any indices s
368e0 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a  elected for.  **
368f0 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65   searching those
36900 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
36910 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74  notReady = ~(Bit
36920 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69  mask)0;.  for(ii
36930 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
36940 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73  o->a; ii<nTabLis
36950 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  t; ii++, pLevel+
36960 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
36970 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c  Tab;     /* Tabl
36980 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20  e to open */.   
36990 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
369a0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61    /* Index of da
369b0 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
369c0 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f  g table/index */
369d0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
369e0 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
369f0 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65  em;..    pTabIte
36a00 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
36a10 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
36a20 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62  .    pTab = pTab
36a30 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
36a40 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
36a50 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
36a60 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
36a70 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
36a80 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69  l->pWLoop;.    i
36a90 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
36aa0 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
36ab0 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70  l)!=0 || pTab->p
36ac0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
36ad0 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
36ae0 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64  .    }else.#ifnd
36af0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
36b00 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
36b10 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
36b20 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
36b30 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
36b40 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
36b50 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74   *pVTab = (const
36b60 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47   char *)sqlite3G
36b70 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
36b80 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b);.      int iC
36b90 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
36ba0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71  Cursor;.      sq
36bb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
36bc0 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75  v, OP_VOpen, iCu
36bd0 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20  r, 0, 0, pVTab, 
36be0 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65  P4_VTAB);.    }e
36bf0 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61  lse if( IsVirtua
36c00 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
36c10 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20   /* noop */.    
36c20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
36c30 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
36c40 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
36c50 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20  _ONLY)==0.      
36c60 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67     && (wctrlFlag
36c70 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f  s & WHERE_OMIT_O
36c80 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b  PEN_CLOSE)==0 ){
36c90 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  .      int op = 
36ca0 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
36cb0 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  s ? OP_OpenWrite
36cc0 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a   : OP_OpenRead;.
36cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
36ce0 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  nTable(pParse, p
36cf0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
36d00 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29  , iDb, pTab, op)
36d10 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
36d20 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65  ( !pWInfo->okOne
36d30 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43  Pass && pTab->nC
36d40 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
36d50 20 20 20 74 65 73 74 63 61 73 65 28 20 21 70 57     testcase( !pW
36d60 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
36d70 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42  && pTab->nCol==B
36d80 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MS );.      if( 
36d90 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
36da0 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  ss && pTab->nCol
36db0 3c 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 20 20  <BMS ){.        
36dc0 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62  Bitmask b = pTab
36dd0 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
36de0 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30         int n = 0
36df0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20  ;.        for(; 
36e00 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b  b; b=b>>1, n++){
36e10 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
36e20 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
36e30 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
36e40 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20  entAddr(v)-1, . 
36e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e60 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
36e70 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c  E_INT_TO_PTR(n),
36e80 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20   P4_INT32);.    
36e90 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70      assert( n<=p
36ea0 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
36eb0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
36ec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
36ed0 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
36ee0 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
36ef0 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
36f00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
36f10 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
36f20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b  WHERE_INDEXED ){
36f30 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
36f40 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
36f50 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  ee.pIndex;.     
36f60 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d   KeyInfo *pKey =
36f70 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79   sqlite3IndexKey
36f80 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78  info(pParse, pIx
36f90 29 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 4d  );.      /* FIXM
36fa0 45 3a 20 20 41 73 20 61 6e 20 6f 70 74 69 6d 69  E:  As an optimi
36fb0 7a 61 74 69 6f 6e 20 75 73 65 20 70 54 61 62 49  zation use pTabI
36fc0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 69 66 20  tem->iCursor if 
36fd0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 2a  WHERE_IDX_ONLY *
36fe0 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64  /.      int iInd
36ff0 65 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e  exCur = pLevel->
37000 69 49 64 78 43 75 72 20 3d 20 69 49 64 78 43 75  iIdxCur = iIdxCu
37010 72 20 3f 20 69 49 64 78 43 75 72 20 3a 20 70 50  r ? iIdxCur : pP
37020 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
37030 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d      assert( pIx-
37040 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
37050 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
37060 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 43   assert( iIndexC
37070 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ur>=0 );.      s
37080 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
37090 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
370a0 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d   iIndexCur, pIx-
370b0 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20  >tnum, iDb,.    
370c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
370d0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c      (char*)pKey,
370e0 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
370f0 4f 46 46 29 3b 0a 20 20 20 20 20 20 56 64 62 65  OFF);.      Vdbe
37100 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
37110 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  , pIx->zName));.
37120 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
37130 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
37140 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
37150 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20      notReady &= 
37160 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  ~getMask(&pWInfo
37170 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  ->sMaskSet, pTab
37180 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
37190 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54    }.  pWInfo->iT
371a0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
371b0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
371c0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
371d0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
371e0 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a  ereBeginError;..
371f0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
37200 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65  e code to do the
37210 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69   search.  Each i
37220 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
37230 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65  for.  ** loop be
37240 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f  low generates co
37250 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
37260 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
37270 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72  he VM.  ** progr
37280 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65  am..  */.  notRe
37290 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
372a0 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  0;.  for(ii=0; i
372b0 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b  i<nTabList; ii++
372c0 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  ){.    pLevel = 
372d0 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a  &pWInfo->a[ii];.
372e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
372f0 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
37300 44 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65  DEX.    if( (pLe
37310 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46  vel->pWLoop->wsF
37320 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
37330 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20  O_INDEX)!=0 ){. 
37340 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75       constructAu
37350 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61  tomaticIndex(pPa
37360 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  rse, &pWInfo->sW
37370 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  C,.             
37380 20 20 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b     &pTabList->a[
37390 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20  pLevel->iFrom], 
373a0 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c  notReady, pLevel
373b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
373c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
373d0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
373e0 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rror;.    }.#end
373f0 69 66 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e  if.    explainOn
37400 65 53 63 61 6e 28 70 50 61 72 73 65 2c 20 70 54  eScan(pParse, pT
37410 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20  abList, pLevel, 
37420 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ii, pLevel->iFro
37430 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a  m, wctrlFlags);.
37440 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
37450 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64  Body = sqlite3Vd
37460 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
37470 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d  ;.    notReady =
37480 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72   codeOneLoopStar
37490 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f  t(pWInfo, ii, no
374a0 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49  tReady);.    pWI
374b0 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d  nfo->iContinue =
374c0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
374d0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e  t;.  }..  /* Don
374e0 65 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  e. */.  return p
374f0 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  WInfo;..  /* Jum
37500 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63  p here if malloc
37510 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42   fails */.whereB
37520 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28  eginError:.  if(
37530 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70   pWInfo ){.    p
37540 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
37550 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  p = pWInfo->save
37560 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20  dNQueryLoop;.   
37570 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64   whereInfoFree(d
37580 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
37590 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
375a0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
375b0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
375c0 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f  RE loop.  See co
375d0 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71  mments on .** sq
375e0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
375f0 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
37600 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
37610 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65  .void sqlite3Whe
37620 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20  reEnd(WhereInfo 
37630 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73  *pWInfo){.  Pars
37640 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
37650 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64  fo->pParse;.  Vd
37660 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
37670 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
37680 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
37690 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  evel;.  WhereLoo
376a0 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c  p *pLoop;.  SrcL
376b0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
376c0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
376d0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
376e0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
376f0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f   /* Generate loo
37700 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  p termination co
37710 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  de..  */.  sqlit
37720 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
37730 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28  (pParse);.  for(
37740 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i=pWInfo->nLevel
37750 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
37760 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57      pLevel = &pW
37770 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Info->a[i];.    
37780 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
37790 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 73 71 6c 69  pWLoop;.    sqli
377a0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
377b0 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
377c0 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66  ddrCont);.    if
377d0 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50  ( pLevel->op!=OP
377e0 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73  _Noop ){.      s
377f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
37800 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20  (v, pLevel->op, 
37810 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76  pLevel->p1, pLev
37820 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20 73  el->p2);.      s
37830 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
37840 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35  P5(v, pLevel->p5
37850 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
37860 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
37870 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20  & WHERE_IN_ABLE 
37880 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  && pLevel->u.in.
37890 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  nIn>0 ){.      s
378a0 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
378b0 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  n;.      int j;.
378c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
378d0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
378e0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
378f0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70  );.      for(j=p
37900 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c  Level->u.in.nIn,
37910 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e   pIn=&pLevel->u.
37920 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b  in.aInLoop[j-1];
37930 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d   j>0; j--, pIn--
37940 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
37950 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
37960 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
37970 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +1);.        sql
37980 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
37990 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f  , pIn->eEndLoopO
379a0 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49  p, pIn->iCur, pI
379b0 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20  n->addrInTop);. 
379c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
379d0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49  beJumpHere(v, pI
379e0 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b  n->addrInTop-1);
379f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
37a00 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
37a10 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
37a20 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20  nLoop);.    }.  
37a30 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
37a40 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
37a50 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20  vel->addrBrk);. 
37a60 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
37a70 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
37a80 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
37a90 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
37aa0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
37ab0 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e  _IfPos, pLevel->
37ac0 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
37ad0 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
37ae0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
37af0 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20  E_IDX_ONLY)==0. 
37b00 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c            || (pL
37b10 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
37b20 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
37b30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   );.      if( (p
37b40 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
37b50 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
37b60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
37b70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
37b80 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70  v, OP_NullRow, p
37b90 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
37ba0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
37bb0 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d        if( pLoop-
37bc0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
37bd0 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
37be0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
37bf0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
37c00 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  Row, pLevel->iId
37c10 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
37c20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
37c30 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29  >op==OP_Return )
37c40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
37c50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
37c60 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d  P_Gosub, pLevel-
37c70 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  >p1, pLevel->add
37c80 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d  rFirst);.      }
37c90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
37ca0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
37cb0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
37cc0 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74  Level->addrFirst
37cd0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
37ce0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
37cf0 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
37d00 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
37d10 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74  he "break" point
37d20 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70   is here, just p
37d30 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
37d40 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20  he outer loop.. 
37d50 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f   ** Set it..  */
37d60 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
37d70 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57  solveLabel(v, pW
37d80 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a  Info->iBreak);..
37d90 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f    /* Close all o
37da0 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68  f the cursors th
37db0 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62  at were opened b
37dc0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
37dd0 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  gin..  */.  asse
37de0 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  rt( pWInfo->nLev
37df0 65 6c 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53  el<=pTabList->nS
37e00 72 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  rc );.  for(i=0,
37e10 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
37e20 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  a; i<pWInfo->nLe
37e30 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c  vel; i++, pLevel
37e40 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  ++){.    Index *
37e50 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 73 74  pIdx = 0;.    st
37e60 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
37e70 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70  m *pTabItem = &p
37e80 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
37e90 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54  l->iFrom];.    T
37ea0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
37eb0 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
37ec0 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
37ed0 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20   );.    pLoop = 
37ee0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
37ef0 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74      if( (pTab->t
37f00 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
37f10 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20  emeral)==0.     
37f20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
37f30 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57 49  ==0.     && (pWI
37f40 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
37f50 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45  & WHERE_OMIT_OPE
37f60 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20  N_CLOSE)==0.    
37f70 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20  ){.      int ws 
37f80 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  = pLoop->wsFlags
37f90 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 57 49  ;.      if( !pWI
37fa0 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26  nfo->okOnePass &
37fb0 26 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 44  & (ws & WHERE_ID
37fc0 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  X_ONLY)==0 ){.  
37fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37fe0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
37ff0 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  ose, pTabItem->i
38000 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
38010 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20 26  .      if( (ws &
38020 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
38030 3d 30 20 26 26 20 28 77 73 20 26 20 28 57 48 45  =0 && (ws & (WHE
38040 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 41 55 54  RE_IPK|WHERE_AUT
38050 4f 5f 49 4e 44 45 58 29 29 3d 3d 30 20 29 7b 0a  O_INDEX))==0 ){.
38060 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
38070 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
38080 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69  Close, pLevel->i
38090 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d  IdxCur);.      }
380a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
380b0 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65 73  f this scan uses
380c0 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20   an index, make 
380d0 56 44 42 45 20 63 6f 64 65 20 73 75 62 73 74 69  VDBE code substi
380e0 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20  tutions to read 
380f0 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d  data.    ** from
38100 20 74 68 65 20 69 6e 64 65 78 20 69 6e 73 74 65   the index inste
38110 61 64 20 6f 66 20 66 72 6f 6d 20 74 68 65 20 74  ad of from the t
38120 61 62 6c 65 20 77 68 65 72 65 20 70 6f 73 73 69  able where possi
38130 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63 61  ble.  In some ca
38140 73 65 73 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ses.    ** this 
38150 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72 65  optimization pre
38160 76 65 6e 74 73 20 74 68 65 20 74 61 62 6c 65 20  vents the table 
38170 66 72 6f 6d 20 65 76 65 72 20 62 65 69 6e 67 20  from ever being 
38180 72 65 61 64 2c 20 77 68 69 63 68 20 63 61 6e 0a  read, which can.
38190 20 20 20 20 2a 2a 20 79 69 65 6c 64 20 61 20 73      ** yield a s
381a0 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72 66 6f  ignificant perfo
381b0 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20  rmance boost..  
381c0 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c    ** .    ** Cal
381d0 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  ls to the code g
381e0 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77  enerator in betw
381f0 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65  een sqlite3Where
38