/ Hex Artifact Content
Login

Artifact 8596edcfbffc6d26a9a4f8e4a41d09f058dd7037:


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 73 74 72 6c 65 6e 28 7a 41 66 66 29 3e 3d  | strlen(zAff)>=
1b630 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30  nEq );.  for(j=0
1b640 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20  ; j<nEq; j++){. 
1b650 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 70     int r1;.    p
1b660 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  Term = pLoop->aL
1b670 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61 73 73  Term[j];.    ass
1b680 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
1b690 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
1b6a0 6f 77 69 6e 67 20 74 72 75 65 20 66 6f 72 20 69  owing true for i
1b6b0 6e 64 69 63 65 73 20 77 69 74 68 20 72 65 64 75  ndices with redu
1b6c0 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a  ndant columns. .
1b6d0 20 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54      ** Ex: CREAT
1b6e0 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
1b6f0 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20  (a,b,a); SELECT 
1b700 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
1b710 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a  a=0 AND b=0; */.
1b720 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
1b730 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1b740 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29  TERM_CODED)!=0 )
1b750 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1b760 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1b770 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1b780 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71  .    r1 = codeEq
1b790 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
1b7a0 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
1b7b0 2c 20 6a 2c 20 62 52 65 76 2c 20 72 65 67 42 61  , j, bRev, regBa
1b7c0 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72  se+j);.    if( r
1b7d0 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a  1!=regBase+j ){.
1b7e0 20 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d        if( nReg==
1b7f0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
1b800 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1b810 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  eg(pParse, regBa
1b820 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67  se);.        reg
1b830 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20  Base = r1;.     
1b840 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b850 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b860 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
1b870 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  1, regBase+j);. 
1b880 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1b890 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
1b8a0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1b8b0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
1b8c0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
1b8d0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
1b8e0 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  N );.    if( (pT
1b8f0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1b900 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49   (WO_ISNULL|WO_I
1b910 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  N))==0 ){.      
1b920 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
1b930 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
1b940 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
1b950 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c  e3ExprCodeIsNull
1b960 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20  Jump(v, pRight, 
1b970 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65  regBase+j, pLeve
1b980 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  l->addrBrk);.   
1b990 20 20 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20     if( zAff ){. 
1b9a0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1b9b0 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
1b9c0 79 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a  y(pRight, zAff[j
1b9d0 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ])==SQLITE_AFF_N
1b9e0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
1b9f0 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54   zAff[j] = SQLIT
1ba00 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
1ba10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1ba20 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
1ba30 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
1ba40 67 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b  ge(pRight, zAff[
1ba50 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  j]) ){.         
1ba60 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54   zAff[j] = SQLIT
1ba70 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
1ba80 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1ba90 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66    }.  }.  *pzAff
1baa0 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72   = zAff;.  retur
1bab0 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69  n regBase;.}..#i
1bac0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1bad0 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
1bae0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1baf0 61 20 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70  a helper for exp
1bb00 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29  lainIndexRange()
1bb10 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74   below.**.** pSt
1bb20 72 20 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74  r holds the text
1bb30 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
1bb40 6e 20 74 68 61 74 20 77 65 20 61 72 65 20 62 75  n that we are bu
1bb50 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65  ilding up one te
1bb60 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e  rm.** at a time.
1bb70 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
1bb80 64 64 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74  dds a new term t
1bb90 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1bba0 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
1bbb0 54 65 72 6d 73 20 61 72 65 20 73 65 70 61 72 61  Terms are separa
1bbc0 74 65 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64  ted by AND so ad
1bbd0 64 20 74 68 65 20 22 41 4e 44 22 20 74 65 78 74  d the "AND" text
1bbe0 20 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20   for second and 
1bbf0 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65  subsequent.** te
1bc00 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61  rms only..*/.sta
1bc10 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
1bc20 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74  AppendTerm(.  St
1bc30 72 41 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20  rAccum *pStr,   
1bc40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1bc50 20 74 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e   text expression
1bc60 20 62 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a   being built */.
1bc70 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20    int iTerm,    
1bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bc90 20 49 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74   Index of this t
1bca0 65 72 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a  erm.  First is z
1bcb0 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ero */.  const c
1bcc0 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20  har *zColumn,   
1bcd0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1bce0 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  the column */.  
1bcf0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20  const char *zOp 
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1bd10 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  ame of the opera
1bd20 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  tor */.){.  if( 
1bd30 69 54 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53  iTerm ) sqlite3S
1bd40 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
1bd50 74 72 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b  tr, " AND ", 5);
1bd60 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
1bd70 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a  umAppend(pStr, z
1bd80 43 6f 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20 73  Column, -1);.  s
1bd90 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
1bda0 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20  pend(pStr, zOp, 
1bdb0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  1);.  sqlite3Str
1bdc0 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
1bdd0 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  , "?", 1);.}../*
1bde0 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65  .** Argument pLe
1bdf0 76 65 6c 20 64 65 73 63 72 69 62 65 73 20 61 20  vel describes a 
1be00 73 74 72 61 74 65 67 79 20 66 6f 72 20 73 63 61  strategy for sca
1be10 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62  nning table pTab
1be20 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
1be30 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
1be40 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
1be50 67 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  g buffer contain
1be60 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69 6f  ing a descriptio
1be70 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 73  n.** of the subs
1be80 65 74 20 6f 66 20 74 61 62 6c 65 20 72 6f 77 73  et of table rows
1be90 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68 65 20   scanned by the 
1bea0 73 74 72 61 74 65 67 79 20 69 6e 20 74 68 65 20  strategy in the 
1beb0 66 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51  form of an.** SQ
1bec0 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72  L expression. Or
1bed0 2c 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72  , if all rows ar
1bee0 65 20 73 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20  e scanned, NULL 
1bef0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
1bf00 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1bf10 69 66 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a  if the query:.**
1bf20 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
1bf30 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31  ROM t1 WHERE a=1
1bf40 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20   AND b>2;.**.** 
1bf50 69 73 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65  is run and there
1bf60 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20   is an index on 
1bf70 28 61 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69  (a, b), then thi
1bf80 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1bf90 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73  ns a.** string s
1bfa0 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a  imilar to:.**.**
1bfb0 20 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22     "a=? AND b>?"
1bfc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
1bfd0 6e 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  ned pointer poin
1bfe0 74 73 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74  ts to memory obt
1bff0 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
1c000 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  e3DbMalloc()..**
1c010 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
1c020 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
1c030 20 63 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20   caller to free 
1c040 74 68 65 20 62 75 66 66 65 72 20 77 68 65 6e 20  the buffer when 
1c050 69 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67  it is.** no long
1c060 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  er required..*/.
1c070 73 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70  static char *exp
1c080 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 73  lainIndexRange(s
1c090 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
1c0a0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 54 61  eLoop *pLoop, Ta
1c0b0 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e  ble *pTab){.  In
1c0c0 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 4c  dex *pIndex = pL
1c0d0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
1c0e0 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  dex;.  int nEq =
1c0f0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1c100 6e 45 71 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  nEq;.  int i, j;
1c110 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20  .  Column *aCol 
1c120 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  = pTab->aCol;.  
1c130 69 6e 74 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20  int *aiColumn = 
1c140 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1c150 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 74 78 74  ;.  StrAccum txt
1c160 3b 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20  ;..  if( nEq==0 
1c170 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
1c180 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f  gs & (WHERE_BTM_
1c190 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
1c1a0 4c 49 4d 49 54 29 29 3d 3d 30 20 29 7b 0a 20 20  LIMIT))==0 ){.  
1c1b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1c1c0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
1c1d0 6d 49 6e 69 74 28 26 74 78 74 2c 20 30 2c 20 30  mInit(&txt, 0, 0
1c1e0 2c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  , SQLITE_MAX_LEN
1c1f0 47 54 48 29 3b 0a 20 20 74 78 74 2e 64 62 20 3d  GTH);.  txt.db =
1c200 20 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 53 74   db;.  sqlite3St
1c210 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78  rAccumAppend(&tx
1c220 74 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20 20 66  t, " (", 2);.  f
1c230 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69  or(i=0; i<nEq; i
1c240 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
1c250 20 3d 20 28 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e   = (i==pIndex->n
1c260 43 6f 6c 75 6d 6e 20 29 20 3f 20 22 72 6f 77 69  Column ) ? "rowi
1c270 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75  d" : aCol[aiColu
1c280 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  mn[i]].zName;.  
1c290 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54    explainAppendT
1c2a0 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20  erm(&txt, i, z, 
1c2b0 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a 20 3d  "=");.  }..  j =
1c2c0 20 69 3b 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d   i;.  if( pLoop-
1c2d0 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 42  >wsFlags&WHERE_B
1c2e0 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
1c2f0 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49  char *z = (j==pI
1c300 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20  ndex->nColumn ) 
1c310 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c  ? "rowid" : aCol
1c320 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  [aiColumn[j]].zN
1c330 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e  ame;.    explain
1c340 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c  AppendTerm(&txt,
1c350 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a 20   i++, z, ">");. 
1c360 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e   }.  if( pLoop->
1c370 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 54 4f  wsFlags&WHERE_TO
1c380 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 63  P_LIMIT ){.    c
1c390 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e  har *z = (j==pIn
1c3a0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 3f  dex->nColumn ) ?
1c3b0 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b   "rowid" : aCol[
1c3c0 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61  aiColumn[j]].zNa
1c3d0 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41  me;.    explainA
1c3e0 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20  ppendTerm(&txt, 
1c3f0 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a  i, z, "<");.  }.
1c400 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
1c410 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 29  mAppend(&txt, ")
1c420 22 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  ", 1);.  return 
1c430 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
1c440 69 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d 0a 0a  inish(&txt);.}..
1c450 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1c460 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75  ion is a no-op u
1c470 6e 6c 65 73 73 20 63 75 72 72 65 6e 74 6c 79 20  nless currently 
1c480 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20 45 58  processing an EX
1c490 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
1c4a0 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49 66 20  .** command. If 
1c4b0 74 68 65 20 71 75 65 72 79 20 62 65 69 6e 67 20  the query being 
1c4c0 63 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e 20 45  compiled is an E
1c4d0 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
1c4e0 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72  N, a single.** r
1c4f0 65 63 6f 72 64 20 69 73 20 61 64 64 65 64 20 74  ecord is added t
1c500 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74 6f 20  o the output to 
1c510 64 65 73 63 72 69 62 65 20 74 68 65 20 74 61 62  describe the tab
1c520 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65 67 79  le scan strategy
1c530 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e 0a   in .** pLevel..
1c540 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
1c550 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20  xplainOneScan(. 
1c560 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1c570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c580 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
1c590 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
1c5a0 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
1c5b0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1c5c0 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20 72  list this loop r
1c5d0 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68  efers to */.  Wh
1c5e0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
1c5f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1c600 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20 4f   Scan to write O
1c610 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65  P_Explain opcode
1c620 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c   for */.  int iL
1c630 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
1c640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1c650 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 63  ue for "level" c
1c660 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20  olumn of output 
1c670 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
1c680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c690 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
1c6a0 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20  r "from" column 
1c6b0 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75  of output */.  u
1c6c0 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20  16 wctrlFlags   
1c6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c6e0 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
1c6f0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
1c700 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69 66  gin() */.){.  if
1c710 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
1c720 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 73 74 72 75  n==2 ){.    stru
1c730 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1c740 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
1c750 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
1c760 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a  rom];.    Vdbe *
1c770 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1c780 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65  e;      /* VM be
1c790 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
1c7a0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  */.    sqlite3 *
1c7b0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1c7c0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1c7d0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 63   handle */.    c
1c7e0 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20 20  har *zMsg;      
1c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c800 54 65 78 74 20 74 6f 20 61 64 64 20 74 6f 20 45  Text to add to E
1c810 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20  QP output */.   
1c820 20 69 6e 74 20 69 49 64 20 3d 20 70 50 61 72 73   int iId = pPars
1c830 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20 20 2f  e->iSelectId;  /
1c840 2a 20 53 65 6c 65 63 74 20 69 64 20 28 6c 65 66  * Select id (lef
1c850 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20 63 6f  t-most output co
1c860 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  lumn) */.    int
1c870 20 69 73 53 65 61 72 63 68 3b 20 20 20 20 20 20   isSearch;      
1c880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1c890 75 65 20 66 6f 72 20 61 20 53 45 41 52 43 48 2e  ue for a SEARCH.
1c8a0 20 46 61 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e   False for SCAN.
1c8b0 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f   */.    WhereLoo
1c8c0 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
1c8d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
1c8e0 74 72 6f 6c 6c 69 6e 67 20 57 68 65 72 65 4c 6f  trolling WhereLo
1c8f0 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  op object */.   
1c900 20 75 33 32 20 66 6c 61 67 73 3b 20 20 20 20 20   u32 flags;     
1c910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c920 2a 20 46 6c 61 67 73 20 74 68 61 74 20 64 65 73  * Flags that des
1c930 63 72 69 62 65 20 74 68 69 73 20 6c 6f 6f 70 20  cribe this loop 
1c940 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  */..    pLoop = 
1c950 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
1c960 20 20 20 20 66 6c 61 67 73 20 3d 20 70 4c 6f 6f      flags = pLoo
1c970 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  p->wsFlags;.    
1c980 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45  if( (flags&WHERE
1c990 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77  _MULTI_OR) || (w
1c9a0 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
1c9b0 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 29  ONETABLE_ONLY) )
1c9c0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 73   return;..    is
1c9d0 53 65 61 72 63 68 20 3d 20 28 66 6c 61 67 73 26  Search = (flags&
1c9e0 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  (WHERE_BTM_LIMIT
1c9f0 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
1ca00 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ))!=0.          
1ca10 20 20 7c 7c 20 28 28 66 6c 61 67 73 26 57 48 45    || ((flags&WHE
1ca20 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
1ca30 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 75  ==0 && (pLoop->u
1ca40 2e 62 74 72 65 65 2e 6e 45 71 3e 30 29 29 0a 20  .btree.nEq>0)). 
1ca50 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 77             || (w
1ca60 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45  ctrlFlags&(WHERE
1ca70 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45  _ORDERBY_MIN|WHE
1ca80 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 29  RE_ORDERBY_MAX))
1ca90 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  ;..    zMsg = sq
1caa0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1cab0 20 22 25 73 22 2c 20 69 73 53 65 61 72 63 68 3f   "%s", isSearch?
1cac0 22 53 45 41 52 43 48 22 3a 22 53 43 41 4e 22 29  "SEARCH":"SCAN")
1cad0 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ;.    if( pItem-
1cae0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
1caf0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1cb00 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1cb10 67 2c 20 22 25 73 20 53 55 42 51 55 45 52 59 20  g, "%s SUBQUERY 
1cb20 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74 65 6d 2d  %d", zMsg,pItem-
1cb30 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  >iSelectId);.   
1cb40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4d   }else{.      zM
1cb50 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1cb60 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1cb70 25 73 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 4d  %s TABLE %s", zM
1cb80 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  sg, pItem->zName
1cb90 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
1cba0 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
1cbb0 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
1cbc0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1cbd0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41 53  db, zMsg, "%s AS
1cbe0 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65   %s", zMsg, pIte
1cbf0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
1cc00 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  }.    if( (flags
1cc10 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48   & (WHERE_IPK|WH
1cc20 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
1cc30 29 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 41 4c  ))==0.     && AL
1cc40 57 41 59 53 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74  WAYS(pLoop->u.bt
1cc50 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 29 0a 20  ree.pIndex!=0). 
1cc60 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72     ){.      char
1cc70 20 2a 7a 57 68 65 72 65 20 3d 20 65 78 70 6c 61   *zWhere = expla
1cc80 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 64 62 2c  inIndexRange(db,
1cc90 20 70 4c 6f 6f 70 2c 20 70 49 74 65 6d 2d 3e 70   pLoop, pItem->p
1cca0 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d 73 67  Tab);.      zMsg
1ccb0 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1ccc0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 0a 20 20 20  df(db, zMsg,.   
1ccd0 20 20 20 20 20 20 20 20 20 20 20 20 28 28 66 6c              ((fl
1cce0 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
1ccf0 5f 49 4e 44 45 58 29 20 3f 20 0a 20 20 20 20 20  _INDEX) ? .     
1cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25                "%
1cd10 73 20 55 53 49 4e 47 20 41 55 54 4f 4d 41 54 49  s USING AUTOMATI
1cd20 43 20 25 73 49 4e 44 45 58 25 2e 30 73 25 73 22  C %sINDEX%.0s%s"
1cd30 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   :.             
1cd40 20 20 20 20 20 20 22 25 73 20 55 53 49 4e 47 20        "%s USING 
1cd50 25 73 49 4e 44 45 58 20 25 73 25 73 22 29 2c 20  %sINDEX %s%s"), 
1cd60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cd70 7a 4d 73 67 2c 20 28 28 66 6c 61 67 73 20 26 20  zMsg, ((flags & 
1cd80 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20  WHERE_IDX_ONLY) 
1cd90 3f 20 22 43 4f 56 45 52 49 4e 47 20 22 20 3a 20  ? "COVERING " : 
1cda0 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ""),.           
1cdb0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
1cdc0 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ee.pIndex->zName
1cdd0 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 20  , zWhere);.     
1cde0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1cdf0 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20  b, zWhere);.    
1ce00 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73  }else if( (flags
1ce10 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30   & WHERE_IPK)!=0
1ce20 20 26 26 20 28 66 6c 61 67 73 20 26 20 57 48 45   && (flags & WHE
1ce30 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d  RE_CONSTRAINT)!=
1ce40 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20  0 ){.      zMsg 
1ce50 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1ce60 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
1ce70 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52  USING INTEGER PR
1ce80 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67  IMARY KEY", zMsg
1ce90 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 66 6c  );..      if( fl
1cea0 61 67 73 26 28 57 48 45 52 45 5f 43 4f 4c 55 4d  ags&(WHERE_COLUM
1ceb0 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  N_EQ|WHERE_COLUM
1cec0 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20 20 20  N_IN) ){.       
1ced0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1cee0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1cef0 2c 20 22 25 73 20 28 72 6f 77 69 64 3d 3f 29 22  , "%s (rowid=?)"
1cf00 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
1cf10 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 26  else if( (flags&
1cf20 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54  WHERE_BOTH_LIMIT
1cf30 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49  )==WHERE_BOTH_LI
1cf40 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  MIT ){.        z
1cf50 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1cf60 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1cf70 22 25 73 20 28 72 6f 77 69 64 3e 3f 20 41 4e 44  "%s (rowid>? AND
1cf80 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67   rowid<?)", zMsg
1cf90 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1cfa0 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42  f( flags&WHERE_B
1cfb0 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
1cfc0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1cfd0 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1cfe0 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e  Msg, "%s (rowid>
1cff0 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  ?)", zMsg);.    
1d000 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
1d010 59 53 28 66 6c 61 67 73 26 57 48 45 52 45 5f 54  YS(flags&WHERE_T
1d020 4f 50 5f 4c 49 4d 49 54 29 20 29 7b 0a 20 20 20  OP_LIMIT) ){.   
1d030 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1d040 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1d050 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64  zMsg, "%s (rowid
1d060 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  <?)", zMsg);.   
1d070 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
1d080 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1d090 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
1d0a0 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20  else if( (flags 
1d0b0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
1d0c0 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
1d0d0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1d0e0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1d0f0 67 2c 20 22 25 73 20 56 49 52 54 55 41 4c 20 54  g, "%s VIRTUAL T
1d100 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73  ABLE INDEX %d:%s
1d110 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20  ", zMsg,.       
1d120 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
1d130 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c  ->u.vtab.idxNum,
1d140 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69   pLoop->u.vtab.i
1d150 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65  dxStr);.    }.#e
1d160 6e 64 69 66 0a 20 20 20 20 7a 4d 73 67 20 3d 20  ndif.    zMsg = 
1d170 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1d180 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 22 2c 20  db, zMsg, "%s", 
1d190 7a 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  zMsg);.    sqlit
1d1a0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1d1b0 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64 2c  OP_Explain, iId,
1d1c0 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c 20   iLevel, iFrom, 
1d1d0 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
1d1e0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
1d1f0 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 4f   define explainO
1d200 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c 79  neScan(u,v,w,x,y
1d210 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ,z).#endif /* SQ
1d220 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
1d230 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  N */.../*.** Gen
1d240 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
1d250 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1d260 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69  iLevel-th loop i
1d270 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
1d280 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  se.** implementa
1d290 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62  tion described b
1d2a0 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61  y pWInfo..*/.sta
1d2b0 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65  tic Bitmask code
1d2c0 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20  OneLoopStart(.  
1d2d0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1d2e0 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65  o,   /* Complete
1d2f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
1d300 75 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ut the WHERE cla
1d310 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  use */.  int iLe
1d320 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  vel,          /*
1d330 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20   Which level of 
1d340 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75  pWInfo->a[] shou
1d350 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  ld be coded */. 
1d360 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
1d370 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74  y     /* Which t
1d380 61 62 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e  ables are curren
1d390 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  tly available */
1d3a0 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20  .){.  int j, k; 
1d3b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1d3c0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
1d3d0 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
1d3e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
1d3f0 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
1d400 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
1d410 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20  addrNxt;        
1d420 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d   /* Where to jum
1d430 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  p to continue wi
1d440 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63  th the next IN c
1d450 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69  ase */.  int omi
1d460 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a  tTable;       /*
1d470 20 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20   True if we use 
1d480 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a  the index only *
1d490 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20  /.  int bRev;   
1d4a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1d4b0 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73   if we need to s
1d4c0 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  can in reverse o
1d4d0 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c  rder */.  WhereL
1d4e0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f  evel *pLevel;  /
1d4f0 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65 76 65  * The where leve
1d500 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  l to be coded */
1d510 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
1d520 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 57  oop;    /* The W
1d530 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
1d540 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
1d550 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
1d560 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f  C;    /* Decompo
1d570 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e  sition of the en
1d580 74 69 72 65 20 57 48 45 52 45 20 63 6c 61 75 73  tire WHERE claus
1d590 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
1d5a0 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
1d5b0 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52         /* A WHER
1d5c0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f  E clause term */
1d5d0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1d5e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d5f0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1d600 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
1d610 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
1d620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1d630 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1d640 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  n */.  Vdbe *v; 
1d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d660 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
1d670 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65  epared stmt unde
1d680 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20  r constructions 
1d690 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
1d6a0 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
1d6b0 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61  em;  /* FROM cla
1d6c0 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63  use term being c
1d6d0 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  oded */.  int ad
1d6e0 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20  drBrk;          
1d6f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
1d700 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
1d710 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
1d720 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
1d730 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1d740 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
1d750 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  e to continue wi
1d760 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f  th next cycle */
1d770 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65 67  .  int iRowidReg
1d780 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
1d790 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64 20  Rowid is stored 
1d7a0 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
1d7b0 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f  , if not zero */
1d7c0 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65 52  .  int iReleaseR
1d7d0 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  eg = 0;      /* 
1d7e0 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f  Temp register to
1d7f0 20 66 72 65 65 20 62 65 66 6f 72 65 20 72 65 74   free before ret
1d800 75 72 6e 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d  urning */.  Bitm
1d810 61 73 6b 20 6e 65 77 4e 6f 74 52 65 61 64 79 3b  ask newNotReady;
1d820 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1d830 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 70 50 61 72  value */..  pPar
1d840 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
1d850 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  rse;.  v = pPars
1d860 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20  e->pVdbe;.  pWC 
1d870 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a  = &pWInfo->sWC;.
1d880 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
1d890 62 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  b;.  pLevel = &p
1d8a0 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d  WInfo->a[iLevel]
1d8b0 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76  ;.  pLoop = pLev
1d8c0 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54  el->pWLoop;.  pT
1d8d0 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f  abItem = &pWInfo
1d8e0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
1d8f0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
1d900 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
1d910 3e 69 43 75 72 73 6f 72 3b 0a 20 20 62 52 65 76  >iCursor;.  bRev
1d920 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76 4d   = (pWInfo->revM
1d930 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b 0a  ask>>iLevel)&1;.
1d940 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70    omitTable = (p
1d950 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1d960 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21  WHERE_IDX_ONLY)!
1d970 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 26  =0 .           &
1d980 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
1d990 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f  Flags & WHERE_FO
1d9a0 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 20  RCE_TABLE)==0;. 
1d9b0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1d9c0 28 28 76 2c 20 22 42 65 67 69 6e 20 4a 6f 69 6e  ((v, "Begin Join
1d9d0 20 4c 6f 6f 70 20 25 64 22 2c 20 69 4c 65 76 65   Loop %d", iLeve
1d9e0 6c 29 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  l));..  /* Creat
1d9f0 65 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65  e labels for the
1da00 20 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f   "break" and "co
1da10 6e 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74  ntinue" instruct
1da20 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68  ions.  ** for th
1da30 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20  e current loop. 
1da40 20 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b   Jump to addrBrk
1da50 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
1da60 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75   a loop..  ** Ju
1da70 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f  mp to cont to go
1da80 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
1da90 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
1daa0 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c  on of the.  ** l
1dab0 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  oop..  **.  ** W
1dac0 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20  hen there is an 
1dad0 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20  IN operator, we 
1dae0 61 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64 64  also have a "add
1daf0 72 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74  rNxt" label that
1db00 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63  .  ** means to c
1db10 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65  ontinue with the
1db20 20 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63   next IN value c
1db30 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65  ombination.  Whe
1db40 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65  n.  ** there are
1db50 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73   no IN operators
1db60 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69   in the constrai
1db70 6e 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78  nts, the "addrNx
1db80 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73  t" label.  ** is
1db90 20 74 68 65 20 73 61 6d 65 20 61 73 20 22 61 64   the same as "ad
1dba0 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61  drBrk"..  */.  a
1dbb0 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d  ddrBrk = pLevel-
1dbc0 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65  >addrBrk = pLeve
1dbd0 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c  l->addrNxt = sql
1dbe0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1dbf0 6c 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74  l(v);.  addrCont
1dc00 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43   = pLevel->addrC
1dc10 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
1dc20 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
1dc30 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1dc40 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
1dc50 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
1dc60 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61  JOIN, allocate a
1dc70 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  nd.  ** initiali
1dc80 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ze a memory cell
1dc90 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66   that records if
1dca0 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63   this table matc
1dcb0 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77  hes any.  ** row
1dcc0 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61 62   of the left tab
1dcd0 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a  le of the join..
1dce0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65    */.  if( pLeve
1dcf0 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70  l->iFrom>0 && (p
1dd00 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74  TabItem[0].joint
1dd10 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
1dd20 30 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  0 ){.    pLevel-
1dd30 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70  >iLeftJoin = ++p
1dd40 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1dd50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1dd60 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1dd70 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  , 0, pLevel->iLe
1dd80 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62  ftJoin);.    Vdb
1dd90 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
1dda0 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d  it LEFT JOIN no-
1ddb0 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20  match flag"));. 
1ddc0 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c   }..  /* Special
1ddd0 20 63 61 73 65 20 6f 66 20 61 20 46 52 4f 4d 20   case of a FROM 
1dde0 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 20  clause subquery 
1ddf0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
1de00 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   co-routine */. 
1de10 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 76   if( pTabItem->v
1de20 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  iaCoroutine ){. 
1de30 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64 20     int regYield 
1de40 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52  = pTabItem->regR
1de50 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
1de60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1de70 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62  OP_Integer, pTab
1de80 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
1de90 62 2d 31 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a  b-1, regYield);.
1dea0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
1deb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1dec0 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
1ded0 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20   regYield);.    
1dee0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1def0 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 63 6f 2d  "next row of co-
1df00 72 6f 75 74 69 6e 65 20 25 73 22 2c 20 70 54 61  routine %s", pTa
1df10 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  bItem->pTab->zNa
1df20 6d 65 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  me));.    sqlite
1df30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1df40 50 5f 49 66 2c 20 72 65 67 59 69 65 6c 64 2b 31  P_If, regYield+1
1df50 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  , addrBrk);.    
1df60 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
1df70 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23  Goto;.  }else..#
1df80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1df90 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1dfa0 20 20 69 66 28 20 20 28 70 4c 6f 6f 70 2d 3e 77    if(  (pLoop->w
1dfb0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
1dfc0 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
1dfd0 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31  ){.    /* Case 1
1dfe0 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  :  The table is 
1dff0 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e  a virtual-table.
1e000 20 20 55 73 65 20 74 68 65 20 56 46 69 6c 74 65    Use the VFilte
1e010 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20 20  r and VNext.    
1e020 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 61  **          to a
1e030 63 63 65 73 73 20 74 68 65 20 64 61 74 61 2e 0a  ccess the data..
1e040 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69      */.    int i
1e050 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c  Reg;   /* P3 Val
1e060 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65  ue for OP_VFilte
1e070 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
1e080 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20 20 20 69  rNotFound;.    i
1e090 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  nt nConstraint =
1e0a0 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b 0a   pLoop->nLTerm;.
1e0b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1e0c0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
1e0d0 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71  );.    iReg = sq
1e0e0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
1e0f0 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74  e(pParse, nConst
1e100 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 61 64  raint+2);.    ad
1e110 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65  drNotFound = pLe
1e120 76 65 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a 20 20  vel->addrBrk;.  
1e130 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f    for(j=0; j<nCo
1e140 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a  nstraint; j++){.
1e150 20 20 20 20 20 20 69 6e 74 20 69 54 61 72 67 65        int iTarge
1e160 74 20 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a 20 20  t = iReg+j+2;.  
1e170 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
1e180 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20  p->aLTerm[j];.  
1e190 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
1e1a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e1b0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
1e1c0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
1e1d0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 45  ){.        codeE
1e1e0 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
1e1f0 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65  se, pTerm, pLeve
1e200 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 69 54 61 72  l, j, bRev, iTar
1e210 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 61 64  get);.        ad
1e220 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65  drNotFound = pLe
1e230 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20  vel->addrNxt;.  
1e240 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e250 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1e260 64 65 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  de(pParse, pTerm
1e270 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
1e280 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20   iTarget);.     
1e290 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
1e2a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e2b0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 4c  , OP_Integer, pL
1e2c0 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  oop->u.vtab.idxN
1e2d0 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 73  um, iReg);.    s
1e2e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e2f0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1e300 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 69 52 65  nConstraint, iRe
1e310 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  g+1);.    sqlite
1e320 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1e330 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c  P_VFilter, iCur,
1e340 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 2c 20 69   addrNotFound, i
1e350 52 65 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Reg,.           
1e360 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
1e370 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c  ->u.vtab.idxStr,
1e380 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e390 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e         pLoop->u.
1e3a0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3f 20  vtab.needFree ? 
1e3b0 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f  P4_MPRINTF : P4_
1e3c0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 70 4c 6f  STATIC);.    pLo
1e3d0 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  op->u.vtab.needF
1e3e0 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ree = 0;.    for
1e3f0 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61  (j=0; j<nConstra
1e400 69 6e 74 20 26 26 20 6a 3c 31 36 3b 20 6a 2b 2b  int && j<16; j++
1e410 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c  ){.      if( (pL
1e420 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  oop->u.vtab.omit
1e430 4d 61 73 6b 3e 3e 6a 29 26 31 20 29 7b 0a 20 20  Mask>>j)&1 ){.  
1e440 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
1e450 6d 28 70 4c 65 76 65 6c 2c 20 70 4c 6f 6f 70 2d  m(pLevel, pLoop-
1e460 3e 61 4c 54 65 72 6d 5b 6a 5d 29 3b 0a 20 20 20  >aLTerm[j]);.   
1e470 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1e480 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56  Level->op = OP_V
1e490 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Next;.    pLevel
1e4a0 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
1e4b0 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71   pLevel->p2 = sq
1e4c0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1e4d0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
1e4e0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1e4f0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52 65  ange(pParse, iRe
1e500 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32  g, nConstraint+2
1e510 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1e520 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
1e530 65 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  e, 1);.  }else.#
1e540 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1e550 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1e560 45 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 4c 6f  E */..  if( (pLo
1e570 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1e580 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 26  ERE_IPK)!=0.   &
1e590 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
1e5a0 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d  s & (WHERE_COLUM
1e5b0 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  N_IN|WHERE_COLUM
1e5c0 4e 5f 45 51 29 29 21 3d 30 0a 20 20 29 7b 0a 20  N_EQ))!=0.  ){. 
1e5d0 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57     /* Case 2:  W
1e5e0 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72  e can directly r
1e5f0 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c  eference a singl
1e600 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20  e row using an. 
1e610 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65     **          e
1e620 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73  quality comparis
1e630 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52  on against the R
1e640 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a  OWID field.  Or.
1e650 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1e660 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c  we reference mul
1e670 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67  tiple rows using
1e680 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e   a "rowid IN (..
1e690 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  .)".    **      
1e6a0 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20      construct.. 
1e6b0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1e6c0 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  ( pLoop->u.btree
1e6d0 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20 69  .nEq==1 );.    i
1e6e0 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c  ReleaseReg = sql
1e6f0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
1e700 50 61 72 73 65 29 3b 0a 20 20 20 20 70 54 65 72  Parse);.    pTer
1e710 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  m = pLoop->aLTer
1e720 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  m[0];.    assert
1e730 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
1e740 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
1e750 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  >pExpr!=0 );.   
1e760 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62   assert( omitTab
1e770 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  le==0 );.    tes
1e780 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
1e790 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1e7a0 54 55 41 4c 20 29 3b 0a 20 20 20 20 69 52 6f 77  TUAL );.    iRow
1e7b0 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71 75 61  idReg = codeEqua
1e7c0 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c  lityTerm(pParse,
1e7d0 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20   pTerm, pLevel, 
1e7e0 30 2c 20 62 52 65 76 2c 20 69 52 65 6c 65 61 73  0, bRev, iReleas
1e7f0 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64 72 4e  eReg);.    addrN
1e800 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  xt = pLevel->add
1e810 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rNxt;.    sqlite
1e820 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e830 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 52 6f  P_MustBeInt, iRo
1e840 77 69 64 52 65 67 2c 20 61 64 64 72 4e 78 74 29  widReg, addrNxt)
1e850 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1e860 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  eAddOp3(v, OP_No
1e870 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20 61  tExists, iCur, a
1e880 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64 52 65  ddrNxt, iRowidRe
1e890 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
1e8a0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
1e8b0 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  Change(pParse, i
1e8c0 52 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a 20 20  RowidReg, 1);.  
1e8d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1e8e0 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
1e8f0 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
1e900 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Reg);.    VdbeCo
1e910 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
1e920 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
1e930 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65   = OP_Noop;.  }e
1e940 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e  lse if( (pLoop->
1e950 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1e960 49 50 4b 29 21 3d 30 0a 20 20 20 20 20 20 20 20  IPK)!=0.        
1e970 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
1e980 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
1e990 4d 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20 29  MN_RANGE)!=0.  )
1e9a0 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a  {.    /* Case 3:
1e9b0 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65    We have an ine
1e9c0 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73  quality comparis
1e9d0 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52  on against the R
1e9e0 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20  OWID field..    
1e9f0 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f  */.    int testO
1ea00 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
1ea10 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20   int start;.    
1ea20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20  int memEndValue 
1ea30 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65  = 0;.    WhereTe
1ea40 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e  rm *pStart, *pEn
1ea50 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  d;..    assert( 
1ea60 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
1ea70 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 70      j = 0;.    p
1ea80 53 74 61 72 74 20 3d 20 70 45 6e 64 20 3d 20 30  Start = pEnd = 0
1ea90 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  ;.    if( pLoop-
1eaa0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1eab0 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53 74  _BTM_LIMIT ) pSt
1eac0 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  art = pLoop->aLT
1ead0 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66  erm[j++];.    if
1eae0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1eaf0 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
1eb00 49 54 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f 6f  IT ) pEnd = pLoo
1eb10 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a  p->aLTerm[j++];.
1eb20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61      assert( pSta
1eb30 72 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30  rt!=0 || pEnd!=0
1eb40 20 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76   );.    if( bRev
1eb50 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20   ){.      pTerm 
1eb60 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20  = pStart;.      
1eb70 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20  pStart = pEnd;. 
1eb80 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72       pEnd = pTer
1eb90 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  m;.    }.    if(
1eba0 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20   pStart ){.     
1ebb0 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20   Expr *pX;      
1ebc0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
1ebd0 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65  pression that de
1ebe0 66 69 6e 65 73 20 74 68 65 20 73 74 61 72 74 20  fines the start 
1ebf0 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69  bound */.      i
1ec00 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20  nt r1, rTemp;   
1ec10 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
1ec20 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68  s for holding th
1ec30 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79  e start boundary
1ec40 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   */..      /* Th
1ec50 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73  e following cons
1ec60 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20  tant maps TK_xx 
1ec70 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65  codes into corre
1ec80 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20  sponding .      
1ec90 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e  ** seek opcodes.
1eca0 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20    It depends on 
1ecb0 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64  a particular ord
1ecc0 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20  ering of TK_xx. 
1ecd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1ece0 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d  nst u8 aMoveOp[]
1ecf0 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   = {.           
1ed00 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f  /* TK_GT */  OP_
1ed10 53 65 65 6b 47 74 2c 0a 20 20 20 20 20 20 20 20  SeekGt,.        
1ed20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20     /* TK_LE */  
1ed30 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20 20  OP_SeekLe,.     
1ed40 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a        /* TK_LT *
1ed50 2f 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20 20  /  OP_SeekLt,.  
1ed60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47           /* TK_G
1ed70 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65 0a  E */  OP_SeekGe.
1ed80 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61        };.      a
1ed90 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b  ssert( TK_LE==TK
1eda0 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+1 );      /*
1edb0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f   Make sure the o
1edc0 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20  rdering.. */.   
1edd0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
1ede0 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20  ==TK_GT+2 );    
1edf0 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65    /*  ... of the
1ee00 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e   TK_xx values...
1ee10 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1ee20 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33  ( TK_GE==TK_GT+3
1ee30 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e   );      /*  ...
1ee40 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f   is correcct. */
1ee50 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
1ee60 28 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73  (pStart->wtFlags
1ee70 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
1ee80 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1ee90 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74 46  ase( pStart->wtF
1eea0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
1eeb0 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 70 58 20  UAL );.      pX 
1eec0 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b  = pStart->pExpr;
1eed0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1eee0 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  X!=0 );.      te
1eef0 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e  stcase( pStart->
1ef00 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72  leftCursor!=iCur
1ef10 20 29 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69 76   ); /* transitiv
1ef20 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
1ef30 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1ef40 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1ef50 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
1ef60 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20  ht, &rTemp);.   
1ef70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ef80 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b  dOp3(v, aMoveOp[
1ef90 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69  pX->op-TK_GT], i
1efa0 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31  Cur, addrBrk, r1
1efb0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1efc0 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
1efd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1efe0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1eff0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  hange(pParse, r1
1f000 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
1f010 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1f020 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29  g(pParse, rTemp)
1f030 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54  ;.      disableT
1f040 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61  erm(pLevel, pSta
1f050 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rt);.    }else{.
1f060 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f070 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20  eAddOp2(v, bRev 
1f080 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52  ? OP_Last : OP_R
1f090 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64  ewind, iCur, add
1f0a0 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rBrk);.    }.   
1f0b0 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20   if( pEnd ){.   
1f0c0 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20     Expr *pX;.   
1f0d0 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45     pX = pEnd->pE
1f0e0 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
1f0f0 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20  t( pX!=0 );.    
1f100 20 20 61 73 73 65 72 74 28 20 28 70 45 6e 64 2d    assert( (pEnd-
1f110 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1f120 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20  VNULL)==0 );.   
1f130 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 6e     testcase( pEn
1f140 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  d->leftCursor!=i
1f150 43 75 72 20 29 3b 20 2f 2a 20 54 72 61 6e 73 69  Cur ); /* Transi
1f160 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  tive constraints
1f170 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
1f180 73 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67  se( pEnd->wtFlag
1f190 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
1f1a0 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64   );.      memEnd
1f1b0 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65  Value = ++pParse
1f1c0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
1f1d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1f1e0 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
1f1f0 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a  , memEndValue);.
1f200 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70        if( pX->op
1f210 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f  ==TK_LT || pX->o
1f220 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20  p==TK_GT ){.    
1f230 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65      testOp = bRe
1f240 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47  v ? OP_Le : OP_G
1f250 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
1f260 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
1f270 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20   bRev ? OP_Lt : 
1f280 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20  OP_Gt;.      }. 
1f290 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
1f2a0 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a  (pLevel, pEnd);.
1f2b0 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72 74 20      }.    start 
1f2c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1f2d0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
1f2e0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52   pLevel->op = bR
1f2f0 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f  ev ? OP_Prev : O
1f300 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76  P_Next;.    pLev
1f310 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
1f320 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
1f330 73 74 61 72 74 3b 0a 20 20 20 20 61 73 73 65 72  start;.    asser
1f340 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30  t( pLevel->p5==0
1f350 20 29 3b 0a 20 20 20 20 69 66 28 20 74 65 73 74   );.    if( test
1f360 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  Op!=OP_Noop ){. 
1f370 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d       iRowidReg =
1f380 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73   iReleaseReg = s
1f390 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
1f3a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1f3b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f3c0 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
1f3d0 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Cur, iRowidReg);
1f3e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f3f0 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
1f400 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69  rse, iCur, -1, i
1f410 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
1f420 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f430 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d 65  p3(v, testOp, me
1f440 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64 72 42  mEndValue, addrB
1f450 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  rk, iRowidReg);.
1f460 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f470 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c  eChangeP5(v, SQL
1f480 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
1f490 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  | SQLITE_JUMPIFN
1f4a0 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ULL);.    }.  }e
1f4b0 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  lse if( pLoop->w
1f4c0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1f4d0 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 2f 2a  NDEXED ){.    /*
1f4e0 20 43 61 73 65 20 34 3a 20 41 20 73 63 61 6e 20   Case 4: A scan 
1f4f0 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a  using an index..
1f500 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1f510 20 20 20 20 20 20 54 68 65 20 57 48 45 52 45 20        The WHERE 
1f520 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61  clause may conta
1f530 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  in zero or more 
1f540 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a  equality .    **
1f550 20 20 20 20 20 20 20 20 20 74 65 72 6d 73 20 28           terms (
1f560 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65  "==" or "IN" ope
1f570 72 61 74 6f 72 73 29 20 74 68 61 74 20 72 65 66  rators) that ref
1f580 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20 20  er to the N.    
1f590 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74 2d  **         left-
1f5a0 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  most columns of 
1f5b0 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d 61  the index. It ma
1f5c0 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20  y also contain. 
1f5d0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e     **         in
1f5e0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1f5f0 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f  ints (>, <, >= o
1f600 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64  r <=) on the ind
1f610 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20  exed.    **     
1f620 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20      column that 
1f630 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
1f640 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69  ows the N equali
1f650 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20  ties. Only .    
1f660 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72  **         the r
1f670 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  ight-most column
1f680 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75   can be an inequ
1f690 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73 74  ality - the rest
1f6a0 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20 20   must.    **    
1f6b0 20 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d       use the "==
1f6c0 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61  " and "IN" opera
1f6d0 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  tors. For exampl
1f6e0 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a  e, if the .    *
1f6f0 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65 78 20  *         index 
1f700 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74  is on (x,y,z), t
1f710 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hen the followin
1f720 67 20 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c  g clauses are al
1f730 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  l .    **       
1f740 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20    optimized:.   
1f750 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1f760 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a        x=5.    **
1f770 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1f780 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20  AND y=10.    ** 
1f790 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1f7a0 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20  ND y<10.    **  
1f7b0 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
1f7c0 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20  D y>5 AND y<10. 
1f7d0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1f7e0 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44   x=5 AND y=5 AND
1f7f0 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20   z<=10.    **.  
1f800 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65    **         The
1f810 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68   z<10 term of th
1f820 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e  e following cann
1f830 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79  ot be used, only
1f840 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f850 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20  the x=5 term:.  
1f860 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1f870 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a         x=5 AND z
1f880 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  <10.    **.    *
1f890 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79 20  *         N may 
1f8a0 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65  be zero if there
1f8b0 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20   are inequality 
1f8c0 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20  constraints..   
1f8d0 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 74   **         If t
1f8e0 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71  here are no ineq
1f8f0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1f900 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74  ts, then N is at
1f910 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f920 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a  least one..    *
1f930 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1f940 20 54 68 69 73 20 63 61 73 65 20 69 73 20 61 6c   This case is al
1f950 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  so used when the
1f960 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20  re are no WHERE 
1f970 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20 20  clause.    **   
1f980 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74        constraint
1f990 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69  s but an index i
1f9a0 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61  s selected anywa
1f9b0 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20  y, in order.    
1f9c0 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f  **         to fo
1f9d0 72 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  rce the output o
1f9e0 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20  rder to conform 
1f9f0 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a  to an ORDER BY..
1fa00 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73 74 61      */  .    sta
1fa10 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
1fa20 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  artOp[] = {.    
1fa30 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20    0,.      0,.  
1fa40 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20      OP_Rewind,  
1fa50 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28           /* 2: (
1fa60 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  !start_constrain
1fa70 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26  ts && startEq &&
1fa80 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20    !bRev) */.    
1fa90 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20    OP_Last,      
1faa0 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73         /* 3: (!s
1fab0 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1fac0 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20   && startEq &&  
1fad0 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20   bRev) */.      
1fae0 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20 20 20 20  OP_SeekGt,      
1faf0 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72       /* 4: (star
1fb00 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
1fb10 26 20 21 73 74 61 72 74 45 71 20 26 26 20 21 62  & !startEq && !b
1fb20 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
1fb30 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20 20 20 20  _SeekLt,        
1fb40 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f     /* 5: (start_
1fb50 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
1fb60 21 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65  !startEq &&  bRe
1fb70 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
1fb80 65 65 6b 47 65 2c 20 20 20 20 20 20 20 20 20 20  eekGe,          
1fb90 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f   /* 6: (start_co
1fba0 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73  nstraints  &&  s
1fbb0 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29  tartEq && !bRev)
1fbc0 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
1fbd0 6b 4c 65 20 20 20 20 20 20 20 20 20 20 20 20 2f  kLe            /
1fbe0 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 7: (start_cons
1fbf0 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61  traints  &&  sta
1fc00 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a  rtEq &&  bRev) *
1fc10 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74 61  /.    };.    sta
1fc20 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e  tic const u8 aEn
1fc30 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  dOp[] = {.      
1fc40 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20  OP_Noop,        
1fc50 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e 64       /* 0: (!end
1fc60 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a 2f  _constraints) */
1fc70 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45 2c  .      OP_IdxGE,
1fc80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
1fc90 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e  : (end_constrain
1fca0 74 73 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a  ts && !bRev) */.
1fcb0 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 20 20        OP_IdxLT  
1fcc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a             /* 2:
1fcd0 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74   (end_constraint
1fce0 73 20 26 26 20 62 52 65 76 29 20 2a 2f 0a 20 20  s && bRev) */.  
1fcf0 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 45 71    };.    int nEq
1fd00 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
1fd10 65 2e 6e 45 71 3b 20 20 2f 2a 20 4e 75 6d 62 65  e.nEq;  /* Numbe
1fd20 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65  r of == or IN te
1fd30 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  rms */.    int i
1fd40 73 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b 20 20  sMinQuery = 0;  
1fd50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1fd60 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  this is an optim
1fd70 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69 6e 28  ized SELECT min(
1fd80 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  x).. */.    int 
1fd90 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20  regBase;        
1fda0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65           /* Base
1fdb0 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   register holdin
1fdc0 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c  g constraint val
1fdd0 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ues */.    int r
1fde0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1fdf0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
1fe00 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20  register */.    
1fe10 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67  WhereTerm *pRang
1fe20 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20  eStart = 0;  /* 
1fe30 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  Inequality const
1fe40 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 73  raint at range s
1fe50 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68 65 72  tart */.    Wher
1fe60 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64  eTerm *pRangeEnd
1fe70 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71   = 0;    /* Ineq
1fe80 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1fe90 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64 20 2a  t at range end *
1fea0 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 45  /.    int startE
1feb0 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
1fec0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61     /* True if ra
1fed0 6e 67 65 20 73 74 61 72 74 20 75 73 65 73 20 3d  nge start uses =
1fee0 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20  =, >= or <= */. 
1fef0 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20 20 20     int endEq;   
1ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff10 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65  /* True if range
1ff20 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d   end uses ==, >=
1ff30 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e   or <= */.    in
1ff40 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  t start_constrai
1ff50 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74  nts;       /* St
1ff60 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20  art of range is 
1ff70 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20  constrained */. 
1ff80 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69     int nConstrai
1ff90 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
1ffa0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e  /* Number of con
1ffb0 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f  straint terms */
1ffc0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
1ffd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ffe0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77    /* The index w
1fff0 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
20000 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43  */.    int iIdxC
20010 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ur;             
20020 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
20030 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69  cursor for the i
20040 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ndex */.    int 
20050 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b 20 20  nExtraReg = 0;  
20060 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
20070 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69  er of extra regi
20080 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a 2f 0a  sters needed */.
20090 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
200a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200b0 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20   /* Instruction 
200c0 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68  opcode */.    ch
200d0 61 72 20 2a 7a 53 74 61 72 74 41 66 66 3b 20 20  ar *zStartAff;  
200e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
200f0 66 69 6e 69 74 79 20 66 6f 72 20 73 74 61 72 74  finity for start
20100 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72   of range constr
20110 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72  aint */.    char
20120 20 2a 7a 45 6e 64 41 66 66 3b 20 20 20 20 20 20   *zEndAff;      
20130 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
20140 6e 69 74 79 20 66 6f 72 20 65 6e 64 20 6f 66 20  nity for end of 
20150 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
20160 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d 20   */..    pIdx = 
20170 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
20180 49 6e 64 65 78 3b 0a 20 20 20 20 69 49 64 78 43  Index;.    iIdxC
20190 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
201a0 78 43 75 72 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  xCur;..    /* If
201b0 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73   this loop satis
201c0 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65  fies a sort orde
201d0 72 20 28 70 4f 72 64 65 72 42 79 29 20 72 65 71  r (pOrderBy) req
201e0 75 65 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a  uest that .    *
201f0 2a 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20  * was passed to 
20200 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
20210 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45   implement a "SE
20220 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22  LECT min(x) ..."
20230 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20   .    ** query, 
20240 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
20250 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20  will only allow 
20260 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20  the loop to run 
20270 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e  for.    ** a sin
20280 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54  gle iteration. T
20290 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
202a0 68 65 20 66 69 72 73 74 20 72 6f 77 20 72 65 74  he first row ret
202b0 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f  urned.    ** sho
202c0 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e  uld not have a N
202d0 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64  ULL value stored
202e0 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75   in 'x'. If colu
202f0 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a  mn 'x' is.    **
20300 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61   the first one a
20310 66 74 65 72 20 74 68 65 20 6e 45 71 20 65 71 75  fter the nEq equ
20320 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
20330 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a  s in the index,.
20340 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75      ** this requ
20350 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61  ires some specia
20360 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20  l handling..    
20370 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e  */.    if( (pWIn
20380 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57  fo->wctrlFlags&W
20390 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
203a0 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57  )!=0.     && (pW
203b0 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 21 3d 30 29  Info->bOBSat!=0)
203c0 0a 20 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e  .     && (pIdx->
203d0 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20 20 20  nColumn>nEq).   
203e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73   ){.      /* ass
203f0 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e  ert( pOrderBy->n
20400 45 78 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20  Expr==1 ); */.  
20410 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
20420 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45  OrderBy->a[0].pE
20430 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  xpr->iColumn==pI
20440 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71  dx->aiColumn[nEq
20450 5d 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 69 73  ] ); */.      is
20460 4d 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a 20 20  MinQuery = 1;.  
20470 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
20480 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
20490 20 46 69 6e 64 20 61 6e 79 20 69 6e 65 71 75 61   Find any inequa
204a0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
204b0 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20 73 74  terms for the st
204c0 61 72 74 20 61 6e 64 20 65 6e 64 20 0a 20 20 20  art and end .   
204d0 20 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65   ** of the range
204e0 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6a 20  . .    */.    j 
204f0 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
20500 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
20510 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
20520 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 53  ){.      pRangeS
20530 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  tart = pLoop->aL
20540 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20  Term[j++];.     
20550 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a   nExtraReg = 1;.
20560 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
20570 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
20580 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29  HERE_TOP_LIMIT )
20590 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e  {.      pRangeEn
205a0 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  d = pLoop->aLTer
205b0 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45  m[j++];.      nE
205c0 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20  xtraReg = 1;.   
205d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72   }..    /* Gener
205e0 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
205f0 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  uate all constra
20600 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20  int terms using 
20610 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20  == or IN.    ** 
20620 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76 61  and store the va
20630 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65  lues of those te
20640 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20  rms in an array 
20650 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20  of registers.   
20660 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
20670 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  regBase..    */.
20680 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f      regBase = co
20690 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72  deAllEqualityTer
206a0 6d 73 28 70 50 61 72 73 65 2c 70 4c 65 76 65 6c  ms(pParse,pLevel
206b0 2c 62 52 65 76 2c 6e 45 78 74 72 61 52 65 67 2c  ,bRev,nExtraReg,
206c0 26 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20  &zStartAff);.   
206d0 20 7a 45 6e 64 41 66 66 20 3d 20 73 71 6c 69 74   zEndAff = sqlit
206e0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
206f0 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 61  StartAff);.    a
20700 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d  ddrNxt = pLevel-
20710 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20 2f  >addrNxt;..    /
20720 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
20730 67 20 61 20 72 65 76 65 72 73 65 20 6f 72 64 65  g a reverse orde
20740 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63  r scan on an asc
20750 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72  ending index, or
20760 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61 72  .    ** a forwar
20770 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20  d order scan on 
20780 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64  a descending ind
20790 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65 20  ex, interchange 
207a0 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61 72  the .    ** star
207b0 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73 20  t and end terms 
207c0 28 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e 64  (pRangeStart and
207d0 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20   pRangeEnd)..   
207e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e 45 71   */.    if( (nEq
207f0 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 26  <pIdx->nColumn &
20800 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61  & bRev==(pIdx->a
20810 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d  SortOrder[nEq]==
20820 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 29 0a  SQLITE_SO_ASC)).
20830 20 20 20 20 20 7c 7c 20 28 62 52 65 76 20 26 26       || (bRev &&
20840 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d   pIdx->nColumn==
20850 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  nEq).    ){.    
20860 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d    SWAP(WhereTerm
20870 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20 70   *, pRangeEnd, p
20880 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20  RangeStart);.   
20890 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65   }..    testcase
208a0 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26  ( pRangeStart &&
208b0 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65   (pRangeStart->e
208c0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45  Operator & WO_LE
208d0 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  )!=0 );.    test
208e0 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
208f0 74 20 26 26 20 28 70 52 61 6e 67 65 53 74 61 72  t && (pRangeStar
20900 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
20910 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20  O_GE)!=0 );.    
20920 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
20930 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e  End && (pRangeEn
20940 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  d->eOperator & W
20950 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20  O_LE)!=0 );.    
20960 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
20970 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e  End && (pRangeEn
20980 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  d->eOperator & W
20990 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20  O_GE)!=0 );.    
209a0 73 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67  startEq = !pRang
209b0 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65  eStart || pRange
209c0 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72  Start->eOperator
209d0 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29   & (WO_LE|WO_GE)
209e0 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20  ;.    endEq =   
209f0 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52  !pRangeEnd || pR
20a00 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
20a10 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
20a20 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f  E);.    start_co
20a30 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e  nstraints = pRan
20a40 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30  geStart || nEq>0
20a50 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74  ;..    /* Seek t
20a60 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  he index cursor 
20a70 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
20a80 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20  the range. */.  
20a90 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
20aa0 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61  nEq;.    if( pRa
20ab0 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ngeStart ){.    
20ac0 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
20ad0 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45   pRangeStart->pE
20ae0 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
20af0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
20b00 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
20b10 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  t, regBase+nEq);
20b20 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e  .      if( (pRan
20b30 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73  geStart->wtFlags
20b40 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
20b50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
20b60 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75  ite3ExprCodeIsNu
20b70 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74  llJump(v, pRight
20b80 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61  , regBase+nEq, a
20b90 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d  ddrNxt);.      }
20ba0 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 61 72  .      if( zStar
20bb0 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  tAff ){.        
20bc0 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  if( sqlite3Compa
20bd0 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68  reAffinity(pRigh
20be0 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71  t, zStartAff[nEq
20bf0 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ])==SQLITE_AFF_N
20c00 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ONE){.          
20c10 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d  /* Since the com
20c20 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65  parison is to be
20c30 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20   performed with 
20c40 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20  no conversions. 
20c50 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c           ** appl
20c60 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ied to the opera
20c70 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66  nds, set the aff
20c80 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74  inity to apply t
20c90 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20  o pRight to .   
20ca0 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45         ** SQLITE
20cb0 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20  _AFF_NONE.  */. 
20cc0 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41           zStartA
20cd0 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
20ce0 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
20cf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
20d00 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
20d10 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
20d20 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74  e(pRight, zStart
20d30 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20  Aff[nEq]) ){.   
20d40 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66         zStartAff
20d50 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
20d60 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
20d70 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20   }.      }  .   
20d80 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b     nConstraint++
20d90 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
20da0 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77  ( pRangeStart->w
20db0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
20dc0 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c  RTUAL );.    }el
20dd0 73 65 20 69 66 28 20 69 73 4d 69 6e 51 75 65 72  se if( isMinQuer
20de0 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  y ){.      sqlit
20df0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20e00 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42  OP_Null, 0, regB
20e10 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
20e20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20  nConstraint++;. 
20e30 20 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 30       startEq = 0
20e40 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f  ;.      start_co
20e50 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20  nstraints = 1;. 
20e60 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70     }.    codeApp
20e70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  lyAffinity(pPars
20e80 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  e, regBase, nCon
20e90 73 74 72 61 69 6e 74 2c 20 7a 53 74 61 72 74 41  straint, zStartA
20ea0 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53  ff);.    op = aS
20eb0 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f  tartOp[(start_co
20ec0 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20  nstraints<<2) + 
20ed0 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62  (startEq<<1) + b
20ee0 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  Rev];.    assert
20ef0 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 74  ( op!=0 );.    t
20f00 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
20f10 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 74 65  Rewind );.    te
20f20 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c  stcase( op==OP_L
20f30 61 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ast );.    testc
20f40 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
20f50 47 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  Gt );.    testca
20f60 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47  se( op==OP_SeekG
20f70 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  e );.    testcas
20f80 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65  e( op==OP_SeekLe
20f90 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
20fa0 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20  ( op==OP_SeekLt 
20fb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
20fc0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f  beAddOp4Int(v, o
20fd0 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72  p, iIdxCur, addr
20fe0 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  Nxt, regBase, nC
20ff0 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 0a 20 20 20  onstraint);..   
21000 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c   /* Load the val
21010 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75  ue for the inequ
21020 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
21030 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
21040 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  he.    ** range 
21050 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f  (if any)..    */
21060 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74  .    nConstraint
21070 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20   = nEq;.    if( 
21080 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20  pRangeEnd ){.   
21090 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
210a0 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78  = pRangeEnd->pEx
210b0 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
210c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
210d0 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
210e0 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29   regBase+nEq, 1)
210f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
21100 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
21110 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
21120 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nEq);.      if( 
21130 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c  (pRangeEnd->wtFl
21140 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
21150 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
21160 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
21170 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69  sNullJump(v, pRi
21180 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
21190 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  , addrNxt);.    
211a0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45    }.      if( zE
211b0 6e 64 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20  ndAff ){.       
211c0 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
211d0 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
211e0 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d  ht, zEndAff[nEq]
211f0 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )==SQLITE_AFF_NO
21200 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  NE){.          /
21210 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70  * Since the comp
21220 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20  arison is to be 
21230 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e  performed with n
21240 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20  o conversions.  
21250 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69          ** appli
21260 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e  ed to the operan
21270 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69  ds, set the affi
21280 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f  nity to apply to
21290 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20   pRight to .    
212a0 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
212b0 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20  AFF_NONE.  */.  
212c0 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b          zEndAff[
212d0 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
212e0 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
212f0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  }.        if( sq
21300 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
21310 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
21320 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e  Right, zEndAff[n
21330 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Eq]) ){.        
21340 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d    zEndAff[nEq] =
21350 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
21360 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21370 20 20 7d 20 20 0a 20 20 20 20 20 20 63 6f 64 65    }  .      code
21380 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50  ApplyAffinity(pP
21390 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
213a0 45 71 2b 31 2c 20 7a 45 6e 64 41 66 66 29 3b 0a  Eq+1, zEndAff);.
213b0 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
213c0 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t++;.      testc
213d0 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e  ase( pRangeEnd->
213e0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
213f0 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d 0a  IRTUAL );.    }.
21400 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
21410 65 28 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29  e(db, zStartAff)
21420 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
21430 72 65 65 28 64 62 2c 20 7a 45 6e 64 41 66 66 29  ree(db, zEndAff)
21440 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66  ;..    /* Top of
21450 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a   the loop body *
21460 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  /.    pLevel->p2
21470 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
21480 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20  rrentAddr(v);.. 
21490 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
214a0 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  he index cursor 
214b0 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  is past the end 
214c0 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f  of the range. */
214d0 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70  .    op = aEndOp
214e0 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 6e  [(pRangeEnd || n
214f0 45 71 29 20 2a 20 28 31 20 2b 20 62 52 65 76 29  Eq) * (1 + bRev)
21500 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ];.    testcase(
21510 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a   op==OP_Noop );.
21520 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
21530 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20  ==OP_IdxGE );.  
21540 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
21550 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20  OP_IdxLT );.    
21560 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  if( op!=OP_Noop 
21570 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
21580 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
21590 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64   op, iIdxCur, ad
215a0 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20  drNxt, regBase, 
215b0 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
215c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
215d0 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45 71  hangeP5(v, endEq
215e0 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20 20  !=bRev ?1:0);.  
215f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
21600 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c  here are inequal
21610 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
21620 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
21630 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20  value.    ** of 
21640 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
21650 20 74 68 61 74 20 74 68 65 20 69 6e 65 71 75 61   that the inequa
21660 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e 73 20 69  lity contrains i
21670 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20  s not NULL..    
21680 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75 6d  ** If it is, jum
21690 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74  p to the next it
216a0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
216b0 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
216c0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
216d0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
216e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
216f0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
21700 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
21710 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
21720 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
21730 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
21740 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f   );.    if( (pLo
21750 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  op->wsFlags & (W
21760 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57  HERE_BTM_LIMIT|W
21770 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29  HERE_TOP_LIMIT))
21780 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
21790 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
217a0 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64  , OP_Column, iId
217b0 78 43 75 72 2c 20 6e 45 71 2c 20 72 31 29 3b 0a  xCur, nEq, r1);.
217c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
217d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
217e0 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64 72 43 6f  Null, r1, addrCo
217f0 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  nt);.    }.    s
21800 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
21810 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
21820 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74  ;..    /* Seek t
21830 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c  he table cursor,
21840 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
21850 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
21860 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74  pLevel, pRangeSt
21870 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61 62 6c  art);.    disabl
21880 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52  eTerm(pLevel, pR
21890 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 69 66  angeEnd);.    if
218a0 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a  ( !omitTable ){.
218b0 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 20        iRowidReg 
218c0 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20  = iReleaseReg = 
218d0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
218e0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
218f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21900 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69  p2(v, OP_IdxRowi
21910 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f 77  d, iIdxCur, iRow
21920 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  idReg);.      sq
21930 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
21940 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72  ore(pParse, iCur
21950 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29  , -1, iRowidReg)
21960 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21970 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21980 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77  Seek, iCur, iRow
21990 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65 66 65  idReg);  /* Defe
219a0 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20  rred seek */.   
219b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72   }..    /* Recor
219c0 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  d the instructio
219d0 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e  n used to termin
219e0 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69  ate the loop. Di
219f0 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48  sable .    ** WH
21a00 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
21a10 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20   made redundant 
21a20 62 79 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e  by the index ran
21a30 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a  ge scan..    */.
21a40 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
21a50 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
21a60 4e 45 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 70  NEROW ){.      p
21a70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
21a80 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  oop;.    }else i
21a90 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
21aa0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
21ab0 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65  _Prev;.    }else
21ac0 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
21ad0 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  op = OP_Next;.  
21ae0 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
21af0 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  p1 = iIdxCur;.  
21b00 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
21b10 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
21b20 4e 53 54 52 41 49 4e 54 29 3d 3d 30 20 29 7b 0a  NSTRAINT)==0 ){.
21b30 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35        pLevel->p5
21b40 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54   = SQLITE_STMTST
21b50 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
21b60 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EP;.    }else{. 
21b70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
21b80 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20  vel->p5==0 );.  
21b90 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66    }.  }else..#if
21ba0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
21bb0 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
21bc0 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  .  if( pLoop->ws
21bd0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
21be0 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a  LTI_OR ){.    /*
21bf0 20 43 61 73 65 20 35 3a 20 20 54 77 6f 20 6f 72   Case 5:  Two or
21c00 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79   more separately
21c10 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
21c20 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20  onnected by OR. 
21c30 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61     **.    ** Exa
21c40 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
21c50 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
21c60 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a  LE t1(a,b,c,d);.
21c70 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
21c80 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
21c90 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
21ca0 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74  TE INDEX i2 ON t
21cb0 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43  1(b);.    **   C
21cc0 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f  REATE INDEX i3 O
21cd0 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a  N t1(c);.    **.
21ce0 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
21cf0 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
21d00 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63  a=5 OR b=7 OR (c
21d10 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20  =11 AND d=13).  
21d20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74    **.    ** In t
21d30 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72  he example, ther
21d40 65 20 61 72 65 20 74 68 72 65 65 20 69 6e 64 65  e are three inde
21d50 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63  xed terms connec
21d60 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a  ted by OR..    *
21d70 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65  * The top of the
21d80 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65   loop looks like
21d90 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
21da0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75    **          Nu
21db0 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20  ll       1      
21dc0 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f            # Zero
21dd0 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72   the rowset in r
21de0 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20  eg 1.    **.    
21df0 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63  ** Then, for eac
21e00 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20  h indexed term, 
21e10 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54  the following. T
21e20 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a  he arguments to.
21e30 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73      ** RowSetTes
21e40 74 20 61 72 65 20 73 75 63 68 20 74 68 61 74 20  t are such that 
21e50 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65  the rowid of the
21e60 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20   current row is 
21e70 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20  inserted.    ** 
21e80 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e  into the RowSet.
21e90 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   If it is alread
21ea0 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72  y present, contr
21eb0 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20  ol skips the.   
21ec0 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65   ** Gosub opcode
21ed0 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69   and jumps strai
21ee0 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20  ght to the code 
21ef0 67 65 6e 65 72 61 74 65 64 20 62 79 20 57 68 65  generated by Whe
21f00 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a  reEnd()..    **.
21f10 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71      **        sq
21f20 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
21f30 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20  <term>).    **  
21f40 20 20 20 20 20 20 20 20 52 6f 77 53 65 74 54 65          RowSetTe
21f50 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
21f60 20 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77      # Insert row
21f70 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20  id into rowset. 
21f80 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47     **          G
21f90 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a 20 20  osub      2 A.  
21fa0 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69    **        sqli
21fb0 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20  te3WhereEnd().  
21fc0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c    **.    ** Foll
21fd0 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c  owing the above,
21fe0 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61   code to termina
21ff0 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62  te the loop. Lab
22000 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65 74  el A, the target
22010 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47  .    ** of the G
22020 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70  osub above, jump
22030 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63  s to the instruc
22040 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72  tion right after
22050 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a   the Goto..    *
22060 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
22070 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20    Null       1  
22080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
22090 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20  Zero the rowset 
220a0 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20  in reg 1.    ** 
220b0 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20           Goto   
220c0 20 20 20 20 42 20 20 20 20 20 20 20 20 20 20 20      B           
220d0 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20       # The loop 
220e0 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20  is finished..   
220f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
22100 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20   A: <loop body> 
22110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22120 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77  # Return data, w
22130 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a  hatever..    **.
22140 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
22150 52 65 74 75 72 6e 20 20 20 20 20 32 20 20 20 20  Return     2    
22160 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4a 75              # Ju
22170 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47  mp back to the G
22180 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20  osub.    **.    
22190 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74  **       B: <aft
221a0 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20  er the loop>.   
221b0 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57   **.    */.    W
221c0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57  hereClause *pOrW
221d0 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d  c;    /* The OR-
221e0 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75  clause broken ou
221f0 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20  t into subterms 
22200 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  */.    SrcList *
22210 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a  pOrTab;       /*
22220 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65   Shortened table
22230 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75   list or OR-clau
22240 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  se generation */
22250 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76  .    Index *pCov
22260 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
22270 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63    /* Potential c
22280 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f  overing index (o
22290 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69  r NULL) */.    i
222a0 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61  nt iCovCur = pPa
222b0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a  rse->nTab++;  /*
222c0 20 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   Cursor used for
222d0 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66   index scans (if
222e0 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e   any) */..    in
222f0 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  t regReturn = ++
22300 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20  pParse->nMem;   
22310 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
22320 74 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50  ter used with OP
22330 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e  _Gosub */.    in
22340 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b  t regRowset = 0;
22350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22360 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
22370 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f  ter for RowSet o
22380 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74  bject */.    int
22390 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20   regRowid = 0;  
223a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223b0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
223c0 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64  er holding rowid
223d0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f   */.    int iLoo
223e0 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56  pBody = sqlite3V
223f0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
22400 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f    /* Start of lo
22410 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69  op body */.    i
22420 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20  nt iRetInit;    
22430 20 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 2f 2a 20 41 64 64 72           /* Addr
22450 65 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e  ess of regReturn
22460 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74   init */.    int
22470 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d   untestedTerms =
22480 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
22490 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f  /* Some terms no
224a0 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73  t completely tes
224b0 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ted */.    int i
224c0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
224d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
224e0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
224f0 0a 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64 45  .    Expr *pAndE
22500 78 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xpr = 0;        
22510 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e          /* An ".
22520 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70  . AND (...)" exp
22530 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a 20  ression */.   . 
22540 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70     pTerm = pLoop
22550 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20  ->aLTerm[0];.   
22560 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
22570 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
22580 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
22590 72 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20 20 20  r & WO_OR );.   
225a0 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
225b0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
225c0 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20  ORINFO)!=0 );.  
225d0 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65 72 6d    pOrWc = &pTerm
225e0 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b  ->u.pOrInfo->wc;
225f0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
22600 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20  = OP_Return;.   
22610 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65   pLevel->p1 = re
22620 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a  gReturn;..    /*
22630 20 53 65 74 20 75 70 20 61 20 6e 65 77 20 53 72   Set up a new Sr
22640 63 4c 69 73 74 20 69 6e 20 70 4f 72 54 61 62 20  cList in pOrTab 
22650 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
22660 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e  able being scann
22670 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69  ed.    ** by thi
22680 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b  s loop in the a[
22690 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20  0] slot and all 
226a0 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73 20  notReady tables 
226b0 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e  in a[1..] slots.
226c0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 65 63  .    ** This bec
226d0 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69 73 74  omes the SrcList
226e0 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69 76   in the recursiv
226f0 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
22700 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20  3WhereBegin().. 
22710 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57     */.    if( pW
22720 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29  Info->nLevel>1 )
22730 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74  {.      int nNot
22740 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
22750 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
22760 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61 64 79  mber of notReady
22770 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20   tables */.     
22780 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
22790 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20  item *origSrc;  
227a0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c     /* Original l
227b0 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
227c0 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61 64 79  .      nNotReady
227d0 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   = pWInfo->nLeve
227e0 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a  l - iLevel - 1;.
227f0 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 73        pOrTab = s
22800 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63  qlite3StackAlloc
22810 52 61 77 28 64 62 2c 0a 20 20 20 20 20 20 20 20  Raw(db,.        
22820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22830 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f 72 54      sizeof(*pOrT
22840 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79 2a 73  ab)+ nNotReady*s
22850 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b  izeof(pOrTab->a[
22860 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  0]));.      if( 
22870 70 4f 72 54 61 62 3d 3d 30 20 29 20 72 65 74 75  pOrTab==0 ) retu
22880 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20 20 20  rn notReady;.   
22890 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f     pOrTab->nAllo
228a0 63 20 3d 20 28 75 38 29 28 6e 4e 6f 74 52 65 61  c = (u8)(nNotRea
228b0 64 79 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 70  dy + 1);.      p
228c0 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70 4f  OrTab->nSrc = pO
228d0 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20  rTab->nAlloc;.  
228e0 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 72 54 61      memcpy(pOrTa
228f0 62 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c 20  b->a, pTabItem, 
22900 73 69 7a 65 6f 66 28 2a 70 54 61 62 49 74 65 6d  sizeof(*pTabItem
22910 29 29 3b 0a 20 20 20 20 20 20 6f 72 69 67 53 72  ));.      origSr
22920 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  c = pWInfo->pTab
22930 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 66  List->a;.      f
22940 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52  or(k=1; k<=nNotR
22950 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  eady; k++){.    
22960 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4f 72 54      memcpy(&pOrT
22970 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67 53  ab->a[k], &origS
22980 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72  rc[pLevel[k].iFr
22990 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72 54  om], sizeof(pOrT
229a0 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20 20  ab->a[k]));.    
229b0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
229c0 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 70 57       pOrTab = pW
229d0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
229e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e      }..    /* In
229f0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72 6f 77  itialize the row
22a00 73 65 74 20 72 65 67 69 73 74 65 72 20 74 6f 20  set register to 
22a10 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e  contain NULL. An
22a20 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20 20   SQL NULL is .  
22a30 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20    ** equivalent 
22a40 74 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f 77 73  to an empty rows
22a50 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  et..    **.    *
22a60 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a  * Also initializ
22a70 65 20 72 65 67 52 65 74 75 72 6e 20 74 6f 20 63  e regReturn to c
22a80 6f 6e 74 61 69 6e 20 74 68 65 20 61 64 64 72 65  ontain the addre
22a90 73 73 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75  ss of the instru
22aa0 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d  ction .    ** im
22ab0 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
22ac0 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 74 75 72  ing the OP_Retur
22ad0 6e 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  n at the bottom 
22ae0 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69  of the loop. Thi
22af0 73 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75  s.    ** is requ
22b00 69 72 65 64 20 69 6e 20 61 20 66 65 77 20 6f 62  ired in a few ob
22b10 73 63 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20  scure LEFT JOIN 
22b20 63 61 73 65 73 20 77 68 65 72 65 20 63 6f 6e 74  cases where cont
22b30 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a  rol jumps.    **
22b40 20 6f 76 65 72 20 74 68 65 20 74 6f 70 20 6f 66   over the top of
22b50 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74   the loop into t
22b60 68 65 20 62 6f 64 79 20 6f 66 20 69 74 2e 20 49  he body of it. I
22b70 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
22b80 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 20  .    ** correct 
22b90 72 65 73 70 6f 6e 73 65 20 66 6f 72 20 74 68 65  response for the
22ba0 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64   end-of-loop cod
22bb0 65 20 28 74 68 65 20 4f 50 5f 52 65 74 75 72 6e  e (the OP_Return
22bc0 29 20 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  ) is to .    ** 
22bd0 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
22be0 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
22bf0 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e  tion, just as an
22c00 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20 69 66   OP_Next does if
22c10 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f  .    ** called o
22c20 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a  n an uninitializ
22c30 65 64 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a  ed cursor..    *
22c40 2f 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66  /.    if( (pWInf
22c50 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
22c60 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53  WHERE_DUPLICATES
22c70 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _OK)==0 ){.     
22c80 20 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70   regRowset = ++p
22c90 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
22ca0 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b     regRowid = ++
22cb0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
22cc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22cd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
22ce0 2c 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b  , 0, regRowset);
22cf0 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49  .    }.    iRetI
22d00 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nit = sqlite3Vdb
22d10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
22d20 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74  teger, 0, regRet
22d30 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  urn);..    /* If
22d40 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48   the original WH
22d50 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 7a 20  ERE clause is z 
22d60 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 28 78  of the form:  (x
22d70 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20  1 OR x2 OR ...) 
22d80 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54 68 65  AND y.    ** The
22d90 6e 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d  n for every term
22da0 20 78 4e 2c 20 65 76 61 6c 75 61 74 65 20 61 73   xN, evaluate as
22db0 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
22dc0 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20 20  on: xN AND z.   
22dd0 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 74 65   ** That way, te
22de0 72 6d 73 20 69 6e 20 79 20 74 68 61 74 20 61 72  rms in y that ar
22df0 65 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f 20  e factored into 
22e00 74 68 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20  the disjunction 
22e10 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70  will.    ** be p
22e20 69 63 6b 65 64 20 75 70 20 62 79 20 74 68 65 20  icked up by the 
22e30 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20  recursive calls 
22e40 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
22e50 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20 20  egin() below..  
22e60 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74 75    **.    ** Actu
22e70 61 6c 6c 79 2c 20 65 61 63 68 20 73 75 62 65 78  ally, each subex
22e80 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 76  pression is conv
22e90 65 72 74 65 64 20 74 6f 20 22 78 4e 20 41 4e 44  erted to "xN AND
22ea0 20 77 22 20 77 68 65 72 65 20 77 20 69 73 0a 20   w" where w is. 
22eb0 20 20 20 2a 2a 20 74 68 65 20 22 69 6e 74 65 72     ** the "inter
22ec0 65 73 74 69 6e 67 22 20 74 65 72 6d 73 20 6f 66  esting" terms of
22ed0 20 7a 20 2d 20 74 65 72 6d 73 20 74 68 61 74 20   z - terms that 
22ee0 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74  did not originat
22ef0 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  e in the.    ** 
22f00 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
22f10 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  se of a LEFT JOI
22f20 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20 74 68 61  N, and terms tha
22f30 74 20 61 72 65 20 75 73 61 62 6c 65 20 61 73 20  t are usable as 
22f40 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  .    ** indices.
22f50 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
22f60 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
22f70 20 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70 6c 69   also only appli
22f80 65 73 20 69 66 20 74 68 65 20 28 78 31 20 4f 52  es if the (x1 OR
22f90 20 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65 72 6d   x2 OR ...) term
22fa0 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63  .    ** is not c
22fb0 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
22fc0 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c  ON clause of a L
22fd0 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a  EFT JOIN..    **
22fe0 20 53 65 65 20 74 69 63 6b 65 74 20 68 74 74 70   See ticket http
22ff0 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72  ://www.sqlite.or
23000 67 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33 36 39  g/src/info/f2369
23010 33 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20 20 20  304e4.    */.   
23020 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e   if( pWC->nTerm>
23030 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  1 ){.      int i
23040 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  Term;.      for(
23050 69 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70  iTerm=0; iTerm<p
23060 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d  WC->nTerm; iTerm
23070 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  ++){.        Exp
23080 72 20 2a 70 45 78 70 72 20 3d 20 70 57 43 2d 3e  r *pExpr = pWC->
23090 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a  a[iTerm].pExpr;.
230a0 20 20 20 20 20 20 20 20 69 66 28 20 26 70 57 43          if( &pWC
230b0 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d 3d 20 70 54  ->a[iTerm] == pT
230c0 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  erm ) continue;.
230d0 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72          if( Expr
230e0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
230f0 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
23100 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
23110 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61 5b 69      if( pWC->a[i
23120 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20  Term].wtFlags & 
23130 28 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 20 29 20  (TERM_ORINFO) ) 
23140 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
23150 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b 69 54    if( (pWC->a[iT
23160 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20 26  erm].eOperator &
23170 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63 6f   WO_ALL)==0 ) co
23180 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
23190 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
231a0 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
231b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 41  , 0);.        pA
231c0 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ndExpr = sqlite3
231d0 45 78 70 72 41 6e 64 28 64 62 2c 20 70 41 6e 64  ExprAnd(db, pAnd
231e0 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20  Expr, pExpr);.  
231f0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23200 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20  pAndExpr ){.    
23210 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73      pAndExpr = s
23220 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
23230 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 70  se, TK_AND, 0, p
23240 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  AndExpr, 0);.   
23250 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
23260 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72  for(ii=0; ii<pOr
23270 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29  Wc->nTerm; ii++)
23280 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
23290 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f  m *pOrTerm = &pO
232a0 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20  rWc->a[ii];.    
232b0 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c    if( pOrTerm->l
232c0 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
232d0 7c 7c 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  || (pOrTerm->eOp
232e0 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29  erator & WO_AND)
232f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57  !=0 ){.        W
23300 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57 49  hereInfo *pSubWI
23310 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nfo;          /*
23320 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65   Info for single
23330 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f   OR-term scan */
23340 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
23350 4f 72 45 78 70 72 20 3d 20 70 4f 72 54 65 72 6d  OrExpr = pOrTerm
23360 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
23370 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 26 26   if( pAndExpr &&
23380 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
23390 79 28 70 4f 72 45 78 70 72 2c 20 45 50 5f 46 72  y(pOrExpr, EP_Fr
233a0 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
233b0 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70       pAndExpr->p
233c0 4c 65 66 74 20 3d 20 70 4f 72 45 78 70 72 3b 0a  Left = pOrExpr;.
233d0 20 20 20 20 20 20 20 20 20 20 70 4f 72 45 78 70            pOrExp
233e0 72 20 3d 20 70 41 6e 64 45 78 70 72 3b 0a 20 20  r = pAndExpr;.  
233f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23400 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
23410 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68  table entries th
23420 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f  at match term pO
23430 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20  rTerm. */.      
23440 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73 71    pSubWInfo = sq
23450 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
23460 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20  pParse, pOrTab, 
23470 70 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20  pOrExpr, 0, 0,. 
23480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23490 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f 4d 49         WHERE_OMI
234a0 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 20 7c 20 57  T_OPEN_CLOSE | W
234b0 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 7c 0a  HERE_AND_ONLY |.
234c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234d0 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 46 4f          WHERE_FO
234e0 52 43 45 5f 54 41 42 4c 45 20 7c 20 57 48 45 52  RCE_TABLE | WHER
234f0 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 2c  E_ONETABLE_ONLY,
23500 20 69 43 6f 76 43 75 72 29 3b 0a 20 20 20 20 20   iCovCur);.     
23510 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 57     assert( pSubW
23520 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Info || pParse->
23530 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
23540 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
23550 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66      if( pSubWInf
23560 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57  o ){.          W
23570 68 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f  hereLoop *pSubLo
23580 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78  op;.          ex
23590 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20  plainOneScan(.  
235a0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
235b0 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75  se, pOrTab, &pSu
235c0 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c  bWInfo->a[0], iL
235d0 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46  evel, pLevel->iF
235e0 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20  rom, 0.         
235f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
23600 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
23610 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55  Flags & WHERE_DU
23620 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20  PLICATES_OK)==0 
23630 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
23640 6e 74 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d  nt iSet = ((ii==
23650 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f  pOrWc->nTerm-1)?
23660 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20  -1:ii);.        
23670 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20      int r;.     
23680 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74         r = sqlit
23690 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
236a0 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  umn(pParse, pTab
236b0 49 74 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20  Item->pTab, -1, 
236c0 69 43 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20  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 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20  regRowid, 0);.  
23700 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23710 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
23720 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c  , OP_RowSetTest,
23730 20 72 65 67 52 6f 77 73 65 74 2c 0a 20 20 20 20   regRowset,.    
23740 20 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 73 71 6c               sql
23760 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
23770 64 64 72 28 76 29 2b 32 2c 20 72 2c 20 69 53 65  ddr(v)+2, r, iSe
23780 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
23790 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
237a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
237b0 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75  P_Gosub, regRetu
237c0 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a  rn, iLoopBody);.
237d0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
237e0 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74  e pSubWInfo->unt
237f0 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20  estedTerms flag 
23800 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
23810 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20  OR term.        
23820 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f    ** contained o
23830 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74  ne or more AND t
23840 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65  erm from a notRe
23850 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a  ady table.  The.
23860 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72            ** ter
23870 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52  ms from the notR
23880 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64  eady table could
23890 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 61   not be tested a
238a0 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20  nd will.        
238b0 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20    ** need to be 
238c0 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20  tested later..  
238d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
238e0 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e       if( pSubWIn
238f0 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
23900 73 20 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d  s ) untestedTerm
23910 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  s = 1;..        
23920 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    /* If all of t
23930 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  he OR-connected 
23940 74 65 72 6d 73 20 61 72 65 20 6f 70 74 69 6d 69  terms are optimi
23950 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61  zed using the sa
23960 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  me.          ** 
23970 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 65 20 69  index, and the i
23980 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 20 75  ndex is opened u
23990 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 75  sing the same cu
239a0 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20  rsor number.    
239b0 20 20 20 20 20 20 2a 2a 20 62 79 20 65 61 63 68        ** by each
239c0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
239d0 57 68 65 72 65 42 65 67 69 6e 28 29 20 6d 61 64  WhereBegin() mad
239e0 65 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20  e by this loop, 
239f0 69 74 20 6d 61 79 0a 20 20 20 20 20 20 20 20 20  it may.         
23a00 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20   ** be possible 
23a10 74 6f 20 75 73 65 20 74 68 61 74 20 69 6e 64 65  to use that inde
23a20 78 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20  x as a covering 
23a30 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20  index..         
23a40 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   **.          **
23a50 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   If the call to 
23a60 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
23a70 6e 28 29 20 61 62 6f 76 65 20 72 65 73 75 6c 74  n() above result
23a80 65 64 20 69 6e 20 61 20 73 63 61 6e 20 74 68 61  ed in a scan tha
23a90 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
23aa0 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e  ses an index, an
23ab0 64 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72  d this is either
23ac0 20 74 68 65 20 66 69 72 73 74 20 4f 52 2d 63 6f   the first OR-co
23ad0 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a 20 20 20  nnected term.   
23ae0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
23af0 73 65 64 20 6f 72 20 74 68 65 20 69 6e 64 65 78  sed or the index
23b00 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
23b10 74 68 61 74 20 75 73 65 64 20 62 79 20 61 6c 6c  that used by all
23b20 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
23b30 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65      ** terms, se
23b40 74 20 70 43 6f 76 20 74 6f 20 74 68 65 20 63 61  t pCov to the ca
23b50 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67  ndidate covering
23b60 20 69 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73   index. Otherwis
23b70 65 2c 20 73 65 74 20 0a 20 20 20 20 20 20 20 20  e, set .        
23b80 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c    ** pCov to NUL
23b90 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  L to indicate th
23ba0 61 74 20 6e 6f 20 63 61 6e 64 69 64 61 74 65 20  at no candidate 
23bb0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 77  covering index w
23bc0 69 6c 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ill .          *
23bd0 2a 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a  * be available..
23be0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
23bf0 20 20 20 20 20 20 20 70 53 75 62 4c 6f 6f 70 20         pSubLoop 
23c00 3d 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30  = pSubWInfo->a[0
23c10 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  ].pWLoop;.      
23c20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 53 75      assert( (pSu
23c30 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  bLoop->wsFlags &
23c40 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
23c50 58 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  X)==0 );.       
23c60 20 20 20 69 66 28 20 28 70 53 75 62 4c 6f 6f 70     if( (pSubLoop
23c70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
23c80 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20  E_INDEXED)!=0.  
23c90 20 20 20 20 20 20 20 20 20 26 26 20 28 69 69 3d           && (ii=
23ca0 3d 30 20 7c 7c 20 70 53 75 62 4c 6f 6f 70 2d 3e  =0 || pSubLoop->
23cb0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3d 3d  u.btree.pIndex==
23cc0 70 43 6f 76 29 0a 20 20 20 20 20 20 20 20 20 20  pCov).          
23cd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
23ce0 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f  ssert( pSubWInfo
23cf0 2d 3e 61 5b 30 5d 2e 69 49 64 78 43 75 72 3d 3d  ->a[0].iIdxCur==
23d00 69 43 6f 76 43 75 72 20 29 3b 0a 20 20 20 20 20  iCovCur );.     
23d10 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 70 53         pCov = pS
23d20 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  ubLoop->u.btree.
23d30 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20  pIndex;.        
23d40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23d50 20 20 20 20 20 70 43 6f 76 20 3d 20 30 3b 0a 20       pCov = 0;. 
23d60 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
23d70 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 20        /* Finish 
23d80 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68  the loop through
23d90 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74   table entries t
23da0 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70  hat match term p
23db0 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  OrTerm. */.     
23dc0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
23dd0 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f 29 3b  eEnd(pSubWInfo);
23de0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23df0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65   }.    }.    pLe
23e00 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 20 3d  vel->u.pCovidx =
23e10 20 70 43 6f 76 3b 0a 20 20 20 20 69 66 28 20 70   pCov;.    if( p
23e20 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d 3e 69 49  Cov ) pLevel->iI
23e30 64 78 43 75 72 20 3d 20 69 43 6f 76 43 75 72 3b  dxCur = iCovCur;
23e40 0a 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70  .    if( pAndExp
23e50 72 20 29 7b 0a 20 20 20 20 20 20 70 41 6e 64 45  r ){.      pAndE
23e60 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  xpr->pLeft = 0;.
23e70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23e80 72 44 65 6c 65 74 65 28 64 62 2c 20 70 41 6e 64  rDelete(db, pAnd
23e90 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Expr);.    }.   
23ea0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
23eb0 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69 74  geP1(v, iRetInit
23ec0 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
23ed0 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20  rentAddr(v));.  
23ee0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23ef0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
23f00 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  0, pLevel->addrB
23f10 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rk);.    sqlite3
23f20 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
23f30 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a  (v, iLoopBody);.
23f40 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
23f50 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69  >nLevel>1 ) sqli
23f60 74 65 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c  te3StackFree(db,
23f70 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20 69 66   pOrTab);.    if
23f80 28 20 21 75 6e 74 65 73 74 65 64 54 65 72 6d 73  ( !untestedTerms
23f90 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70   ) disableTerm(p
23fa0 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20  Level, pTerm);. 
23fb0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
23fc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
23fd0 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
23fe0 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  .  {.    /* Case
23ff0 20 36 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f   6:  There is no
24000 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20   usable index.  
24010 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d  We must do a com
24020 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  plete.    **    
24030 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68        scan of th
24040 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a  e entire table..
24050 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69      */.    stati
24060 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 65 70  c const u8 aStep
24070 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c 20  [] = { OP_Next, 
24080 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20 73  OP_Prev };.    s
24090 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
240a0 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52  Start[] = { OP_R
240b0 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20 7d  ewind, OP_Last }
240c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 52  ;.    assert( bR
240d0 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d 31  ev==0 || bRev==1
240e0 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   );.    pLevel->
240f0 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d  op = aStep[bRev]
24100 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
24110 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65   = iCur;.    pLe
24120 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71  vel->p2 = 1 + sq
24130 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24140 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76 5d 2c  v, aStart[bRev],
24150 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b   iCur, addrBrk);
24160 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20  .    pLevel->p5 
24170 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  = SQLITE_STMTSTA
24180 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
24190 50 3b 0a 20 20 7d 0a 20 20 6e 65 77 4e 6f 74 52  P;.  }.  newNotR
241a0 65 61 64 79 20 3d 20 6e 6f 74 52 65 61 64 79 20  eady = notReady 
241b0 26 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e  & ~getMask(&pWIn
241c0 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43  fo->sMaskSet, iC
241d0 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  ur);..  /* Inser
241e0 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65  t code to test e
241f0 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69  very subexpressi
24200 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63  on that can be c
24210 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63  ompletely.  ** c
24220 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68  omputed using th
24230 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66  e current set of
24240 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
24250 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
24260 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , j=pWC->nTerm; 
24270 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b  j>0; j--, pTerm+
24280 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
24290 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
242a0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
242b0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
242c0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
242d0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
242e0 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
242f0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
24300 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
24310 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
24320 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
24330 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
24340 72 65 71 41 6c 6c 20 26 20 6e 65 77 4e 6f 74 52  reqAll & newNotR
24350 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20  eady)!=0 ){.    
24360 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e    testcase( pWIn
24370 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
24380 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  s==0.           
24390 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
243a0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
243b0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
243c0 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57  )!=0 );.      pW
243d0 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
243e0 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 63  rms = 1;.      c
243f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
24400 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70     pE = pTerm->p
24410 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
24420 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 69  ( pE!=0 );.    i
24430 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
24440 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61 73  Join && !ExprHas
24450 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
24460 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
24470 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
24480 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
24490 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
244a0 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20  , pE, addrCont, 
244b0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
244c0 4c 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77  L);.    pTerm->w
244d0 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
244e0 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ODED;.  }..  /* 
244f0 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74  Insert code to t
24500 65 73 74 20 66 6f 72 20 69 6d 70 6c 69 65 64 20  est for implied 
24510 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 61 73 65  constraints base
24520 64 20 6f 6e 20 74 72 61 6e 73 69 74 69 76 69 74  d on transitivit
24530 79 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 22 3d  y.  ** of the "=
24540 3d 22 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  =" operator..  *
24550 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 20  *.  ** Example: 
24560 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  If the WHERE cla
24570 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 22 74 31  use contains "t1
24580 2e 61 3d 74 32 2e 62 22 20 61 6e 64 20 22 74 32  .a=t2.b" and "t2
24590 2e 62 3d 31 32 33 22 0a 20 20 2a 2a 20 61 6e 64  .b=123".  ** and
245a0 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 74   we are coding t
245b0 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 74  he t1 loop and t
245c0 68 65 20 74 32 20 6c 6f 6f 70 20 68 61 73 20 6e  he t2 loop has n
245d0 6f 74 20 79 65 74 20 63 6f 64 65 64 2c 0a 20 20  ot yet coded,.  
245e0 2a 2a 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f  ** then we canno
245f0 74 20 75 73 65 20 74 68 65 20 22 74 31 2e 61 3d  t use the "t1.a=
24600 74 32 2e 62 22 20 63 6f 6e 73 74 72 61 69 6e 74  t2.b" constraint
24610 2c 20 62 75 74 20 77 65 20 63 61 6e 20 63 6f 64  , but we can cod
24620 65 0a 20 20 2a 2a 20 74 68 65 20 69 6d 70 6c 69  e.  ** the impli
24630 65 64 20 22 74 31 2e 61 3d 31 32 33 22 20 63 6f  ed "t1.a=123" co
24640 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20  nstraint..  */. 
24650 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
24660 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b  a, j=pWC->nTerm;
24670 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d   j>0; j--, pTerm
24680 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
24690 45 2c 20 2a 70 45 41 6c 74 3b 0a 20 20 20 20 57  E, *pEAlt;.    W
246a0 68 65 72 65 54 65 72 6d 20 2a 70 41 6c 74 3b 0a  hereTerm *pAlt;.
246b0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
246c0 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
246d0 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
246e0 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
246f0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
24700 70 65 72 61 74 6f 72 21 3d 28 57 4f 5f 45 51 55  perator!=(WO_EQU
24710 49 56 7c 57 4f 5f 45 51 29 20 29 20 63 6f 6e 74  IV|WO_EQ) ) cont
24720 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
24730 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  erm->leftCursor!
24740 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
24750 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
24760 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 20 63 6f  ->iLeftJoin ) co
24770 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45 20 3d  ntinue;.    pE =
24780 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
24790 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
247a0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
247b0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a  EP_FromJoin) );.
247c0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
247d0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
247e0 26 20 6e 65 77 4e 6f 74 52 65 61 64 79 29 21 3d  & newNotReady)!=
247f0 30 20 29 3b 0a 20 20 20 20 70 41 6c 74 20 3d 20  0 );.    pAlt = 
24800 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
24810 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  ur, pTerm->u.lef
24820 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61 64  tColumn, notRead
24830 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20  y, WO_EQ|WO_IN, 
24840 30 29 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74  0);.    if( pAlt
24850 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
24860 20 20 20 20 69 66 28 20 70 41 6c 74 2d 3e 77 74      if( pAlt->wt
24870 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f  Flags & (TERM_CO
24880 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
24890 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
248a0 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  Alt->eOperator &
248b0 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 74 65   WO_EQ );.    te
248c0 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f  stcase( pAlt->eO
248d0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
248e0 29 3b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  );.    VdbeNoopC
248f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69  omment((v, "begi
24900 6e 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e  n transitive con
24910 73 74 72 61 69 6e 74 22 29 29 3b 0a 20 20 20 20  straint"));.    
24920 70 45 41 6c 74 20 3d 20 73 71 6c 69 74 65 33 53  pEAlt = sqlite3S
24930 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c  tackAllocRaw(db,
24940 20 73 69 7a 65 6f 66 28 2a 70 45 41 6c 74 29 29   sizeof(*pEAlt))
24950 3b 0a 20 20 20 20 69 66 28 20 70 45 41 6c 74 20  ;.    if( pEAlt 
24960 29 7b 0a 20 20 20 20 20 20 2a 70 45 41 6c 74 20  ){.      *pEAlt 
24970 3d 20 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b 0a  = *pAlt->pExpr;.
24980 20 20 20 20 20 20 70 45 41 6c 74 2d 3e 70 4c 65        pEAlt->pLe
24990 66 74 20 3d 20 70 45 2d 3e 70 4c 65 66 74 3b 0a  ft = pE->pLeft;.
249a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
249b0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
249c0 20 70 45 41 6c 74 2c 20 61 64 64 72 43 6f 6e 74   pEAlt, addrCont
249d0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
249e0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
249f0 74 65 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c  te3StackFree(db,
24a00 20 70 45 41 6c 74 29 3b 0a 20 20 20 20 7d 0a 20   pEAlt);.    }. 
24a10 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c   }..  /* For a L
24a20 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
24a30 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  generate code th
24a40 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74  at will record t
24a50 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a  he fact that.  *
24a60 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72  * at least one r
24a70 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  ow of the right 
24a80 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65  table has matche
24a90 64 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  d the left table
24aa0 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  .  .  */.  if( p
24ab0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
24ac0 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   ){.    pLevel->
24ad0 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
24ae0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
24af0 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
24b00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
24b10 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70  OP_Integer, 1, p
24b20 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
24b30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
24b40 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c  nt((v, "record L
24b50 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b  EFT JOIN hit"));
24b60 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
24b70 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
24b80 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72  e);.    for(pTer
24b90 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a  m=pWC->a, j=0; j
24ba0 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b  <pWC->nTerm; j++
24bb0 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
24bc0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
24bd0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
24be0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
24bf0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
24c00 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
24c10 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20  RM_CODED );.    
24c20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
24c30 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
24c40 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
24c50 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
24c60 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
24c70 72 65 72 65 71 41 6c 6c 20 26 20 6e 65 77 4e 6f  rereqAll & newNo
24c80 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20  tReady)!=0 ){.  
24c90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57        assert( pW
24ca0 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
24cb0 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20 63  rms );.        c
24cc0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
24cd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24ce0 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Term->pExpr );. 
24cf0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
24d00 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
24d10 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64  pTerm->pExpr, ad
24d20 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a  drCont, SQLITE_J
24d30 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
24d40 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
24d50 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a   |= TERM_CODED;.
24d60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
24d70 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
24d80 67 28 70 50 61 72 73 65 2c 20 69 52 65 6c 65 61  g(pParse, iRelea
24d90 73 65 52 65 67 29 3b 0a 0a 20 20 72 65 74 75 72  seReg);..  retur
24da0 6e 20 6e 65 77 4e 6f 74 52 65 61 64 79 3b 0a 7d  n newNotReady;.}
24db0 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
24dc0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a  ACE_ENABLED./*.*
24dd0 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72 65 4c  * Print a WhereL
24de0 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20 64  oop object for d
24df0 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65  ebugging purpose
24e00 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
24e10 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
24e20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 53 72  WhereLoop *p, Sr
24e30 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 29  cList *pTabList)
24e40 7b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31 2b 28  {.  int nb = 1+(
24e50 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 37  pTabList->nSrc+7
24e60 29 2f 38 3b 0a 20 20 73 74 72 75 63 74 20 53 72  )/8;.  struct Sr
24e70 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
24e80 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20  m = pTabList->a 
24e90 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61 62  + p->iTab;.  Tab
24ea0 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d  le *pTab = pItem
24eb0 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65  ->pTab;.  sqlite
24ec0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 63  3DebugPrintf("%c
24ed0 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c  %2d.%0*llx.%0*ll
24ee0 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20 20 20  x", p->cId,.    
24ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f00 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20 70 2d   p->iTab, nb, p-
24f10 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c 20 70  >maskSelf, nb, p
24f20 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20 73 71 6c  ->prereq);.  sql
24f30 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24f40 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20 20 20  " %12s",.       
24f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
24f60 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49  tem->zAlias ? pI
24f70 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54  tem->zAlias : pT
24f80 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ab->zName);.  if
24f90 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
24fa0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
24fb0 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  LE)==0 ){.    if
24fc0 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  ( p->u.btree.pIn
24fd0 64 65 78 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  dex ){.      con
24fe0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
24ff0 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
25000 65 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ex->zName;.     
25010 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
25020 7a 4e 61 6d 65 20 3d 20 22 69 70 6b 22 3b 0a 20  zName = "ipk";. 
25030 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
25040 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
25050 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29  autoindex_", 17)
25060 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
25070 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74  nt i = sqlite3St
25080 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20  rlen30(zName) - 
25090 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  1;.        while
250a0 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20  ( zName[i]!='_' 
250b0 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a  ) i--;.        z
250c0 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20  Name += i;.     
250d0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
250e0 44 65 62 75 67 50 72 69 6e 74 66 28 22 2e 25 2d  DebugPrintf(".%-
250f0 31 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c  16s %2d", zName,
25100 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29   p->u.btree.nEq)
25110 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25120 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
25130 72 69 6e 74 66 28 22 25 32 30 73 22 2c 22 22 29  rintf("%20s","")
25140 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
25150 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  .    char *z;.  
25160 20 20 69 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e    if( p->u.vtab.
25170 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20  idxStr ){.      
25180 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
25190 6e 74 66 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c  ntf("(%d,\"%s\",
251a0 25 78 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %x)",.          
251b0 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
251c0 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61  idxNum, p->u.vta
251d0 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76  b.idxStr, p->u.v
251e0 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20  tab.omitMask);. 
251f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25200 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
25210 6e 74 66 28 22 28 25 64 2c 25 78 29 22 2c 20 70  ntf("(%d,%x)", p
25220 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c  ->u.vtab.idxNum,
25230 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d   p->u.vtab.omitM
25240 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ask);.    }.    
25250 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
25260 74 66 28 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b  tf(" %-19s", z);
25270 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
25280 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  e(z);.  }.  sqli
25290 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
252a0 20 66 20 25 30 34 78 20 4e 20 25 64 22 2c 20 70   f %04x N %d", p
252b0 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c  ->wsFlags, p->nL
252c0 54 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  Term);.  sqlite3
252d0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f  DebugPrintf(" co
252e0 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20  st %d,%d,%d\n", 
252f0 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52  p->rSetup, p->rR
25300 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 7d 0a  un, p->nOut);.}.
25310 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
25320 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72  nvert bulk memor
25330 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 57  y into a valid W
25340 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63 61  hereLoop that ca
25350 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20 74  n be passed.** t
25360 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  o whereLoopClear
25370 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a   harmlessly..*/.
25380 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
25390 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65 4c  eLoopInit(WhereL
253a0 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c  oop *p){.  p->aL
253b0 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d  Term = p->aLTerm
253c0 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65  Space;.  p->nLTe
253d0 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53  rm = 0;.  p->nLS
253e0 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
253f0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3b  p->aLTermSpace);
25400 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  .  p->wsFlags = 
25410 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  0;.}../*.** Clea
25420 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  r the WhereLoop.
25430 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20  u union.  Leave 
25440 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d  WhereLoop.pLTerm
25450 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74   intact..*/.stat
25460 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
25470 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69  pClearUnion(sqli
25480 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
25490 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  op *p){.  if( p-
254a0 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
254b0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c 57  E_VIRTUALTABLE|W
254c0 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
254d0 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   ){.    if( (p->
254e0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
254f0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
25500 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65   && p->u.vtab.ne
25510 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  edFree ){.      
25520 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
25530 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
25540 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
25550 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
25560 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64      p->u.vtab.id
25570 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65  xStr = 0;.    }e
25580 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  lse if( (p->wsFl
25590 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
255a0 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 2d  _INDEX)!=0 && p-
255b0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
255c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
255d0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
255e0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
255f0 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20  >zColAff);.     
25600 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
25610 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  b, p->u.btree.pI
25620 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ndex);.      p->
25630 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
25640 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
25650 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
25660 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72  e internal memor
25670 79 20 75 73 65 64 20 62 79 20 61 20 57 68 65 72  y used by a Wher
25680 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eLoop object.*/.
25690 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
256a0 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74  eLoopClear(sqlit
256b0 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
256c0 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  p *p){.  if( p->
256d0 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72  aLTerm!=p->aLTer
256e0 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33  mSpace ) sqlite3
256f0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
25700 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f  Term);.  whereLo
25710 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c  opClearUnion(db,
25720 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70   p);.  whereLoop
25730 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Init(p);.}../*.*
25740 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6d  * Increase the m
25750 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
25760 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65   for pLoop->aLTe
25770 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c 65  rm[] to be at le
25780 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ast n..*/.static
25790 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65   int whereLoopRe
257a0 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62  size(sqlite3 *db
257b0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  , WhereLoop *p, 
257c0 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65 54  int n){.  WhereT
257d0 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69  erm **paNew;.  i
257e0 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20  f( p->nLSlot>=n 
257f0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
25800 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26  OK;.  n = (n+7)&
25810 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73 71  ~7;.  paNew = sq
25820 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
25830 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61  (db, sizeof(p->a
25840 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20  LTerm[0])*n);.  
25850 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72  if( paNew==0 ) r
25860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
25870 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e  EM;.  memcpy(paN
25880 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73  ew, p->aLTerm, s
25890 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b  izeof(p->aLTerm[
258a0 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a  0])*p->nLSlot);.
258b0 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21    if( p->aLTerm!
258c0 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20  =p->aLTermSpace 
258d0 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
258e0 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a  db, p->aLTerm);.
258f0 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61    p->aLTerm = pa
25900 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74  New;.  p->nLSlot
25910 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53   = n;.  return S
25920 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
25930 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74  ** Transfer cont
25940 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63  ent from the sec
25950 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74  ond pLoop into t
25960 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61  he first..*/.sta
25970 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
25980 70 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64  pXfer(sqlite3 *d
25990 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  b, WhereLoop *pT
259a0 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46  o, WhereLoop *pF
259b0 72 6f 6d 29 7b 0a 20 20 69 66 28 20 77 68 65 72  rom){.  if( wher
259c0 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
259d0 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65  pTo, pFrom->nLTe
259e0 72 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rm) ) return SQL
259f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 77 68 65  ITE_NOMEM;.  whe
25a00 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e  reLoopClearUnion
25a10 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 6d 65 6d  (db, pTo);.  mem
25a20 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20  cpy(pTo, pFrom, 
25a30 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f  WHERE_LOOP_XFER_
25a40 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  SZ);.  memcpy(pT
25a50 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d  o->aLTerm, pFrom
25a60 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e  ->aLTerm, pTo->n
25a70 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f  LTerm*sizeof(pTo
25a80 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20  ->aLTerm[0]));. 
25a90 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c   if( pFrom->wsFl
25aa0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
25ab0 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20  UALTABLE ){.    
25ac0 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65  pFrom->u.vtab.ne
25ad0 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  edFree = 0;.  }e
25ae0 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e  lse if( (pFrom->
25af0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
25b00 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29  AUTO_INDEX)!=0 )
25b10 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62  {.    pFrom->u.b
25b20 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
25b30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
25b40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
25b50 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65 72 65  * Delete a Where
25b60 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  Loop object.*/.s
25b70 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
25b80 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c 69 74  LoopDelete(sqlit
25b90 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
25ba0 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f  p *p){.  whereLo
25bb0 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a  opClear(db, p);.
25bc0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
25bd0 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
25be0 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e 66   Free a WhereInf
25bf0 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73  o structure.*/.s
25c00 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
25c10 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33  InfoFree(sqlite3
25c20 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20   *db, WhereInfo 
25c30 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20  *pWInfo){.  if( 
25c40 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29  ALWAYS(pWInfo) )
25c50 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  {.    whereClaus
25c60 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e  eClear(&pWInfo->
25c70 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  sWC);.    while(
25c80 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
25c90 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f  ){.      WhereLo
25ca0 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  op *p = pWInfo->
25cb0 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70 57  pLoops;.      pW
25cc0 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70  Info->pLoops = p
25cd0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
25ce0 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65     whereLoopDele
25cf0 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d  te(db, p);.    }
25d00 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
25d10 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
25d20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73    }.}../*.** Ins
25d30 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20 61  ert or replace a
25d40 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79   WhereLoop entry
25d50 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70 6c   using the templ
25d60 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a  ate supplied..**
25d70 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20  .** An existing 
25d80 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20  WhereLoop entry 
25d90 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77 72 69  might be overwri
25da0 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77 20  tten if the new 
25db0 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62  template.** is b
25dc0 65 74 74 65 72 20 61 6e 64 20 68 61 73 20 66 65  etter and has fe
25dd0 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
25de0 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c 61  .  Or the templa
25df0 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  te will be ignor
25e00 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73  ed.** and no ins
25e10 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20 69  ert will occur i
25e20 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  f an existing Wh
25e30 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74 65  ereLoop is faste
25e40 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77  r and has.** few
25e50 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  er dependencies 
25e60 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  than the templat
25e70 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 20  e.  Otherwise a 
25e80 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  new WhereLoop is
25e90 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64 20  .** added based 
25ea0 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e  on the template.
25eb0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64  .**.** If pBuild
25ec0 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f  er->pOrSet is no
25ed0 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20 6f  t NULL then we o
25ee0 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 6f  nly care about o
25ef0 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65  nly the.** prere
25f00 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52 75  quisites and rRu
25f10 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73  n and nOut costs
25f20 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c   of the N best l
25f30 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69  oops.  That.** i
25f40 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61  nformation is ga
25f50 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70 42  thered in the pB
25f60 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f  uilder->pOrSet o
25f70 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70 65  bject.  This spe
25f80 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69  cial.** processi
25f90 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
25fa0 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75  only for OR clau
25fb0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
25fc0 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75  *.** When accumu
25fd0 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  lating multiple 
25fe0 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69  loops (when pBui
25ff0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
26000 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c  NULL) we.** stil
26010 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  l might overwrit
26020 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20  e similar loops 
26030 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d  with the new tem
26040 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  plate if the.** 
26050 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74  template is bett
26060 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62  er.  Loops may b
26070 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66  e overwritten if
26080 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a   the following .
26090 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72  ** conditions ar
260a0 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  e met:.**.**    
260b0 28 31 29 20 20 54 68 65 79 20 68 61 76 65 20 74  (1)  They have t
260c0 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a  he same iTab..**
260d0 20 20 20 20 28 32 29 20 20 54 68 65 79 20 68 61      (2)  They ha
260e0 76 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72  ve the same iSor
260f0 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20  tIdx..**    (3) 
26100 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61   The template ha
26110 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20  s same or fewer 
26120 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
26130 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  n the current lo
26140 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68  op.**    (4)  Th
26150 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74  e template has t
26160 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
26170 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63   cost than the c
26180 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20  urrent loop.**  
26190 20 20 28 35 29 20 20 54 68 65 20 74 65 6d 70 6c    (5)  The templ
261a0 61 74 65 20 75 73 65 73 20 6d 6f 72 65 20 74 65  ate uses more te
261b0 72 6d 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  rms of the same 
261c0 69 6e 64 65 78 20 62 75 74 20 68 61 73 20 6e 6f  index but has no
261d0 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 20   additional.**  
261e0 20 20 20 20 20 20 20 64 65 70 65 6e 64 65 6e 63         dependenc
261f0 69 65 73 20 20 20 20 20 20 20 20 20 20 0a 2a 2f  ies          .*/
26200 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
26210 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72  eLoopInsert(Wher
26220 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
26230 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f  uilder, WhereLoo
26240 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20  p *pTemplate){. 
26250 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50   WhereLoop **ppP
26260 72 65 76 2c 20 2a 70 2c 20 2a 70 4e 65 78 74 20  rev, *p, *pNext 
26270 3d 20 30 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f  = 0;.  WhereInfo
26280 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
26290 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73  der->pWInfo;.  s
262a0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
262b0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
262c0 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64  ..  /* If pBuild
262d0 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 64 65  er->pOrSet is de
262e0 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79  fined, then only
262f0 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   keep track of t
26300 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61 6e  he costs.  ** an
26310 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f 0a  d prereqs..  */.
26320 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e    if( pBuilder->
26330 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 23 69 66  pOrSet!=0 ){.#if
26340 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
26350 4c 45 44 0a 20 20 20 20 75 31 36 20 6e 20 3d 20  LED.    u16 n = 
26360 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
26370 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d  ->n;.    int x =
26380 0a 23 65 6e 64 69 66 0a 20 20 20 20 77 68 65 72  .#endif.    wher
26390 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69 6c 64  eOrInsert(pBuild
263a0 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65 6d  er->pOrSet, pTem
263b0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c 20 70  plate->prereq, p
263c0 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a  Template->rRun,.
263d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263f0 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e      pTemplate->n
26400 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52 45 54  Out);.#if WHERET
26410 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
26420 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
26430 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
26440 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
26450 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20 6f  ugPrintf(x?"   o
26460 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d  r-%d:  ":"   or-
26470 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20  X:  ", n);.     
26480 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
26490 70 54 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e 66  pTemplate, pWInf
264a0 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20  o->pTabList);.  
264b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
264c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
264d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
264e0 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
264f0 67 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 6f  g WhereLoop to o
26500 76 65 72 77 72 69 74 65 2c 20 6f 72 20 77 68 69  verwrite, or whi
26510 63 68 20 74 61 6b 65 73 0a 20 20 2a 2a 20 70 72  ch takes.  ** pr
26520 69 6f 72 69 74 79 20 6f 76 65 72 20 70 54 65 6d  iority over pTem
26530 70 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f  plate..  */.  fo
26540 72 28 70 70 50 72 65 76 3d 26 70 57 49 6e 66 6f  r(ppPrev=&pWInfo
26550 2d 3e 70 4c 6f 6f 70 73 2c 20 70 3d 2a 70 70 50  ->pLoops, p=*ppP
26560 72 65 76 3b 20 70 3b 20 70 70 50 72 65 76 3d 26  rev; p; ppPrev=&
26570 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d  p->pNextLoop, p=
26580 2a 70 70 50 72 65 76 29 7b 0a 20 20 20 20 69 66  *ppPrev){.    if
26590 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70  ( p->iTab!=pTemp
265a0 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d  late->iTab || p-
265b0 3e 69 53 6f 72 74 49 64 78 21 3d 70 54 65 6d 70  >iSortIdx!=pTemp
265c0 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64 78 20 29  late->iSortIdx )
265d0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 65 69  {.      /* If ei
265e0 74 68 65 72 20 74 68 65 20 69 54 61 62 20 6f 72  ther the iTab or
265f0 20 69 53 6f 72 74 49 64 78 20 76 61 6c 75 65 73   iSortIdx values
26600 20 66 6f 72 20 74 77 6f 20 57 68 65 72 65 4c 6f   for two WhereLo
26610 6f 70 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  op are different
26620 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
26630 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70 73 20  hose WhereLoops 
26640 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69  need to be consi
26650 64 65 72 65 64 20 73 65 70 61 72 61 74 65 6c 79  dered separately
26660 2e 20 20 4e 65 69 74 68 65 72 20 69 73 0a 20 20  .  Neither is.  
26670 20 20 20 20 2a 2a 20 61 20 63 61 6e 64 69 64 61      ** a candida
26680 74 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68  te to replace th
26690 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  e other. */.    
266a0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
266b0 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20  }.    /* In the 
266c0 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
266d0 74 61 74 69 6f 6e 2c 20 74 68 65 20 72 53 65 74  tation, the rSet
266e0 75 70 20 76 61 6c 75 65 20 69 73 20 65 69 74 68  up value is eith
266f0 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f  er zero.    ** o
26700 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20 62 75  r the cost of bu
26710 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61  ilding an automa
26720 74 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e  tic index (NlogN
26730 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a  ) and the NlogN.
26740 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61      ** is the sa
26750 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c  me for compatibl
26760 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f  e WhereLoops. */
26770 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
26780 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65  rSetup==0 || pTe
26790 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d  mplate->rSetup==
267a0 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0 .             
267b0 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70      || p->rSetup
267c0 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  ==pTemplate->rSe
267d0 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77  tup );..    /* w
267e0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
267f0 28 29 20 61 6c 77 61 79 73 20 67 65 6e 65 72 61  () always genera
26800 74 65 73 20 61 6e 64 20 69 6e 73 65 72 74 73 20  tes and inserts 
26810 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
26820 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  dex.    ** case 
26830 66 69 72 73 74 2e 20 20 48 65 6e 63 65 20 63 6f  first.  Hence co
26840 6d 70 61 74 69 62 6c 65 20 63 61 6e 64 69 64 61  mpatible candida
26850 74 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65  te WhereLoops ne
26860 76 65 72 20 68 61 76 65 20 61 20 6c 61 72 67 65  ver have a large
26870 72 0a 20 20 20 20 2a 2a 20 72 53 65 74 75 70 2e  r.    ** rSetup.
26880 20 43 61 6c 6c 20 74 68 69 73 20 53 45 54 55 50   Call this SETUP
26890 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20  -INVARIANT */.  
268a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65    assert( p->rSe
268b0 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup>=pTemplate->
268c0 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 69  rSetup );..    i
268d0 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  f( (p->prereq & 
268e0 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
268f0 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 0a 20 20  q)==p->prereq.  
26900 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c     && p->rSetup<
26910 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
26920 75 70 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52  up.     && p->rR
26930 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  un<=pTemplate->r
26940 52 75 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Run.    ){.     
26950 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
26960 74 61 6b 65 6e 20 77 68 65 6e 20 70 20 69 73 20  taken when p is 
26970 65 71 75 61 6c 20 6f 72 20 62 65 74 74 65 72 20  equal or better 
26980 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 20 69  than pTemplate i
26990 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  n .      ** all 
269a0 6f 66 20 28 31 29 20 64 65 70 65 6e 64 65 6e 63  of (1) dependenc
269b0 65 73 20 28 32 29 20 73 65 74 75 70 2d 63 6f 73  es (2) setup-cos
269c0 74 2c 20 61 6e 64 20 28 33 29 20 72 75 6e 2d 63  t, and (3) run-c
269d0 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ost. */.      as
269e0 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d  sert( p->rSetup=
269f0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
26a00 75 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  up );.      if( 
26a10 70 2d 3e 6e 4c 54 65 72 6d 3c 70 54 65 6d 70 6c  p->nLTerm<pTempl
26a20 61 74 65 2d 3e 6e 4c 54 65 72 6d 0a 20 20 20 20  ate->nLTerm.    
26a30 20 20 20 26 26 20 28 70 2d 3e 77 73 46 6c 61 67     && (p->wsFlag
26a40 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
26a50 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20  D)!=0.       && 
26a60 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
26a70 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
26a80 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26  XED)!=0.       &
26a90 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  & p->u.btree.pIn
26aa0 64 65 78 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  dex==pTemplate->
26ab0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 0a 20  u.btree.pIndex. 
26ac0 20 20 20 20 20 20 26 26 20 70 2d 3e 70 72 65 72        && p->prer
26ad0 65 71 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70  eq==pTemplate->p
26ae0 72 65 72 65 71 0a 20 20 20 20 20 20 29 7b 0a 20  rereq.      ){. 
26af0 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 77 72         /* Overwr
26b00 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ite an existing 
26b10 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61  WhereLoop with a
26b20 6e 20 73 69 6d 69 6c 61 72 20 6f 6e 65 20 74 68  n similar one th
26b30 61 74 20 75 73 65 73 0a 20 20 20 20 20 20 20 20  at uses.        
26b40 2a 2a 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66  ** more terms of
26b50 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
26b60 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d        pNext = p-
26b70 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20  >pNextLoop;.    
26b80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
26b90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26ba0 2f 2a 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20  /* pTemplate is 
26bb0 6e 6f 74 20 68 65 6c 70 66 75 6c 2e 0a 20 20 20  not helpful..   
26bc0 20 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 77       ** Return w
26bd0 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
26be0 6f 72 20 61 64 64 69 6e 67 20 61 6e 79 74 68 69  or adding anythi
26bf0 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f  ng */.        go
26c00 74 6f 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65  to whereLoopInse
26c10 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d  rt_noop;.      }
26c20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
26c30 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
26c40 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
26c50 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
26c60 71 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  q.     && p->rRu
26c70 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n>=pTemplate->rR
26c80 75 6e 0a 20 20 20 20 20 26 26 20 41 4c 57 41 59  un.     && ALWAY
26c90 53 28 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65  S(p->rSetup>=pTe
26ca0 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 29 20  mplate->rSetup) 
26cb0 2f 2a 20 53 65 65 20 53 45 54 55 50 2d 49 4e 56  /* See SETUP-INV
26cc0 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a  ARIANT above */.
26cd0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
26ce0 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65 78 69  Overwrite an exi
26cf0 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
26d00 77 69 74 68 20 61 20 62 65 74 74 65 72 20 6f 6e  with a better on
26d10 65 3a 20 6f 6e 65 20 74 68 61 74 20 69 73 0a 20  e: one that is. 
26d20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 61       ** better a
26d30 74 20 6f 6e 65 20 6f 66 20 28 31 29 20 64 65 70  t one of (1) dep
26d40 65 6e 64 65 6e 63 65 73 2c 20 28 32 29 20 73 65  endences, (2) se
26d50 74 75 70 2d 63 6f 73 74 2c 20 6f 72 20 28 33 29  tup-cost, or (3)
26d60 20 72 75 6e 2d 63 6f 73 74 0a 20 20 20 20 20 20   run-cost.      
26d70 2a 2a 20 61 6e 64 20 69 73 20 6e 6f 20 77 6f 72  ** and is no wor
26d80 73 65 20 69 6e 20 61 6e 79 20 6f 66 20 74 68 6f  se in any of tho
26d90 73 65 20 63 61 74 65 67 6f 72 69 65 73 2e 20 2a  se categories. *
26da0 2f 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  /.      pNext = 
26db0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20  p->pNextLoop;.  
26dc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
26dd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
26de0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
26df0 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  t it means that 
26e00 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c  either p[] shoul
26e10 64 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  d be overwritten
26e20 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70  .  ** with pTemp
26e30 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78  late[] if p[] ex
26e40 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e  ists, or if p==N
26e50 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ULL then allocat
26e60 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65  e a new.  ** Whe
26e70 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72  reLoop and inser
26e80 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57  t it..  */.#if W
26e90 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
26ea0 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  D.  if( sqlite3W
26eb0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
26ec0 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20  ){.    if( p!=0 
26ed0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
26ee0 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73  DebugPrintf("ins
26ef0 2d 64 65 6c 3a 20 20 22 29 3b 0a 20 20 20 20 20  -del:  ");.     
26f00 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
26f10 70 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  p, pWInfo->pTabL
26f20 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
26f30 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26f40 74 66 28 22 69 6e 73 2d 6e 65 77 3a 20 20 22 29  tf("ins-new:  ")
26f50 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50  ;.    whereLoopP
26f60 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
26f70 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
26f80 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
26f90 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
26fa0 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
26fb0 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
26fc0 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20  f(WhereLoop));. 
26fd0 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65     if( p==0 ) re
26fe0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
26ff0 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  M;.    whereLoop
27000 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a 20 20 77  Init(p);.  }.  w
27010 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c  hereLoopXfer(db,
27020 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a   p, pTemplate);.
27030 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d    p->pNextLoop =
27040 20 70 4e 65 78 74 3b 0a 20 20 2a 70 70 50 72 65   pNext;.  *ppPre
27050 76 20 3d 20 70 3b 0a 20 20 69 66 28 20 28 70 2d  v = p;.  if( (p-
27060 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
27070 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
27080 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  0 ){.    Index *
27090 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74  pIndex = p->u.bt
270a0 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
270b0 69 66 28 20 70 49 6e 64 65 78 20 26 26 20 70 49  if( pIndex && pI
270c0 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b  ndex->tnum==0 ){
270d0 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65  .      p->u.btre
270e0 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
270f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
27100 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
27110 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
27120 68 65 20 69 6e 73 65 72 74 20 69 73 20 61 20 6e  he insert is a n
27130 6f 2d 6f 70 20 2a 2f 0a 77 68 65 72 65 4c 6f 6f  o-op */.whereLoo
27140 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3a 0a 23 69  pInsert_noop:.#i
27150 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
27160 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
27170 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
27180 78 38 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  x8 ){.    sqlite
27190 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e  3DebugPrintf("in
271a0 73 2d 6e 6f 6f 70 3a 20 22 29 3b 0a 20 20 20 20  s-noop: ");.    
271b0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
271c0 54 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e 66 6f  Template, pWInfo
271d0 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 7d  ->pTabList);.  }
271e0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
271f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 7d 0a   SQLITE_OK;  .}.
27200 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73  ./*.** We have s
27210 6f 20 66 61 72 20 6d 61 74 63 68 65 64 20 70 42  o far matched pB
27220 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
27230 62 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20  btree.nEq terms 
27240 6f 66 20 74 68 65 20 69 6e 64 65 78 20 70 49 6e  of the index pIn
27250 64 65 78 2e 0a 2a 2a 20 54 72 79 20 74 6f 20 6d  dex..** Try to m
27260 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a  atch one more..*
27270 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e  *.** If pProbe->
27280 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65  tnum==0, that me
27290 61 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20  ans pIndex is a 
272a0 66 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20  fake index used 
272b0 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47  for the.** INTEG
272c0 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  ER PRIMARY KEY..
272d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
272e0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
272f0 6e 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f  ndex(.  WhereLoo
27300 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
27310 65 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  er,     /* The W
27320 68 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79  hereLoop factory
27330 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
27340 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
27350 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
27360 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20  ause term being 
27370 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e  analyzed */.  In
27380 64 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20  dex *pProbe,    
27390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
273a0 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72   An index on pSr
273b0 63 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  c */.  WhereCost
273c0 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20   nInMul         
273d0 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75         /* log(Nu
273e0 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f  mber of iteratio
273f0 6e 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f  ns due to IN) */
27400 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
27410 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
27420 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20  er->pWInfo;  /* 
27430 57 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f  WHERE analyse co
27440 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65  ntext */.  Parse
27450 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66   *pParse = pWInf
27460 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20  o->pParse;      
27470 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
27480 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
27490 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
274a0 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74  db;       /* Dat
274b0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
274c0 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20   malloc context 
274d0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
274e0 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
274f0 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65       /* Template
27500 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72   WhereLoop under
27510 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
27520 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
27530 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
27540 20 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72     /* A WhereTer
27550 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72  m under consider
27560 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f  ation */.  int o
27570 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  pMask;          
27580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
27590 6c 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f  lid operators fo
275a0 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  r constraints */
275b0 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61  .  WhereScan sca
275c0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
275d0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66     /* Iterator f
275e0 6f 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a  or WHERE terms *
275f0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65  /.  Bitmask save
27600 64 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20 20  d_prereq;       
27610 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
27620 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70  value of pNew->p
27630 72 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73  rereq */.  u16 s
27640 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20  aved_nLTerm;    
27650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
27660 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
27670 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a  pNew->nLTerm */.
27680 20 20 69 6e 74 20 73 61 76 65 64 5f 6e 45 71 3b    int saved_nEq;
27690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276a0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
276b0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62  lue of pNew->u.b
276c0 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 33  tree.nEq */.  u3
276d0 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  2 saved_wsFlags;
276e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
276f0 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
27700 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  of pNew->wsFlags
27710 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
27720 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20  saved_nOut;     
27730 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
27740 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
27750 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69  >nOut */.  int i
27760 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
27770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
27780 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
27790 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  n in the table *
277a0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
277b0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
277c0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
277d0 64 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  de */.  WhereCos
277e0 74 20 6e 52 6f 77 45 73 74 3b 20 20 20 20 20 20  t nRowEst;      
277f0 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d          /* Estim
27800 61 74 65 64 20 69 6e 64 65 78 20 73 65 6c 65 63  ated index selec
27810 74 69 76 69 74 79 20 2a 2f 0a 20 20 57 68 65 72  tivity */.  Wher
27820 65 43 6f 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20  eCost rLogSize; 
27830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
27840 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c  ogarithm of tabl
27850 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72  e size */.  Wher
27860 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c  eTerm *pTop = 0,
27870 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54   *pBtm = 0; /* T
27880 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61  op and bottom ra
27890 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
278a0 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  */..  pNew = pBu
278b0 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69  ilder->pNew;.  i
278c0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
278d0 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  led ) return SQL
278e0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73  ITE_NOMEM;..  as
278f0 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46  sert( (pNew->wsF
27900 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
27910 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b  TUALTABLE)==0 );
27920 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77  .  assert( (pNew
27930 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
27940 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20  E_TOP_LIMIT)==0 
27950 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  );.  if( pNew->w
27960 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
27970 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
27980 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57  opMask = WO_LT|W
27990 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  O_LE;.  }else if
279a0 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d  ( pProbe->tnum<=
279b0 30 20 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f 69 6e  0 || (pSrc->join
279c0 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
279d0 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b  =0 ){.    opMask
279e0 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57   = WO_EQ|WO_IN|W
279f0 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54  O_GT|WO_GE|WO_LT
27a00 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b  |WO_LE;.  }else{
27a10 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f  .    opMask = WO
27a20 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e  _EQ|WO_IN|WO_ISN
27a30 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  ULL|WO_GT|WO_GE|
27a40 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d  WO_LT|WO_LE;.  }
27a50 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62  .  if( pProbe->b
27a60 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61  Unordered ) opMa
27a70 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f  sk &= ~(WO_GT|WO
27a80 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29  _GE|WO_LT|WO_LE)
27a90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  ;..  assert( pNe
27aa0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d  w->u.btree.nEq<=
27ab0 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20  pProbe->nColumn 
27ac0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 75  );.  if( pNew->u
27ad0 2e 62 74 72 65 65 2e 6e 45 71 20 3c 20 70 50 72  .btree.nEq < pPr
27ae0 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  obe->nColumn ){.
27af0 20 20 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62      iCol = pProb
27b00 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77  e->aiColumn[pNew
27b10 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b 0a  ->u.btree.nEq];.
27b20 20 20 20 20 6e 52 6f 77 45 73 74 20 3d 20 77 68      nRowEst = wh
27b30 65 72 65 43 6f 73 74 28 70 50 72 6f 62 65 2d 3e  ereCost(pProbe->
27b40 61 69 52 6f 77 45 73 74 5b 70 4e 65 77 2d 3e 75  aiRowEst[pNew->u
27b50 2e 62 74 72 65 65 2e 6e 45 71 2b 31 5d 29 3b 0a  .btree.nEq+1]);.
27b60 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74 3d      if( nRowEst=
27b70 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e  =0 && pProbe->on
27b80 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29  Error==OE_None )
27b90 20 6e 52 6f 77 45 73 74 20 3d 20 31 3b 0a 20 20   nRowEst = 1;.  
27ba0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 43 6f 6c 20  }else{.    iCol 
27bb0 3d 20 2d 31 3b 0a 20 20 20 20 6e 52 6f 77 45 73  = -1;.    nRowEs
27bc0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 54 65  t = 0;.  }.  pTe
27bd0 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e  rm = whereScanIn
27be0 69 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64  it(&scan, pBuild
27bf0 65 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69  er->pWC, pSrc->i
27c00 43 75 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20  Cursor, iCol,.  
27c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50        opMask, pP
27c30 72 6f 62 65 29 3b 0a 20 20 73 61 76 65 64 5f 6e  robe);.  saved_n
27c40 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72  Eq = pNew->u.btr
27c50 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f  ee.nEq;.  saved_
27c60 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e  nLTerm = pNew->n
27c70 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77  LTerm;.  saved_w
27c80 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77  sFlags = pNew->w
27c90 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64 5f  sFlags;.  saved_
27ca0 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70  prereq = pNew->p
27cb0 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e  rereq;.  saved_n
27cc0 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74  Out = pNew->nOut
27cd0 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70  ;.  pNew->rSetup
27ce0 20 3d 20 30 3b 0a 20 20 72 4c 6f 67 53 69 7a 65   = 0;.  rLogSize
27cf0 20 3d 20 65 73 74 4c 6f 67 28 77 68 65 72 65 43   = estLog(whereC
27d00 6f 73 74 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f  ost(pProbe->aiRo
27d10 77 45 73 74 5b 30 5d 29 29 3b 0a 20 20 66 6f 72  wEst[0]));.  for
27d20 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  (; rc==SQLITE_OK
27d30 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54   && pTerm!=0; pT
27d40 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e  erm = whereScanN
27d50 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20  ext(&scan)){.   
27d60 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 20 20   int nIn = 0;.  
27d70 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
27d80 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
27d90 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
27da0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
27db0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
27dc0 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28 70  =WO_ISNULL || (p
27dd0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 26 54 45  Term->wtFlags&TE
27de0 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29 0a 20 20  RM_VNULL)!=0).  
27df0 20 20 20 26 26 20 28 69 43 6f 6c 3c 30 20 7c 7c     && (iCol<0 ||
27e00 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f   pSrc->pTab->aCo
27e10 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 29  l[iCol].notNull)
27e20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f  .    ){.      co
27e30 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f 72  ntinue; /* ignor
27e40 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20  e IS [NOT] NULL 
27e50 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 4e  constraints on N
27e60 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20  OT NULL columns 
27e70 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  */.    }.    pNe
27e80 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76  w->wsFlags = sav
27e90 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  ed_wsFlags;.    
27ea0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
27eb0 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20  q = saved_nEq;. 
27ec0 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
27ed0 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a  = saved_nLTerm;.
27ee0 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
27ef0 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77  pResize(db, pNew
27f00 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31  , pNew->nLTerm+1
27f10 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f  ) ) break; /* OO
27f20 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61  M */.    pNew->a
27f30 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65  LTerm[pNew->nLTe
27f40 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  rm++] = pTerm;. 
27f50 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
27f60 3d 20 28 73 61 76 65 64 5f 70 72 65 72 65 71 20  = (saved_prereq 
27f70 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  | pTerm->prereqR
27f80 69 67 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d  ight) & ~pNew->m
27f90 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4e 65  askSelf;.    pNe
27fa0 77 2d 3e 72 52 75 6e 20 3d 20 72 4c 6f 67 53 69  w->rRun = rLogSi
27fb0 7a 65 3b 20 2f 2a 20 42 61 73 65 6c 69 6e 65 20  ze; /* Baseline 
27fc0 63 6f 73 74 20 69 73 20 6c 6f 67 32 28 4e 29 2e  cost is log2(N).
27fd0 20 20 41 64 6a 75 73 74 6d 65 6e 74 73 20 62 65    Adjustments be
27fe0 6c 6f 77 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  low */.    if( p
27ff0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
28000 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20  & WO_IN ){.     
28010 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
28020 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
28030 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
28040 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
28050 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 45  _IN;.      if( E
28060 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
28070 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
28080 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ct) ){.        /
28090 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  * "x IN (SELECT 
280a0 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20  ...)":  TUNING: 
280b0 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75 72  the SELECT retur
280c0 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20  ns 25 rows */.  
280d0 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20        nIn = 46; 
280e0 20 61 73 73 65 72 74 28 20 34 36 3d 3d 77 68 65   assert( 46==whe
280f0 72 65 43 6f 73 74 28 32 35 29 20 29 3b 0a 20 20  reCost(25) );.  
28100 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
28110 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
28120 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ist && pExpr->x.
28130 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  pList->nExpr) ){
28140 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
28150 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c  N (value, value,
28160 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20   ...)" */.      
28170 20 20 6e 49 6e 20 3d 20 77 68 65 72 65 43 6f 73    nIn = whereCos
28180 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  t(pExpr->x.pList
28190 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
281a0 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52  }.      pNew->rR
281b0 75 6e 20 2b 3d 20 6e 49 6e 3b 0a 20 20 20 20 20  un += nIn;.     
281c0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
281d0 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77  Eq++;.      pNew
281e0 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74  ->nOut = nRowEst
281f0 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b   + nInMul + nIn;
28200 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
28210 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
28220 26 20 28 57 4f 5f 45 51 29 20 29 7b 0a 20 20 20  & (WO_EQ) ){.   
28230 20 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77     assert( (pNew
28240 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
28250 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57  RE_COLUMN_NULL|W
28260 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 29  HERE_COLUMN_IN))
28270 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
28280 20 20 20 20 20 20 7c 7c 20 6e 49 6e 4d 75 6c 3d        || nInMul=
28290 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
282a0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
282b0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20  RE_COLUMN_EQ;.  
282c0 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 20      if( iCol<0  
282d0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 72 6f  .       || (pPro
282e0 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  be->onError!=OE_
282f0 4e 6f 6e 65 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d  None && nInMul==
28300 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
28310 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
28320 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  q==pProbe->nColu
28330 6d 6e 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20  mn-1).      ){. 
28340 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
28350 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
28360 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
28370 3d 3d 30 20 7c 7c 20 69 43 6f 6c 3c 30 20 29 3b  ==0 || iCol<0 );
28380 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
28390 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
283a0 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 7d 0a  ONEROW;.      }.
283b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
283c0 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20  ree.nEq++;.     
283d0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52   pNew->nOut = nR
283e0 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 3b 0a  owEst + nInMul;.
283f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
28400 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
28410 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a   (WO_ISNULL) ){.
28420 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
28430 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
28440 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  UMN_NULL;.      
28450 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
28460 71 2b 2b 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55  q++;.      /* TU
28470 4e 49 4e 47 3a 20 49 53 20 4e 55 4c 4c 20 73 65  NING: IS NULL se
28480 6c 65 63 74 73 20 32 20 72 6f 77 73 20 2a 2f 0a  lects 2 rows */.
28490 20 20 20 20 20 20 6e 49 6e 20 3d 20 31 30 3b 20        nIn = 10; 
284a0 20 61 73 73 65 72 74 28 20 31 30 3d 3d 77 68 65   assert( 10==whe
284b0 72 65 43 6f 73 74 28 32 29 20 29 3b 0a 20 20 20  reCost(2) );.   
284c0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
284d0 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c  nRowEst + nInMul
284e0 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c 73   + nIn;.    }els
284f0 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70  e if( pTerm->eOp
28500 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c  erator & (WO_GT|
28510 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20  WO_GE) ){.      
28520 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
28530 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
28540 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
28550 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
28560 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29  erator & WO_GE )
28570 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
28580 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
28590 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
285a0 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
285b0 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b     pBtm = pTerm;
285c0 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b  .      pTop = 0;
285d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
285e0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
285f0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
28600 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20  _LT|WO_LE) );.  
28610 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
28620 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
28630 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20   WO_LT );.      
28640 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
28650 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
28660 4c 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  LE );.      pNew
28670 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
28680 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
28690 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
286a0 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54  .      pTop = pT
286b0 65 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20  erm;.      pBtm 
286c0 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  = (pNew->wsFlags
286d0 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
286e0 49 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20  IT)!=0 ?.       
286f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
28700 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
28710 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a  >nLTerm-2] : 0;.
28720 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4e      }.    if( pN
28730 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
28740 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
28750 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a   ){.      /* Adj
28760 75 73 74 20 6e 4f 75 74 20 61 6e 64 20 72 52 75  ust nOut and rRu
28770 6e 20 66 6f 72 20 53 54 41 54 33 20 72 61 6e 67  n for STAT3 rang
28780 65 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20  e values */.    
28790 20 20 57 68 65 72 65 43 6f 73 74 20 72 44 69 76    WhereCost rDiv
287a0 3b 0a 20 20 20 20 20 20 77 68 65 72 65 52 61 6e  ;.      whereRan
287b0 67 65 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  geScanEst(pParse
287c0 2c 20 70 50 72 6f 62 65 2c 20 70 4e 65 77 2d 3e  , pProbe, pNew->
287d0 75 2e 62 74 72 65 65 2e 6e 45 71 2c 0a 20 20 20  u.btree.nEq,.   
287e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287f0 20 20 20 20 20 70 42 74 6d 2c 20 70 54 6f 70 2c       pBtm, pTop,
28800 20 26 72 44 69 76 29 3b 0a 20 20 20 20 20 20 70   &rDiv);.      p
28810 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
28820 64 5f 6e 4f 75 74 3e 72 44 69 76 2b 31 30 20 3f  d_nOut>rDiv+10 ?
28830 20 73 61 76 65 64 5f 6e 4f 75 74 20 2d 20 72 44   saved_nOut - rD
28840 69 76 20 3a 20 31 30 3b 0a 20 20 20 20 7d 0a 23  iv : 10;.    }.#
28850 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
28860 42 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 69 66  BLE_STAT3.    if
28870 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
28880 6e 45 71 3d 3d 31 20 26 26 20 70 50 72 6f 62 65  nEq==1 && pProbe
28890 2d 3e 6e 53 61 6d 70 6c 65 0a 20 20 20 20 20 26  ->nSample.     &
288a0 26 20 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  &  OptimizationE
288b0 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
288c0 45 5f 53 74 61 74 33 29 20 29 7b 0a 20 20 20 20  E_Stat3) ){.    
288d0 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d    tRowcnt nOut =
288e0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   0;.      if( (p
288f0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
28900 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55  & (WO_EQ|WO_ISNU
28910 4c 4c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  LL))!=0 ){.     
28920 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
28930 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
28940 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
28950 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
28960 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
28970 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
28980 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
28990 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
289a0 2c 20 70 50 72 6f 62 65 2c 20 70 54 65 72 6d 2d  , pProbe, pTerm-
289b0 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
289c0 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65  &nOut);.      }e
289d0 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  lse if( (pTerm->
289e0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
289f0 4e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  N).             
28a00 26 26 20 20 21 45 78 70 72 48 61 73 50 72 6f 70  &&  !ExprHasProp
28a10 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
28a20 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
28a30 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20    ){.        rc 
28a40 3d 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74  = whereInScanEst
28a50 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c  (pParse, pProbe,
28a60 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 78   pTerm->pExpr->x
28a70 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a  .pList, &nOut);.
28a80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
28a90 73 65 72 74 28 20 6e 4f 75 74 3d 3d 30 20 7c 7c  sert( nOut==0 ||
28aa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28ab0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74  ;.      if( nOut
28ac0 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20   ) pNew->nOut = 
28ad0 77 68 65 72 65 43 6f 73 74 28 6e 4f 75 74 29 3b  whereCost(nOut);
28ae0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
28af0 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46    if( (pNew->wsF
28b00 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 44  lags & (WHERE_ID
28b10 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b  X_ONLY|WHERE_IPK
28b20 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ))==0 ){.      /
28b30 2a 20 45 61 63 68 20 72 6f 77 20 69 6e 76 6f 6c  * Each row invol
28b40 76 65 73 20 61 20 73 74 65 70 20 6f 66 20 74 68  ves a step of th
28b50 65 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 61 20  e index, then a 
28b60 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 6f 66  binary search of
28b70 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61  .      ** the ma
28b80 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  in table */.    
28b90 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 20    pNew->rRun =  
28ba0 77 68 65 72 65 43 6f 73 74 41 64 64 28 70 4e 65  whereCostAdd(pNe
28bb0 77 2d 3e 72 52 75 6e 2c 20 72 4c 6f 67 53 69 7a  w->rRun, rLogSiz
28bc0 65 3e 32 37 20 3f 20 72 4c 6f 67 53 69 7a 65 2d  e>27 ? rLogSize-
28bd0 31 37 20 3a 20 31 30 29 3b 0a 20 20 20 20 7d 0a  17 : 10);.    }.
28be0 20 20 20 20 2f 2a 20 53 74 65 70 20 63 6f 73 74      /* Step cost
28bf0 20 66 6f 72 20 65 61 63 68 20 6f 75 74 70 75 74   for each output
28c00 20 72 6f 77 20 2a 2f 0a 20 20 20 20 70 4e 65 77   row */.    pNew
28c10 2d 3e 72 52 75 6e 20 3d 20 77 68 65 72 65 43 6f  ->rRun = whereCo
28c20 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e  stAdd(pNew->rRun
28c30 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20  , pNew->nOut);. 
28c40 20 20 20 2f 2a 20 54 42 44 3a 20 41 64 6a 75 73     /* TBD: Adjus
28c50 74 20 6e 4f 75 74 20 66 6f 72 20 61 64 64 69 74  t nOut for addit
28c60 69 6f 6e 61 6c 20 63 6f 6e 73 74 72 61 69 6e 74  ional constraint
28c70 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 68  s */.    rc = wh
28c80 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
28c90 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
28ca0 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73     if( (pNew->ws
28cb0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
28cc0 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20  P_LIMIT)==0.    
28cd0 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65   && pNew->u.btre
28ce0 65 2e 6e 45 71 3c 28 70 50 72 6f 62 65 2d 3e 6e  e.nEq<(pProbe->n
28cf0 43 6f 6c 75 6d 6e 20 2b 20 28 70 50 72 6f 62 65  Column + (pProbe
28d00 2d 3e 7a 4e 61 6d 65 21 3d 30 29 29 0a 20 20 20  ->zName!=0)).   
28d10 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c   ){.      whereL
28d20 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78  oopAddBtreeIndex
28d30 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c  (pBuilder, pSrc,
28d40 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b   pProbe, nInMul+
28d50 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nIn);.    }.  }.
28d60 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
28d70 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20   saved_prereq;. 
28d80 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
28d90 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a  Eq = saved_nEq;.
28da0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
28db0 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  = saved_wsFlags;
28dc0 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20  .  pNew->nOut = 
28dd0 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e  saved_nOut;.  pN
28de0 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76  ew->nLTerm = sav
28df0 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 72 65 74  ed_nLTerm;.  ret
28e00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
28e10 20 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20   Return True if 
28e20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
28e30 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74  hat pIndex might
28e40 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a   be useful in.**
28e50 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
28e60 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
28e70 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a  e in pBuilder..*
28e80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73  *.** Return Fals
28e90 65 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f  e if pBuilder do
28ea0 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
28eb0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
28ec0 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  e or.** if there
28ed0 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70   is no way for p
28ee0 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66  Index to be usef
28ef0 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69  ul in implementi
28f00 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52  ng that.** ORDER
28f10 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73   BY clause..*/.s
28f20 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d  tatic int indexM
28f30 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65  ightHelpWithOrde
28f40 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  rBy(.  WhereLoop
28f50 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
28f60 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  r,.  Index *pInd
28f70 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f  ex,.  int iCurso
28f80 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  r.){.  ExprList 
28f90 2a 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20  *pOB;.  int ii, 
28fa0 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65  jj;..  if( pInde
28fb0 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20  x->bUnordered ) 
28fc0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
28fd0 28 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d  (pOB = pBuilder-
28fe0 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  >pWInfo->pOrderB
28ff0 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  y)==0 ) return 0
29000 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
29010 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  <pOB->nExpr; ii+
29020 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
29030 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
29040 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42  rSkipCollate(pOB
29050 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a  ->a[ii].pExpr);.
29060 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
29070 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72  p!=TK_COLUMN ) r
29080 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
29090 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
290a0 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
290b0 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49   for(jj=0; jj<pI
290c0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a  ndex->nColumn; j
290d0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
290e0 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
290f0 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ==pIndex->aiColu
29100 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20  mn[jj] ) return 
29110 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
29120 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
29130 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
29140 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65   a bitmask where
29150 20 31 73 20 69 6e 64 69 63 61 74 65 20 74 68 61   1s indicate tha
29160 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
29170 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  ing column of.**
29180 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 75 73   the table is us
29190 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20  ed by an index. 
291a0 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   Only the first 
291b0 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63  63 columns are c
291c0 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74  onsidered..*/.st
291d0 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c  atic Bitmask col
291e0 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65  umnsInIndex(Inde
291f0 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d  x *pIdx){.  Bitm
29200 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74  ask m = 0;.  int
29210 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78   j;.  for(j=pIdx
29220 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d  ->nColumn-1; j>=
29230 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; j--){.    int
29240 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   x = pIdx->aiCol
29250 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 61 73 73 65  umn[j];.    asse
29260 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20  rt( x>=0 );.    
29270 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
29280 2d 31 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  -1 );.    testca
29290 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a  se( x==BMS-2 );.
292a0 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20      if( x<BMS-1 
292b0 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78  ) m |= MASKBIT(x
292c0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
292d0 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74  m;.}../* Check t
292e0 6f 20 73 65 65 20 69 66 20 61 20 70 61 72 74 69  o see if a parti
292f0 61 6c 20 69 6e 64 65 78 20 77 69 74 68 20 70 50  al index with pP
29300 61 72 74 49 6e 64 65 78 57 68 65 72 65 20 63 61  artIndexWhere ca
29310 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20  n be used.** in 
29320 74 68 65 20 63 75 72 72 65 6e 74 20 71 75 65 72  the current quer
29330 79 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  y.  Return true 
29340 69 66 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64  if it can be and
29350 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a   false if not..*
29360 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
29370 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49  reUsablePartialI
29380 6e 64 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57  ndex(int iTab, W
29390 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
293a0 20 45 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a   Expr *pWhere){.
293b0 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
293c0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 66  Term *pTerm;.  f
293d0 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57  or(i=0, pTerm=pW
293e0 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
293f0 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
29400 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
29410 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
29420 72 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  r(pTerm->pExpr, 
29430 70 57 68 65 72 65 2c 20 69 54 61 62 29 20 29 20  pWhere, iTab) ) 
29440 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
29450 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
29460 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65  ** Add all Where
29470 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72  Loop objects for
29480 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
29490 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77 68 65 72  of the join wher
294a0 65 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69  e the table.** i
294b0 73 20 69 64 65 6e 66 69 65 64 20 62 79 20 70 42  s idenfied by pB
294c0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54  uilder->pNew->iT
294d0 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20  ab.  That table 
294e0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
294f0 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20   be.** a b-tree 
29500 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72  table, not a vir
29510 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  tual table..*/.s
29520 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
29530 6f 6f 70 41 64 64 42 74 72 65 65 28 0a 20 20 57  oopAddBtree(.  W
29540 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
29550 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48  *pBuilder, /* WH
29560 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72  ERE clause infor
29570 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  mation */.  Bitm
29580 61 73 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20  ask mExtra      
29590 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
295a0 20 70 72 65 72 65 71 75 65 73 69 74 65 73 20 66   prerequesites f
295b0 6f 72 20 75 73 69 6e 67 20 74 68 69 73 20 74 61  or using this ta
295c0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ble */.){.  Wher
295d0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
295e0 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
295f0 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78   analysis contex
29600 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  t */.  Index *pP
29610 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20  robe;           
29620 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77     /* An index w
29630 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67  e are evaluating
29640 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b   */.  Index sPk;
29650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29660 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65    /* A fake inde
29670 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65  x object for the
29680 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a   primary key */.
29690 20 20 74 52 6f 77 63 6e 74 20 61 69 52 6f 77 45    tRowcnt aiRowE
296a0 73 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20 2f 2a  stPk[2];      /*
296b0 20 54 68 65 20 61 69 52 6f 77 45 73 74 5b 5d 20   The aiRowEst[] 
296c0 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50  value for the sP
296d0 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  k index */.  int
296e0 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31   aiColumnPk = -1
296f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
29700 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20  aColumn[] value 
29710 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65  for the sPk inde
29720 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  x */.  SrcList *
29730 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20  pTabList;       
29740 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
29750 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
29760 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
29770 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52  pSrc;  /* The FR
29780 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65 20  OM clause btree 
29790 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20  term to add */. 
297a0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
297b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
297c0 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f  Template WhereLo
297d0 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  op object */.  i
297e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
297f0 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  K;         /* Re
29800 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
29810 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b  nt iSortIdx = 1;
29820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
29830 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
29840 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20 20  int b;          
29850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
29860 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a   boolean value *
29870 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72 53  /.  WhereCost rS
29880 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
29890 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* number of row
298a0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
298b0 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72 4c  /.  WhereCost rL
298c0 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ogSize;         
298d0 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20  /* Logarithm of 
298e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
298f0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
29900 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
29910 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
29920 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20 57   /* The parsed W
29930 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
29940 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c   .  pNew = pBuil
29950 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57 49  der->pNew;.  pWI
29960 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
29970 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c 69  pWInfo;.  pTabLi
29980 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
29990 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20 3d 20  bList;.  pSrc = 
299a0 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e  pTabList->a + pN
299b0 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70 57 43 20  ew->iTab;.  pWC 
299c0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
299d0 0a 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69  .  assert( !IsVi
299e0 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62  rtual(pSrc->pTab
299f0 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63  ) );..  if( pSrc
29a00 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ->pIndex ){.    
29a10 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59  /* An INDEXED BY
29a20 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65   clause specifie
29a30 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  s a particular i
29a40 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20  ndex to use */. 
29a50 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63     pProbe = pSrc
29a60 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  ->pIndex;.  }els
29a70 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
29a80 69 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59  is no INDEXED BY
29a90 20 63 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65   clause.  Create
29aa0 20 61 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62   a fake Index ob
29ab0 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20  ject in local.  
29ac0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50    ** variable sP
29ad0 6b 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74  k to represent t
29ae0 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79  he rowid primary
29af0 20 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b   key index.  Mak
29b00 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61  e this.    ** fa
29b10 6b 65 20 69 6e 64 65 78 20 74 68 65 20 66 69 72  ke index the fir
29b20 73 74 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66  st in a chain of
29b30 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77   Index objects w
29b40 69 74 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72  ith all of the r
29b50 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63  eal.    ** indic
29b60 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a  es to follow */.
29b70 20 20 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73      Index *pFirs
29b80 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
29b90 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20      /* First of 
29ba0 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20  real indices on 
29bb0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
29bc0 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c   memset(&sPk, 0,
29bd0 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b   sizeof(Index));
29be0 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e  .    sPk.nColumn
29bf0 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69   = 1;.    sPk.ai
29c00 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75  Column = &aiColu
29c10 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69  mnPk;.    sPk.ai
29c20 52 6f 77 45 73 74 20 3d 20 61 69 52 6f 77 45 73  RowEst = aiRowEs
29c30 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45  tPk;.    sPk.onE
29c40 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63  rror = OE_Replac
29c50 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c  e;.    sPk.pTabl
29c60 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  e = pSrc->pTab;.
29c70 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30      aiRowEstPk[0
29c80 5d 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  ] = pSrc->pTab->
29c90 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 61 69 52  nRowEst;.    aiR
29ca0 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a  owEstPk[1] = 1;.
29cb0 20 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72      pFirst = pSr
29cc0 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  c->pTab->pIndex;
29cd0 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  .    if( pSrc->n
29ce0 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a  otIndexed==0 ){.
29cf0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61        /* The rea
29d00 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65  l indices of the
29d10 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20   table are only 
29d20 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68  considered if th
29d30 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49  e.      ** NOT I
29d40 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72  NDEXED qualifier
29d50 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   is omitted from
29d60 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
29d70 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e   */.      sPk.pN
29d80 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20  ext = pFirst;.  
29d90 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d    }.    pProbe =
29da0 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69   &sPk;.  }.  rSi
29db0 7a 65 20 3d 20 77 68 65 72 65 43 6f 73 74 28 70  ze = whereCost(p
29dc0 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45  Src->pTab->nRowE
29dd0 73 74 29 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20  st);.  rLogSize 
29de0 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b  = estLog(rSize);
29df0 0a 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63  ..  /* Automatic
29e00 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66   indexes */.  if
29e10 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  ( !pBuilder->pOr
29e20 53 65 74 0a 20 20 20 26 26 20 28 70 57 49 6e 66  Set.   && (pWInf
29e30 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  o->pParse->db->f
29e40 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75  lags & SQLITE_Au
29e50 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26  toIndex)!=0.   &
29e60 26 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d  & pSrc->pIndex==
29e70 30 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 76  0.   && !pSrc->v
29e80 69 61 43 6f 72 6f 75 74 69 6e 65 0a 20 20 20 26  iaCoroutine.   &
29e90 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65  & !pSrc->notInde
29ea0 78 65 64 0a 20 20 20 26 26 20 21 70 53 72 63 2d  xed.   && !pSrc-
29eb0 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 0a 20 20  >isCorrelated.  
29ec0 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ){.    /* Genera
29ed0 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68  te auto-index Wh
29ee0 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20  ereLoops */.    
29ef0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
29f00 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
29f10 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61  *pWCEnd = pWC->a
29f20 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20   + pWC->nTerm;. 
29f30 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
29f40 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ->a; rc==SQLITE_
29f50 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45  OK && pTerm<pWCE
29f60 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
29f70 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
29f80 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
29f90 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
29fa0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
29fb0 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
29fc0 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
29fd0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   0) ){.        p
29fe0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
29ff0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 1;.        pN
2a000 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
2a010 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ex = 0;.        
2a020 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  pNew->nLTerm = 1
2a030 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2a040 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
2a050 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  m;.        /* TU
2a060 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63  NING: One-time c
2a070 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e  ost for computin
2a080 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  g the automatic 
2a090 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20 20 20  index is.       
2a0a0 20 2a 2a 20 61 70 70 72 6f 78 69 6d 61 74 65 6c   ** approximatel
2a0b0 79 20 37 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68  y 7*N*log2(N) wh
2a0c0 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
2a0d0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20  ber of rows in. 
2a0e0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61         ** the ta
2a0f0 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65  ble being indexe
2a100 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  d. */.        pN
2a110 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f  ew->rSetup = rLo
2a120 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 20 2b 20  gSize + rSize + 
2a130 32 38 3b 20 20 61 73 73 65 72 74 28 20 32 38 3d  28;  assert( 28=
2a140 3d 77 68 65 72 65 43 6f 73 74 28 37 29 20 29 3b  =whereCost(7) );
2a150 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  .        /* TUNI
2a160 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c  NG: Each index l
2a170 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30 20  ookup yields 20 
2a180 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
2a190 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20 20  e.  This.       
2a1a0 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61 6e   ** is more than
2a1b0 20 74 68 65 20 75 73 75 61 6c 20 67 75 65 73 73   the usual guess
2a1c0 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69 6e   of 10 rows, sin
2a1d0 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77 61  ce we have no wa
2a1e0 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  y.        ** of 
2a1f0 6b 6e 6f 77 6e 69 6e 67 20 68 6f 77 20 73 65 6c  knowning how sel
2a200 65 63 74 69 76 65 20 74 68 65 20 69 6e 64 65 78  ective the index
2a210 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79   will ultimately
2a220 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20   be.  It would. 
2a230 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65         ** not be
2a240 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f   unreasonable to
2a250 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65   make this value
2a260 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f   much larger. */
2a270 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
2a280 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72  Out = 43;  asser
2a290 74 28 20 34 33 3d 3d 77 68 65 72 65 43 6f 73 74  t( 43==whereCost
2a2a0 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20  (20) );.        
2a2b0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 77 68 65  pNew->rRun = whe
2a2c0 72 65 43 6f 73 74 41 64 64 28 72 4c 6f 67 53 69  reCostAdd(rLogSi
2a2d0 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a  ze,pNew->nOut);.
2a2e0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
2a2f0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41 55  Flags = WHERE_AU
2a300 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20  TO_INDEX;.      
2a310 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
2a320 20 6d 45 78 74 72 61 20 7c 20 70 54 65 72 6d 2d   mExtra | pTerm-
2a330 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20  >prereqRight;.  
2a340 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2a350 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
2a360 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
2a370 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2a380 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c   /* Loop over al
2a390 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20  l indices.  */. 
2a3a0 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54   for(; rc==SQLIT
2a3b0 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20  E_OK && pProbe; 
2a3c0 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70  pProbe=pProbe->p
2a3d0 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b  Next, iSortIdx++
2a3e0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62  ){.    if( pProb
2a3f0 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  e->pPartIdxWhere
2a400 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77 68 65  !=0.     && !whe
2a410 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49  reUsablePartialI
2a420 6e 64 65 78 28 70 4e 65 77 2d 3e 69 54 61 62 2c  ndex(pNew->iTab,
2a430 20 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e 70 50   pWC, pProbe->pP
2a440 61 72 74 49 64 78 57 68 65 72 65 29 20 29 7b 0a  artIdxWhere) ){.
2a450 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
2a460 20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64 65   /* Partial inde
2a470 78 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 20  x inappropriate 
2a480 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 20 2a  for this query *
2a490 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  /.    }.    pNew
2a4a0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
2a4b0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  0;.    pNew->nLT
2a4c0 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  erm = 0;.    pNe
2a4d0 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b  w->iSortIdx = 0;
2a4e0 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  .    pNew->rSetu
2a4f0 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  p = 0;.    pNew-
2a500 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61  >prereq = mExtra
2a510 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  ;.    pNew->nOut
2a520 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 70 4e   = rSize;.    pN
2a530 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
2a540 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20  ex = pProbe;.   
2a550 20 62 20 3d 20 69 6e 64 65 78 4d 69 67 68 74 48   b = indexMightH
2a560 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 70  elpWithOrderBy(p
2a570 42 75 69 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c  Builder, pProbe,
2a580 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b   pSrc->iCursor);
2a590 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50  .    /* The ONEP
2a5a0 41 53 53 5f 44 45 53 49 52 45 44 20 66 6c 61 67  ASS_DESIRED flag
2a5b0 73 20 6e 65 76 65 72 20 6f 63 63 75 72 73 20 74  s never occurs t
2a5c0 6f 67 65 74 68 65 72 20 77 69 74 68 20 4f 52 44  ogether with ORD
2a5d0 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 61 73 73  ER BY */.    ass
2a5e0 65 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63  ert( (pWInfo->wc
2a5f0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2a600 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
2a610 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a  )==0 || b==0 );.
2a620 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
2a630 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20  tnum<=0 ){.     
2a640 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72 69 6d   /* Integer prim
2a650 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 2a 2f  ary key index */
2a660 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
2a670 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 50 4b  lags = WHERE_IPK
2a680 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c  ;..      /* Full
2a690 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20   table scan */. 
2a6a0 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
2a6b0 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49  Idx = b ? iSortI
2a6c0 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 2f 2a  dx : 0;.      /*
2a6d0 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
2a6e0 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
2a6f0 20 69 73 20 33 2a 28 4e 20 2b 20 6c 6f 67 32 28   is 3*(N + log2(
2a700 4e 29 29 2e 0a 20 20 20 20 20 20 2a 2a 20 20 2b  N))..      **  +
2a710 20 20 54 68 65 20 65 78 74 72 61 20 33 20 66 61    The extra 3 fa
2a720 63 74 6f 72 20 69 73 20 74 6f 20 65 6e 63 6f 75  ctor is to encou
2a730 72 61 67 65 20 74 68 65 20 75 73 65 20 6f 66 20  rage the use of 
2a740 69 6e 64 65 78 65 64 20 6c 6f 6f 6b 75 70 73 0a  indexed lookups.
2a750 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f 76 65        **     ove
2a760 72 20 66 75 6c 6c 20 73 63 61 6e 73 2e 20 20 41  r full scans.  A
2a770 20 73 6d 61 6c 6c 65 72 20 63 6f 6e 73 74 61 6e   smaller constan
2a780 74 20 32 20 69 73 20 75 73 65 64 20 66 6f 72 20  t 2 is used for 
2a790 63 6f 76 65 72 69 6e 67 0a 20 20 20 20 20 20 2a  covering.      *
2a7a0 2a 20 20 20 20 20 69 6e 64 65 78 20 73 63 61 6e  *     index scan
2a7b0 73 20 73 6f 20 74 68 61 74 20 61 20 63 6f 76 65  s so that a cove
2a7c0 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20  ring index scan 
2a7d0 77 69 6c 6c 20 62 65 20 66 61 76 6f 72 65 64 20  will be favored 
2a7e0 6f 76 65 72 0a 20 20 20 20 20 20 2a 2a 20 20 20  over.      **   
2a7f0 20 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e 20    a table scan. 
2a800 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  */.      pNew->r
2a810 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 41  Run = whereCostA
2a820 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69 7a  dd(rSize,rLogSiz
2a830 65 29 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 72  e) + 16;.      r
2a840 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
2a850 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2a860 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ew);.      if( r
2a870 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  c ) break;.    }
2a880 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d  else{.      Bitm
2a890 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f  ask m = pSrc->co
2a8a0 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73  lUsed & ~columns
2a8b0 49 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29 3b  InIndex(pProbe);
2a8c0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
2a8d0 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20  lags = (m==0) ? 
2a8e0 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c  (WHERE_IDX_ONLY|
2a8f0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20 3a  WHERE_INDEXED) :
2a900 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a   WHERE_INDEXED;.
2a910 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73  .      /* Full s
2a920 63 61 6e 20 76 69 61 20 69 6e 64 65 78 20 2a 2f  can via index */
2a930 0a 20 20 20 20 20 20 69 66 28 20 62 0a 20 20 20  .      if( b.   
2a940 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20      || ( m==0.  
2a950 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65         && pProbe
2a960 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a  ->bUnordered==0.
2a970 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
2a980 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2a990 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
2a9a0 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20  DESIRED)==0.    
2a9b0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 47       && sqlite3G
2a9c0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65  lobalConfig.bUse
2a9d0 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26 20  Cis.         && 
2a9e0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
2a9f0 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  led(pWInfo->pPar
2aa00 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43  se->db, SQLITE_C
2aa10 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20  overIdxScan).   
2aa20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 29         ).      )
2aa30 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
2aa40 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69  iSortIdx = b ? i
2aa50 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20  SortIdx : 0;.   
2aa60 20 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b       if( m==0 ){
2aa70 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55  .          /* TU
2aa80 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20  NING: Cost of a 
2aa90 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73  covering index s
2aaa0 63 61 6e 20 69 73 20 32 2a 28 4e 20 2b 20 6c 6f  can is 2*(N + lo
2aab0 67 32 28 4e 29 29 2e 0a 20 20 20 20 20 20 20 20  g2(N))..        
2aac0 20 20 2a 2a 20 20 2b 20 20 54 68 65 20 65 78 74    **  +  The ext
2aad0 72 61 20 32 20 66 61 63 74 6f 72 20 69 73 20 74  ra 2 factor is t
2aae0 6f 20 65 6e 63 6f 75 72 61 67 65 20 74 68 65 20  o encourage the 
2aaf0 75 73 65 20 6f 66 20 69 6e 64 65 78 65 64 20 6c  use of indexed l
2ab00 6f 6f 6b 75 70 73 0a 20 20 20 20 20 20 20 20 20  ookups.         
2ab10 20 2a 2a 20 20 20 20 20 6f 76 65 72 20 69 6e 64   **     over ind
2ab20 65 78 20 73 63 61 6e 73 2e 20 20 41 20 74 61 62  ex scans.  A tab
2ab30 6c 65 20 73 63 61 6e 20 75 73 65 73 20 61 20 66  le scan uses a f
2ab40 61 63 74 6f 72 20 6f 66 20 33 20 73 6f 20 74 68  actor of 3 so th
2ab50 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  at.          ** 
2ab60 20 20 20 20 69 6e 64 65 78 20 73 63 61 6e 73 20      index scans 
2ab70 61 72 65 20 66 61 76 6f 72 65 64 20 6f 76 65 72  are favored over
2ab80 20 74 61 62 6c 65 20 73 63 61 6e 73 2e 0a 20 20   table scans..  
2ab90 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 20 49          **  +  I
2aba0 66 20 74 68 69 73 20 63 6f 76 65 72 69 6e 67 20  f this covering 
2abb0 69 6e 64 65 78 20 6d 69 67 68 74 20 61 6c 73 6f  index might also
2abc0 20 68 65 6c 70 20 73 61 74 69 73 66 79 20 74 68   help satisfy th
2abd0 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 20  e ORDER BY.     
2abe0 20 20 20 20 20 2a 2a 20 20 20 20 20 63 6c 61 75       **     clau
2abf0 73 65 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 73  se, then the cos
2ac00 74 20 69 73 20 66 75 64 67 65 64 20 64 6f 77 6e  t is fudged down
2ac10 20 73 6c 69 67 68 74 6c 79 20 73 6f 20 74 68 61   slightly so tha
2ac20 74 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  t this.         
2ac30 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 69 73   **     index is
2ac40 20 66 61 76 6f 72 65 64 20 61 62 6f 76 65 20 6f   favored above o
2ac50 74 68 65 72 20 69 6e 64 69 63 65 73 20 74 68 61  ther indices tha
2ac60 74 20 68 61 76 65 20 6e 6f 20 68 6f 70 65 20 6f  t have no hope o
2ac70 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  f.          **  
2ac80 20 20 20 68 65 6c 70 69 6e 67 20 77 69 74 68 20     helping with 
2ac90 74 68 65 20 4f 52 44 45 52 20 42 59 2e 20 2a 2f  the ORDER BY. */
2aca0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
2acb0 3e 72 52 75 6e 20 3d 20 31 30 20 2b 20 77 68 65  >rRun = 10 + whe
2acc0 72 65 43 6f 73 74 41 64 64 28 72 53 69 7a 65 2c  reCostAdd(rSize,
2acd0 72 4c 6f 67 53 69 7a 65 29 20 2d 20 62 3b 0a 20  rLogSize) - b;. 
2ace0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2acf0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2ad00 62 21 3d 30 20 29 3b 20 0a 20 20 20 20 20 20 20  b!=0 ); .       
2ad10 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
2ad20 73 74 20 6f 66 20 73 63 61 6e 6e 69 6e 67 20 61  st of scanning a
2ad30 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e   non-covering in
2ad40 64 65 78 20 69 73 20 28 4e 2b 31 29 2a 6c 6f 67  dex is (N+1)*log
2ad50 32 28 4e 29 0a 20 20 20 20 20 20 20 20 20 20 2a  2(N).          *
2ad60 2a 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c 20  * which we will 
2ad70 73 69 6d 70 6c 69 66 79 20 74 6f 20 6a 75 73 74  simplify to just
2ad80 20 4e 2a 6c 6f 67 32 28 4e 29 20 2a 2f 0a 20 20   N*log2(N) */.  
2ad90 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
2ada0 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 72 4c 6f  un = rSize + rLo
2adb0 67 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d  gSize;.        }
2adc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
2add0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
2ade0 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
2adf0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
2ae00 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2ae10 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 77 68     }.    rc = wh
2ae20 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
2ae30 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70  ndex(pBuilder, p
2ae40 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b  Src, pProbe, 0);
2ae50 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
2ae60 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44  e was an INDEXED
2ae70 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
2ae80 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69   only that one i
2ae90 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63  ndex is.    ** c
2aea0 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20  onsidered. */.  
2aeb0 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64    if( pSrc->pInd
2aec0 65 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ex ) break;.  }.
2aed0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2aee0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2aef0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2af00 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57  ./*.** Add all W
2af10 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
2af20 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66 20   for a table of 
2af30 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66  the join identif
2af40 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64  ied by.** pBuild
2af50 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20  er->pNew->iTab. 
2af60 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67   That table is g
2af70 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
2af80 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
2af90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2afa0 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
2afb0 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  al(.  WhereLoopB
2afc0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
2afd0 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75     /* WHERE clau
2afe0 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  se information *
2aff0 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
2b000 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
2b010 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61      /* WHERE ana
2b020 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f  lysis context */
2b030 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2b040 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b050 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
2b060 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
2b070 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
2b080 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2b090 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
2b0a0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2b0b0 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f  _item *pSrc;   /
2b0c0 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
2b0d0 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
2b0e0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
2b0f0 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
2b100 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
2b110 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
2b120 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
2b130 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
2b140 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20  int *pIdxCons;. 
2b150 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
2b160 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
2b170 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
2b180 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
2b190 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  rm;.  int i, j;.
2b1a0 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54    int iTerm, mxT
2b1b0 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73  erm;.  int nCons
2b1c0 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65  traint;.  int se
2b1d0 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  enIn = 0;       
2b1e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2b1f0 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  f an IN operator
2b200 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e   is seen */.  in
2b210 74 20 73 65 65 6e 56 61 72 20 3d 20 30 3b 20 20  t seenVar = 0;  
2b220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2b230 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73  ue if a non-cons
2b240 74 61 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  tant constraint 
2b250 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74  is seen */.  int
2b260 20 69 50 68 61 73 65 3b 20 20 20 20 20 20 20 20   iPhase;        
2b270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20            /* 0: 
2b280 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a  const w/o IN, 1:
2b290 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e   const, 2: no IN
2b2a0 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68  ,  2: IN */.  Wh
2b2b0 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20  ereLoop *pNew;. 
2b2c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2b2d0 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d  _OK;..  pWInfo =
2b2e0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
2b2f0 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  o;.  pParse = pW
2b300 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
2b310 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2b320 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65  .  pWC = pBuilde
2b330 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d  r->pWC;.  pNew =
2b340 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
2b350 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66  .  pSrc = &pWInf
2b360 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
2b370 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54  New->iTab];.  pT
2b380 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  ab = pSrc->pTab;
2b390 0a 20 20 61 73 73 65 72 74 28 20 49 73 56 69 72  .  assert( IsVir
2b3a0 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 20 20  tual(pTab) );.  
2b3b0 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63  pIdxInfo = alloc
2b3c0 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61  ateIndexInfo(pPa
2b3d0 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20  rse, pWC, pSrc, 
2b3e0 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72  pBuilder->pOrder
2b3f0 42 79 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  By);.  if( pIdxI
2b400 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  nfo==0 ) return 
2b410 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2b420 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30  pNew->prereq = 0
2b430 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70  ;.  pNew->rSetup
2b440 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73   = 0;.  pNew->ws
2b450 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  Flags = WHERE_VI
2b460 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e  RTUALTABLE;.  pN
2b470 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a  ew->nLTerm = 0;.
2b480 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
2b490 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 70  eedFree = 0;.  p
2b4a0 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f  Usage = pIdxInfo
2b4b0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
2b4c0 67 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e  ge;.  nConstrain
2b4d0 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  t = pIdxInfo->nC
2b4e0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28  onstraint;.  if(
2b4f0 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
2b500 28 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73  (db, pNew, nCons
2b510 74 72 61 69 6e 74 29 20 29 7b 0a 20 20 20 20 73  traint) ){.    s
2b520 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2b530 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20   pIdxInfo);.    
2b540 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2b550 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  MEM;.  }..  for(
2b560 69 50 68 61 73 65 3d 30 3b 20 69 50 68 61 73 65  iPhase=0; iPhase
2b570 3c 3d 33 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a  <=3; iPhase++){.
2b580 20 20 20 20 69 66 28 20 21 73 65 65 6e 49 6e 20      if( !seenIn 
2b590 26 26 20 28 69 50 68 61 73 65 26 31 29 21 3d 30  && (iPhase&1)!=0
2b5a0 20 29 7b 0a 20 20 20 20 20 20 69 50 68 61 73 65   ){.      iPhase
2b5b0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50  ++;.      if( iP
2b5c0 68 61 73 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a  hase>3 ) break;.
2b5d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73      }.    if( !s
2b5e0 65 65 6e 56 61 72 20 26 26 20 69 50 68 61 73 65  eenVar && iPhase
2b5f0 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  >1 ) break;.    
2b600 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72  pIdxCons = *(str
2b610 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
2b620 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
2b630 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
2b640 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69  raint;.    for(i
2b650 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
2b660 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
2b670 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
2b680 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e       j = pIdxCon
2b690 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  s->iTermOffset;.
2b6a0 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
2b6b0 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20  WC->a[j];.      
2b6c0 73 77 69 74 63 68 28 20 69 50 68 61 73 65 20 29  switch( iPhase )
2b6d0 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 30  {.        case 0
2b6e0 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74  :    /* Constant
2b6f0 73 20 77 69 74 68 6f 75 74 20 49 4e 20 6f 70 65  s without IN ope
2b700 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  rator */.       
2b710 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
2b720 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ble = 0;.       
2b730 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
2b740 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
2b750 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2b760 20 20 20 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a      seenIn = 1;.
2b770 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b780 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
2b790 3e 70 72 65 72 65 71 52 69 67 68 74 21 3d 30 20  >prereqRight!=0 
2b7a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2b7b0 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20  eenVar = 1;.    
2b7c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2b7d0 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
2b7e0 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b  r & WO_IN)==0 ){
2b7f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
2b800 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
2b810 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
2b820 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2b830 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20          case 1: 
2b840 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20     /* Constants 
2b850 77 69 74 68 20 49 4e 20 6f 70 65 72 61 74 6f 72  with IN operator
2b860 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  s */.          a
2b870 73 73 65 72 74 28 20 73 65 65 6e 49 6e 20 29 3b  ssert( seenIn );
2b880 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43  .          pIdxC
2b890 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70  ons->usable = (p
2b8a0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
2b8b0 74 3d 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t==0);.         
2b8c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2b8d0 63 61 73 65 20 32 3a 20 20 20 20 2f 2a 20 56 61  case 2:    /* Va
2b8e0 72 69 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20  riables without 
2b8f0 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  IN */.          
2b900 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20  assert( seenVar 
2b910 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  );.          pId
2b920 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
2b930 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
2b940 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20  r & WO_IN)==0;. 
2b950 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2b960 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
2b970 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20     /* Variables 
2b980 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20  with IN */.     
2b990 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65       assert( see
2b9a0 6e 56 61 72 20 26 26 20 73 65 65 6e 49 6e 20 29  nVar && seenIn )
2b9b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  ;.          pIdx
2b9c0 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31  Cons->usable = 1
2b9d0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2b9e0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
2b9f0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 55 73 61  .    memset(pUsa
2ba00 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55  ge, 0, sizeof(pU
2ba10 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66  sage[0])*pIdxInf
2ba20 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  o->nConstraint);
2ba30 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66  .    if( pIdxInf
2ba40 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
2ba50 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72  Str ) sqlite3_fr
2ba60 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  ee(pIdxInfo->idx
2ba70 53 74 72 29 3b 0a 20 20 20 20 70 49 64 78 49 6e  Str);.    pIdxIn
2ba80 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a  fo->idxStr = 0;.
2ba90 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
2baa0 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49  xNum = 0;.    pI
2bab0 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
2bac0 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
2bad0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
2bae0 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
2baf0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
2bb00 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53  stimatedCost = S
2bb10 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20  QLITE_BIG_DBL / 
2bb20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20 72  (double)2;.    r
2bb30 63 20 3d 20 76 74 61 62 42 65 73 74 49 6e 64 65  c = vtabBestInde
2bb40 78 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  x(pParse, pTab, 
2bb50 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 69  pIdxInfo);.    i
2bb60 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65  f( rc ) goto whe
2bb70 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78  reLoopAddVtab_ex
2bb80 69 74 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  it;.    pIdxCons
2bb90 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69   = *(struct sqli
2bba0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
2bbb0 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
2bbc0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->aConstraint;. 
2bbd0 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
2bbe0 3d 20 30 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20  = 0;.    mxTerm 
2bbf0 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
2bc00 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d  ( pNew->nLSlot>=
2bc10 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20  nConstraint );. 
2bc20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
2bc30 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20  onstraint; i++) 
2bc40 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20  pNew->aLTerm[i] 
2bc50 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  = 0;.    pNew->u
2bc60 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d  .vtab.omitMask =
2bc70 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
2bc80 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   i<nConstraint; 
2bc90 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29  i++, pIdxCons++)
2bca0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 54 65  {.      if( (iTe
2bcb0 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61  rm = pUsage[i].a
2bcc0 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30  rgvIndex - 1)>=0
2bcd0 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20   ){.        j = 
2bce0 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f  pIdxCons->iTermO
2bcf0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69  ffset;.        i
2bd00 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74  f( iTerm>=nConst
2bd10 72 61 69 6e 74 0a 20 20 20 20 20 20 20 20 20 7c  raint.         |
2bd20 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 20 20 7c  | j<0.         |
2bd30 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a  | j>=pWC->nTerm.
2bd40 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77           || pNew
2bd50 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21  ->aLTerm[iTerm]!
2bd60 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
2bd70 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2bd80 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
2bd90 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2bda0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
2bdb0 2e 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d 61  .xBestIndex() ma
2bdc0 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62  lfunction", pTab
2bdd0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
2bde0 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f      goto whereLo
2bdf0 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a  opAddVtab_exit;.
2be00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2be10 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
2be20 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31  m==nConstraint-1
2be30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
2be40 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20  case( j==0 );.  
2be50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2be60 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20  j==pWC->nTerm-1 
2be70 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  );.        pTerm
2be80 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20   = &pWC->a[j];. 
2be90 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65         pNew->pre
2bea0 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72  req |= pTerm->pr
2beb0 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20  ereqRight;.     
2bec0 20 20 20 61 73 73 65 72 74 28 20 69 54 65 72 6d     assert( iTerm
2bed0 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b  <pNew->nLSlot );
2bee0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  .        pNew->a
2bef0 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70  LTerm[iTerm] = p
2bf00 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
2bf10 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29  ( iTerm>mxTerm )
2bf20 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b   mxTerm = iTerm;
2bf30 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2bf40 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a  e( iTerm==15 );.
2bf50 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2bf60 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20  ( iTerm==16 );. 
2bf70 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d         if( iTerm
2bf80 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b 69 5d  <16 && pUsage[i]
2bf90 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e  .omit ) pNew->u.
2bfa0 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d  vtab.omitMask |=
2bfb0 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20   1<<iTerm;.     
2bfc0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
2bfd0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
2bfe0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2bff0 20 20 69 66 28 20 70 55 73 61 67 65 5b 69 5d 2e    if( pUsage[i].
2c000 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  omit==0 ){.     
2c010 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
2c020 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
2c030 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  an IN constraint
2c040 20 69 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   if the virtual 
2c050 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  table.          
2c060 20 20 2a 2a 20 73 61 79 73 20 74 68 61 74 20 74    ** says that t
2c070 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 45 51  he equivalent EQ
2c080 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e   constraint cann
2c090 6f 74 20 62 65 20 73 61 66 65 6c 79 20 6f 6d 69  ot be safely omi
2c0a0 74 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20  tted..          
2c0b0 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20 61 74    ** If we do at
2c0c0 74 65 6d 70 74 20 74 6f 20 75 73 65 20 73 75 63  tempt to use suc
2c0d0 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  h a constraint, 
2c0e0 73 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68 74 20  some rows might 
2c0f0 62 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  be.            *
2c100 2a 20 72 65 70 65 61 74 65 64 20 69 6e 20 74 68  * repeated in th
2c110 65 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20  e output. */.   
2c120 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2c130 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c140 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74 75        /* A virtu
2c150 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  al table that is
2c160 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20   constrained by 
2c170 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61 79  an IN clause may
2c180 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 20 20 2a   not.          *
2c190 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52  * consume the OR
2c1a0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 62 65  DER BY clause be
2c1b0 63 61 75 73 65 20 28 31 29 20 74 68 65 20 6f 72  cause (1) the or
2c1c0 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a  der of IN terms.
2c1d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
2c1e0 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
2c1f0 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 6f  related to the o
2c200 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20 74  rder of output t
2c210 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20 20  erms and.       
2c220 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70     ** (2) Multip
2c230 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20  le outputs from 
2c240 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75  a single IN valu
2c250 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65  e will not merge
2c260 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  .          ** to
2c270 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20  gether.  */.    
2c280 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
2c290 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
2c2a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
2c2b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2c2c0 20 69 66 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61   if( i>=nConstra
2c2d0 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  int ){.      pNe
2c2e0 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65  w->nLTerm = mxTe
2c2f0 72 6d 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65  rm+1;.      asse
2c300 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  rt( pNew->nLTerm
2c310 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29  <=pNew->nLSlot )
2c320 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
2c330 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49  vtab.idxNum = pI
2c340 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a  dxInfo->idxNum;.
2c350 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74        pNew->u.vt
2c360 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 70 49  ab.needFree = pI
2c370 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
2c380 65 65 49 64 78 53 74 72 3b 0a 20 20 20 20 20 20  eeIdxStr;.      
2c390 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
2c3a0 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
2c3b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74        pNew->u.vt
2c3c0 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49 64 78  ab.idxStr = pIdx
2c3d0 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20  Info->idxStr;.  
2c3e0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
2c3f0 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28 75 38  .isOrdered = (u8
2c400 29 28 28 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  )((pIdxInfo->nOr
2c410 64 65 72 42 79 21 3d 30 29 0a 20 20 20 20 20 20  derBy!=0).      
2c420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
2c440 26 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65  & pIdxInfo->orde
2c450 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20  rByConsumed);.  
2c460 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
2c470 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
2c480 2d 3e 72 52 75 6e 20 3d 20 77 68 65 72 65 43 6f  ->rRun = whereCo
2c490 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64  stFromDouble(pId
2c4a0 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
2c4b0 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Cost);.      /* 
2c4c0 54 55 4e 49 4e 47 3a 20 45 76 65 72 79 20 76 69  TUNING: Every vi
2c4d0 72 74 75 61 6c 20 74 61 62 6c 65 20 71 75 65 72  rtual table quer
2c4e0 79 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77  y returns 25 row
2c4f0 73 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  s */.      pNew-
2c500 3e 6e 4f 75 74 20 3d 20 34 36 3b 20 20 61 73 73  >nOut = 46;  ass
2c510 65 72 74 28 20 34 36 3d 3d 77 68 65 72 65 43 6f  ert( 46==whereCo
2c520 73 74 28 32 35 29 20 29 3b 0a 20 20 20 20 20 20  st(25) );.      
2c530 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
2c540 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
2c550 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d  .      if( pNew-
2c560 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
2c570 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2c580 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75  te3_free(pNew->u
2c590 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20  .vtab.idxStr);. 
2c5a0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76         pNew->u.v
2c5b0 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
2c5c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c5d0 20 20 7d 20 20 0a 0a 77 68 65 72 65 4c 6f 6f 70    }  ..whereLoop
2c5e0 41 64 64 56 74 61 62 5f 65 78 69 74 3a 0a 20 20  AddVtab_exit:.  
2c5f0 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  if( pIdxInfo->ne
2c600 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
2c610 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
2c620 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b  dxInfo->idxStr);
2c630 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
2c640 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  (db, pIdxInfo);.
2c650 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
2c660 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2c670 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2c680 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  E */../*.** Add 
2c690 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65  WhereLoop entrie
2c6a0 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74  s to handle OR t
2c6b0 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f 72 6b  erms.  This work
2c6c0 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20  s for either.** 
2c6d0 62 74 72 65 65 73 20 6f 72 20 76 69 72 74 75 61  btrees or virtua
2c6e0 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  l tables..*/.sta
2c6f0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
2c700 70 41 64 64 4f 72 28 57 68 65 72 65 4c 6f 6f 70  pAddOr(WhereLoop
2c710 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
2c720 72 2c 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72  r, Bitmask mExtr
2c730 61 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  a){.  WhereInfo 
2c740 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
2c750 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68  er->pWInfo;.  Wh
2c760 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a  ereClause *pWC;.
2c770 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
2c780 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  w;.  WhereTerm *
2c790 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a  pTerm, *pWCEnd;.
2c7a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2c7b0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72  E_OK;.  int iCur
2c7c0 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ;.  WhereClause 
2c7d0 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72 65 4c  tempWC;.  WhereL
2c7e0 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75 62 42  oopBuilder sSubB
2c7f0 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f 72 53  uild;.  WhereOrS
2c800 65 74 20 73 53 75 6d 2c 20 73 43 75 72 2c 20 73  et sSum, sCur, s
2c810 50 72 65 76 3b 0a 20 20 73 74 72 75 63 74 20 53  Prev;.  struct S
2c820 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2c830 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70  em;.  .  pWC = p
2c840 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
2c850 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  if( pWInfo->wctr
2c860 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  lFlags & WHERE_A
2c870 4e 44 5f 4f 4e 4c 59 20 29 20 72 65 74 75 72 6e  ND_ONLY ) return
2c880 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 57   SQLITE_OK;.  pW
2c890 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20  CEnd = pWC->a + 
2c8a0 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e  pWC->nTerm;.  pN
2c8b0 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
2c8c0 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  New;.  memset(&s
2c8d0 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Sum, 0, sizeof(s
2c8e0 53 75 6d 29 29 3b 0a 0a 20 20 66 6f 72 28 70 54  Sum));..  for(pT
2c8f0 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
2c900 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d  m<pWCEnd && rc==
2c910 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d  SQLITE_OK; pTerm
2c920 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54  ++){.    if( (pT
2c930 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2c940 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20   WO_OR)!=0.     
2c950 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  && (pTerm->u.pOr
2c960 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
2c970 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  & pNew->maskSelf
2c980 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
2c990 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
2c9a0 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26   const pOrWC = &
2c9b0 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
2c9c0 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72  ->wc;.      Wher
2c9d0 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f  eTerm * const pO
2c9e0 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d  rWCEnd = &pOrWC-
2c9f0 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d  >a[pOrWC->nTerm]
2ca00 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
2ca10 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20  m *pOrTerm;.    
2ca20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a    int once = 1;.
2ca30 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
2ca40 20 20 20 20 0a 20 20 20 20 20 20 70 49 74 65 6d      .      pItem
2ca50 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
2ca60 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69  ist->a + pNew->i
2ca70 54 61 62 3b 0a 20 20 20 20 20 20 69 43 75 72 20  Tab;.      iCur 
2ca80 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
2ca90 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c  ;.      sSubBuil
2caa0 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20  d = *pBuilder;. 
2cab0 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
2cac0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
2cad0 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72     sSubBuild.pOr
2cae0 53 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20  Set = &sCur;..  
2caf0 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d      for(pOrTerm=
2cb00 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72  pOrWC->a; pOrTer
2cb10 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54  m<pOrWCEnd; pOrT
2cb20 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
2cb30 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f  if( (pOrTerm->eO
2cb40 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44  perator & WO_AND
2cb50 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2cb60 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20    sSubBuild.pWC 
2cb70 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41  = &pOrTerm->u.pA
2cb80 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  ndInfo->wc;.    
2cb90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
2cba0 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
2cbb0 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20  r==iCur ){.     
2cbc0 20 20 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e       tempWC.pWIn
2cbd0 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  fo = pWC->pWInfo
2cbe0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
2cbf0 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b  WC.pOuter = pWC;
2cc00 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
2cc10 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  C.op = TK_AND;. 
2cc20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
2cc30 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  nTerm = 1;.     
2cc40 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20       tempWC.a = 
2cc50 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  pOrTerm;.       
2cc60 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43     sSubBuild.pWC
2cc70 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20   = &tempWC;.    
2cc80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2cc90 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2cca0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ccb0 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66   sCur.n = 0;.#if
2ccc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2ccd0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
2cce0 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74        if( IsVirt
2ccf0 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29  ual(pItem->pTab)
2cd00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2cd10 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
2cd20 69 72 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c  irtual(&sSubBuil
2cd30 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  d);.          fo
2cd40 72 28 69 3d 30 3b 20 69 3c 73 43 75 72 2e 6e 3b  r(i=0; i<sCur.n;
2cd50 20 69 2b 2b 29 20 73 43 75 72 2e 61 5b 69 5d 2e   i++) sCur.a[i].
2cd60 70 72 65 72 65 71 20 7c 3d 20 6d 45 78 74 72 61  prereq |= mExtra
2cd70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
2cd80 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
2cd90 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2cda0 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
2cdb0 65 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45  e(&sSubBuild, mE
2cdc0 78 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d  xtra);.        }
2cdd0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2cde0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
2cdf0 7c 20 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20  | sCur.n==0 );. 
2ce00 20 20 20 20 20 20 20 69 66 28 20 73 43 75 72 2e         if( sCur.
2ce10 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
2ce20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20    sSum.n = 0;.  
2ce30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2ce40 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2ce50 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20   once ){.       
2ce60 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26     whereOrMove(&
2ce70 73 53 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20  sSum, &sCur);.  
2ce80 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30          once = 0
2ce90 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2cea0 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65  .          where
2ceb0 4f 72 4d 6f 76 65 28 26 73 50 72 65 76 2c 20 26  OrMove(&sPrev, &
2cec0 73 53 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  sSum);.         
2ced0 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20   sSum.n = 0;.   
2cee0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
2cef0 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b  i<sPrev.n; i++){
2cf00 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
2cf10 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20  (j=0; j<sCur.n; 
2cf20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
2cf30 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72      whereOrInser
2cf40 74 28 26 73 53 75 6d 2c 20 73 50 72 65 76 2e 61  t(&sSum, sPrev.a
2cf50 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20 73 43 75  [i].prereq | sCu
2cf60 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20  r.a[j].prereq,. 
2cf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf80 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
2cf90 43 6f 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b  CostAdd(sPrev.a[
2cfa0 69 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b  i].rRun, sCur.a[
2cfb0 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20  j].rRun),.      
2cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfd0 20 20 20 20 20 20 77 68 65 72 65 43 6f 73 74 41        whereCostA
2cfe0 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f  dd(sPrev.a[i].nO
2cff0 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f  ut, sCur.a[j].nO
2d000 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ut));.          
2d010 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2d020 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d030 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  }.      pNew->nL
2d040 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
2d050 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  pNew->aLTerm[0] 
2d060 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  = pTerm;.      p
2d070 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
2d080 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20  HERE_MULTI_OR;. 
2d090 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
2d0a0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  p = 0;.      pNe
2d0b0 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b  w->iSortIdx = 0;
2d0c0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
2d0d0 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f  New->u, 0, sizeo
2d0e0 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20  f(pNew->u));.   
2d0f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
2d100 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73  SQLITE_OK && i<s
2d110 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  Sum.n; i++){.   
2d120 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
2d130 4d 75 6c 74 69 70 6c 65 20 62 79 20 33 2e 35 20  Multiple by 3.5 
2d140 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 61 72  for the secondar
2d150 79 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 20 2a  y table lookup *
2d160 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
2d170 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  rRun = sSum.a[i]
2d180 2e 72 52 75 6e 20 2b 20 31 38 3b 0a 20 20 20 20  .rRun + 18;.    
2d190 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2d1a0 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b   sSum.a[i].nOut;
2d1b0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
2d1c0 72 65 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69  rereq = sSum.a[i
2d1d0 5d 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20  ].prereq;.      
2d1e0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2d1f0 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
2d200 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a   pNew);.      }.
2d210 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2d220 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2d230 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
2d240 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c  p objects for al
2d250 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61  l tables .*/.sta
2d260 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
2d270 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f  pAddAll(WhereLoo
2d280 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
2d290 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  er){.  WhereInfo
2d2a0 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
2d2b0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42  der->pWInfo;.  B
2d2c0 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20  itmask mExtra = 
2d2d0 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72  0;.  Bitmask mPr
2d2e0 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ior = 0;.  int i
2d2f0 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  Tab;.  SrcList *
2d300 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
2d310 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  o->pTabList;.  s
2d320 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2d330 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
2d340 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
2d350 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  o->pParse->db;. 
2d360 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 20 3d 20   int nTabList = 
2d370 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a  pWInfo->nLevel;.
2d380 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2d390 45 5f 4f 4b 3b 0a 20 20 75 38 20 70 72 69 6f 72  E_OK;.  u8 prior
2d3a0 4a 6f 69 6e 54 79 70 65 20 3d 20 30 3b 0a 20 20  JoinType = 0;.  
2d3b0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
2d3c0 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72  ..  /* Loop over
2d3d0 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
2d3e0 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65  he join, from le
2d3f0 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20  ft to right */. 
2d400 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
2d410 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c  ->pNew;.  whereL
2d420 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20  oopInit(pNew);. 
2d430 20 66 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74   for(iTab=0, pIt
2d440 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  em=pTabList->a; 
2d450 69 54 61 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69  iTab<nTabList; i
2d460 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  Tab++, pItem++){
2d470 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20  .    pNew->iTab 
2d480 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77  = iTab;.    pNew
2d490 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74  ->maskSelf = get
2d4a0 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
2d4b0 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69  askSet, pItem->i
2d4c0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28  Cursor);.    if(
2d4d0 20 28 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79   ((pItem->jointy
2d4e0 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65  pe|priorJoinType
2d4f0 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  ) & (JT_LEFT|JT_
2d500 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20 20  CROSS))!=0 ){.  
2d510 20 20 20 20 6d 45 78 74 72 61 20 3d 20 6d 50 72      mExtra = mPr
2d520 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ior;.    }.    p
2d530 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70  riorJoinType = p
2d540 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  Item->jointype;.
2d550 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
2d560 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29  l(pItem->pTab) )
2d570 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
2d580 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
2d590 28 70 42 75 69 6c 64 65 72 29 3b 0a 20 20 20 20  (pBuilder);.    
2d5a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2d5b0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
2d5c0 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 45  ree(pBuilder, mE
2d5d0 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xtra);.    }.   
2d5e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2d5f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
2d600 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
2d610 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61  pBuilder, mExtra
2d620 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50 72  );.    }.    mPr
2d630 69 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73  ior |= pNew->mas
2d640 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 72  kSelf;.    if( r
2d650 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  c || db->mallocF
2d660 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20  ailed ) break;. 
2d670 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c   }.  whereLoopCl
2d680 65 61 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  ear(db, pNew);. 
2d690 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2d6a0 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20 57  *.** Examine a W
2d6b0 68 65 72 65 50 61 74 68 20 28 77 69 74 68 20 74  herePath (with t
2d6c0 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74  he addition of t
2d6d0 68 65 20 65 78 74 72 61 20 57 68 65 72 65 4c 6f  he extra WhereLo
2d6e0 6f 70 20 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a  op of the 5th.**
2d6f0 20 70 61 72 61 6d 65 74 65 72 73 29 20 74 6f 20   parameters) to 
2d700 73 65 65 20 69 66 20 69 74 20 6f 75 74 70 75 74  see if it output
2d710 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65  s rows in the re
2d720 71 75 65 73 74 65 64 20 4f 52 44 45 52 20 42 59  quested ORDER BY
2d730 0a 2a 2a 20 28 6f 72 20 47 52 4f 55 50 20 42 59  .** (or GROUP BY
2d740 29 20 77 69 74 68 6f 75 74 20 72 65 71 75 69 72  ) without requir
2d750 69 6e 67 20 61 20 73 65 70 61 72 61 74 65 20 73  ing a separate s
2d760 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ort operation.  
2d770 52 65 74 75 72 6e 3a 0a 2a 2a 20 0a 2a 2a 20 20  Return:.** .**  
2d780 20 20 30 3a 20 20 4f 52 44 45 52 20 42 59 20 69    0:  ORDER BY i
2d790 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2e  s not satisfied.
2d7a0 20 20 53 6f 72 74 69 6e 67 20 72 65 71 75 69 72    Sorting requir
2d7b0 65 64 0a 2a 2a 20 20 20 20 31 3a 20 20 4f 52 44  ed.**    1:  ORD
2d7c0 45 52 20 42 59 20 69 73 20 73 61 74 69 73 66 69  ER BY is satisfi
2d7d0 65 64 2e 20 20 20 20 20 20 4f 6d 69 74 20 73 6f  ed.      Omit so
2d7e0 72 74 69 6e 67 0a 2a 2a 20 20 20 2d 31 3a 20 20  rting.**   -1:  
2d7f0 55 6e 6b 6e 6f 77 6e 20 61 74 20 74 68 69 73 20  Unknown at this 
2d800 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  time.**.** Note 
2d810 74 68 61 74 20 70 72 6f 63 65 73 73 69 6e 67 20  that processing 
2d820 66 6f 72 20 57 48 45 52 45 5f 47 52 4f 55 50 42  for WHERE_GROUPB
2d830 59 20 61 6e 64 20 57 48 45 52 45 5f 44 49 53 54  Y and WHERE_DIST
2d840 49 4e 43 54 42 59 20 69 73 20 6e 6f 74 20 61 73  INCTBY is not as
2d850 0a 2a 2a 20 73 74 72 69 63 74 2e 20 20 57 69 74  .** strict.  Wit
2d860 68 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44  h GROUP BY and D
2d870 49 53 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79  ISTINCT the only
2d880 20 72 65 71 75 69 72 65 6d 65 6e 74 20 69 73 20   requirement is 
2d890 74 68 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65  that.** equivale
2d8a0 6e 74 20 72 6f 77 73 20 61 70 70 65 61 72 20 69  nt rows appear i
2d8b0 6d 6d 65 64 69 61 74 65 6c 79 20 61 64 6a 61 63  mmediately adjac
2d8c0 65 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68  ent to one anoth
2d8d0 65 72 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a  er.  GROUP BY.**
2d8e0 20 61 6e 64 20 44 49 53 54 49 4e 54 20 64 6f 20   and DISTINT do 
2d8f0 6e 6f 74 20 72 65 71 75 69 72 65 20 72 6f 77 73  not require rows
2d900 20 74 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e   to appear in an
2d910 79 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64  y particular ord
2d920 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73  er as long.** as
2d930 20 65 71 75 69 76 65 6c 65 6e 74 20 72 6f 77 73   equivelent rows
2d940 20 61 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67   are grouped tog
2d950 65 74 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72  ether.  Thus for
2d960 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49   GROUP BY and DI
2d970 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f  STINCT.** the pO
2d980 72 64 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e  rderBy terms can
2d990 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61   be matched in a
2d9a0 6e 79 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20  ny order.  With 
2d9b0 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a  ORDER BY, the .*
2d9c0 2a 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73  * pOrderBy terms
2d9d0 20 6d 75 73 74 20 62 65 20 6d 61 74 63 68 65 64   must be matched
2d9e0 20 69 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d   in strict left-
2d9f0 74 6f 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a  to-right order..
2da00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
2da10 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
2da20 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65  OrderBy(.  Where
2da30 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20  Info *pWInfo,   
2da40 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
2da50 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
2da60 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
2da70 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  /* ORDER BY or G
2da80 52 4f 55 50 20 42 59 20 6f 72 20 44 49 53 54 49  ROUP BY or DISTI
2da90 4e 43 54 20 63 6c 61 75 73 65 20 74 6f 20 63 68  NCT clause to ch
2daa0 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  eck */.  WherePa
2dab0 74 68 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f  th *pPath,     /
2dac0 2a 20 54 68 65 20 57 68 65 72 65 50 61 74 68 20  * The WherePath 
2dad0 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31  to check */.  u1
2dae0 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20  6 wctrlFlags,   
2daf0 20 20 20 20 2f 2a 20 4d 69 67 68 74 20 63 6f 6e      /* Might con
2db00 74 61 69 6e 20 57 48 45 52 45 5f 47 52 4f 55 50  tain WHERE_GROUP
2db10 42 59 20 6f 72 20 57 48 45 52 45 5f 44 49 53 54  BY or WHERE_DIST
2db20 49 4e 43 54 42 59 20 2a 2f 0a 20 20 75 31 36 20  INCTBY */.  u16 
2db30 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nLoop,          
2db40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
2db50 6e 74 72 69 65 73 20 69 6e 20 70 50 61 74 68 2d  ntries in pPath-
2db60 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68  >aLoop[] */.  Wh
2db70 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20  ereLoop *pLast, 
2db80 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
2db90 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65  WhereLoop to the
2dba0 20 65 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61   end of pPath->a
2dbb0 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d  Loop[] */.  Bitm
2dbc0 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20  ask *pRevMask   
2dbd0 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f    /* OUT: Mask o
2dbe0 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20  f WhereLoops to 
2dbf0 72 75 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  run in reverse o
2dc00 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  rder */.){.  u8 
2dc10 72 65 76 53 65 74 3b 20 20 20 20 20 20 20 20 20  revSet;         
2dc20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
2dc30 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20  v is known */.  
2dc40 75 38 20 72 65 76 3b 20 20 20 20 20 20 20 20 20  u8 rev;         
2dc50 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69        /* Composi
2dc60 74 65 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f  te sort order */
2dc70 0a 20 20 75 38 20 72 65 76 49 64 78 3b 20 20 20  .  u8 revIdx;   
2dc80 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2dc90 78 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a  x sort order */.
2dca0 20 20 75 38 20 69 73 4f 72 64 65 72 44 69 73 74    u8 isOrderDist
2dcb0 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70  inct;   /* All p
2dcc0 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20  rior WhereLoops 
2dcd0 61 72 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  are order-distin
2dce0 63 74 20 2a 2f 0a 20 20 75 38 20 64 69 73 74 69  ct */.  u8 disti
2dcf0 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a  nctColumns;   /*
2dd00 20 54 72 75 65 20 69 66 20 74 68 65 20 6c 6f 6f   True if the loo
2dd10 70 20 68 61 73 20 55 4e 49 51 55 45 20 4e 4f 54  p has UNIQUE NOT
2dd20 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f   NULL columns */
2dd30 0a 20 20 75 38 20 69 73 4d 61 74 63 68 3b 20 20  .  u8 isMatch;  
2dd40 20 20 20 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c           /* iCol
2dd50 75 6d 6e 20 6d 61 74 63 68 65 73 20 61 20 74 65  umn matches a te
2dd60 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  rm of the ORDER 
2dd70 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75  BY clause */.  u
2dd80 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  16 nColumn;     
2dd90 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2dda0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e  f columns in pIn
2ddb0 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72  dex */.  u16 nOr
2ddc0 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f  derBy;         /
2ddd0 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d 73 20 69  * Number terms i
2dde0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
2ddf0 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
2de00 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
2de10 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57 68 65   /* Index of Whe
2de20 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74 68 20  reLoop in pPath 
2de30 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 20  being processed 
2de40 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
2de50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2de60 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
2de70 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
2de80 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
2de90 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75 72 72   number for curr
2dea0 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f  ent WhereLoop */
2deb0 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20  .  int iColumn; 
2dec0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
2ded0 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68  lumn number with
2dee0 69 6e 20 74 61 62 6c 65 20 69 43 75 72 20 2a 2f  in table iCur */
2def0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
2df00 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72  oop = 0; /* Curr
2df10 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 62 65  ent WhereLoop be
2df20 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e 20 2a  ing processed. *
2df30 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
2df40 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73  Term;     /* A s
2df50 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
2df60 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
2df70 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42 45 78 70  /.  Expr *pOBExp
2df80 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  r;        /* An 
2df90 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
2dfa0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2dfb0 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71  use */.  CollSeq
2dfc0 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f   *pColl;       /
2dfd0 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69  * COLLATE functi
2dfe0 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52  on from an ORDER
2dff0 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 20   BY clause term 
2e000 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
2e010 65 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ex;        /* Th
2e020 65 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  e index associat
2e030 65 64 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f  ed with pLoop */
2e040 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2e050 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
2e060 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  >db;  /* Databas
2e070 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
2e080 20 20 42 69 74 6d 61 73 6b 20 6f 62 53 61 74 20    Bitmask obSat 
2e090 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20  = 0;    /* Mask 
2e0a0 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
2e0b0 73 20 73 61 74 69 73 66 69 65 64 20 73 6f 20 66  s satisfied so f
2e0c0 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ar */.  Bitmask 
2e0d0 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a  obDone;       /*
2e0e0 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44   Mask of all ORD
2e0f0 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
2e100 20 42 69 74 6d 61 73 6b 20 6f 72 64 65 72 44 69   Bitmask orderDi
2e110 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20  stinctMask;  /* 
2e120 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c  Mask of all well
2e130 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a  -ordered loops *
2e140 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 61 64  /.  Bitmask read
2e150 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
2e160 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72  /* Mask of inner
2e170 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a   loops */..  /*.
2e180 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20    ** We say the 
2e190 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e  WhereLoop is "on
2e1a0 65 2d 72 6f 77 22 20 69 66 20 69 74 20 67 65 6e  e-row" if it gen
2e1b0 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74  erates no more t
2e1c0 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77  han one.  ** row
2e1d0 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 41 20 57   of output.  A W
2e1e0 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d  hereLoop is one-
2e1f0 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  row if all of th
2e200 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
2e210 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20  true:.  **  (a) 
2e220 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  All index column
2e230 73 20 6d 61 74 63 68 20 77 69 74 68 20 57 48 45  s match with WHE
2e240 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20  RE_COLUMN_EQ..  
2e250 2a 2a 20 20 28 62 29 20 54 68 65 20 69 6e 64 65  **  (b) The inde
2e260 78 20 69 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a  x is unique.  **
2e270 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70 20 77   Any WhereLoop w
2e280 69 74 68 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c  ith an WHERE_COL
2e290 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e  UMN_EQ constrain
2e2a0 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 69  t on the rowid i
2e2b0 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20  s one-row..  ** 
2e2c0 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68  Every one-row Wh
2e2d0 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76  ereLoop will hav
2e2e0 65 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52  e the WHERE_ONER
2e2f0 4f 57 20 62 69 74 20 73 65 74 20 69 6e 20 77 73  OW bit set in ws
2e300 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Flags..  **.  **
2e310 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72   We say the Wher
2e320 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65 72 2d  eLoop is "order-
2e330 64 69 73 74 69 6e 63 74 22 20 69 66 20 74 68 65  distinct" if the
2e340 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   set of columns 
2e350 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57  from.  ** that W
2e360 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 61 72  hereLoop that ar
2e370 65 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  e in the ORDER B
2e380 59 20 63 6c 61 75 73 65 20 61 72 65 20 64 69 66  Y clause are dif
2e390 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79  ferent for every
2e3a0 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65  .  ** row of the
2e3b0 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65   WhereLoop.  Eve
2e3c0 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65  ry one-row Where
2e3d0 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61 74 69  Loop is automati
2e3e0 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72  cally.  ** order
2e3f0 2d 64 69 73 74 69 6e 63 74 2e 20 20 20 41 20 57  -distinct.   A W
2e400 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 68 61  hereLoop that ha
2e410 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s no columns in 
2e420 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2e430 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  use.  ** is not 
2e440 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20  order-distinct. 
2e450 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74  To be order-dist
2e460 69 6e 63 74 20 69 73 20 6e 6f 74 20 71 75 69 74  inct is not quit
2e470 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 62 65  e the same as be
2e480 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20  ing.  ** UNIQUE 
2e490 73 69 6e 63 65 20 61 20 55 4e 49 51 55 45 20 63  since a UNIQUE c
2e4a0 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63  olumn or index c
2e4b0 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65  an have multiple
2e4c0 20 72 6f 77 73 20 74 68 61 74 20 0a 20 20 2a 2a   rows that .  **
2e4d0 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55   are NULL and NU
2e4e0 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 65 71  LL values are eq
2e4f0 75 69 76 61 6c 65 6e 74 20 66 6f 72 20 74 68 65  uivalent for the
2e500 20 70 75 72 70 6f 73 65 20 6f 66 20 6f 72 64 65   purpose of orde
2e510 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a  r-distinct..  **
2e520 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73   To be order-dis
2e530 74 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d  tinct, the colum
2e540 6e 73 20 6d 75 73 74 20 62 65 20 55 4e 49 51 55  ns must be UNIQU
2e550 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a  E and NOT NULL..
2e560 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f    **.  ** The ro
2e570 77 69 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20  wid for a table 
2e580 69 73 20 61 6c 77 61 79 73 20 55 4e 49 51 55 45  is always UNIQUE
2e590 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f   and NOT NULL so
2e5a0 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a 20 20   whenever the.  
2e5b0 2a 2a 20 72 6f 77 69 64 20 61 70 70 65 61 72 73  ** rowid appears
2e5c0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
2e5d0 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 6f 72   clause, the cor
2e5e0 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65  responding Where
2e5f0 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61 75 74  Loop is.  ** aut
2e600 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64 65 72  omatically order
2e610 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a  -distinct..  */.
2e620 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
2e630 72 42 79 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  rBy!=0 );..  /* 
2e640 53 6f 72 74 61 62 69 6c 69 74 79 20 6f 66 20 76  Sortability of v
2e650 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 73  irtual tables is
2e660 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
2e670 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65  he xBestIndex me
2e680 74 68 6f 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65  thod.  ** of the
2e690 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
2e6a0 74 73 65 6c 66 20 2a 2f 0a 20 20 69 66 28 20 70  tself */.  if( p
2e6b0 4c 61 73 74 2d 3e 77 73 46 6c 61 67 73 20 26 20  Last->wsFlags & 
2e6c0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
2e6d0 4c 45 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61  LE ){.    testca
2e6e0 73 65 28 20 6e 4c 6f 6f 70 3e 30 20 29 3b 20 20  se( nLoop>0 );  
2e6f0 2f 2a 20 54 72 75 65 20 77 68 65 6e 20 6f 75 74  /* True when out
2e700 65 72 20 6c 6f 6f 70 73 20 61 72 65 20 6f 6e 65  er loops are one
2e710 2d 72 6f 77 20 61 6e 64 20 6d 61 74 63 68 20 0a  -row and match .
2e720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e730 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 20            ** no 
2e740 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
2e750 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 61  /.    return pLa
2e760 73 74 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64  st->u.vtab.isOrd
2e770 65 72 65 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ered;.  }.  if( 
2e780 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a  nLoop && Optimiz
2e790 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
2e7a0 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79  , SQLITE_OrderBy
2e7b0 49 64 78 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  IdxJoin) ) retur
2e7c0 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79  n 0;..  nOrderBy
2e7d0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
2e7e0 70 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  pr;.  testcase( 
2e7f0 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20  nOrderBy==BMS-1 
2e800 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42  );.  if( nOrderB
2e810 79 3e 42 4d 53 2d 31 20 29 20 72 65 74 75 72 6e  y>BMS-1 ) return
2e820 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f   0;  /* Cannot o
2e830 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c  ptimize overly l
2e840 61 72 67 65 20 4f 52 44 45 52 20 42 59 73 20 2a  arge ORDER BYs *
2e850 2f 0a 20 20 69 73 4f 72 64 65 72 44 69 73 74 69  /.  isOrderDisti
2e860 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e  nct = 1;.  obDon
2e870 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64  e = MASKBIT(nOrd
2e880 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72  erBy)-1;.  order
2e890 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30  DistinctMask = 0
2e8a0 3b 0a 20 20 72 65 61 64 79 20 3d 20 30 3b 0a 20  ;.  ready = 0;. 
2e8b0 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73   for(iLoop=0; is
2e8c0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 26 26  OrderDistinct &&
2e8d0 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26   obSat<obDone &&
2e8e0 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69   iLoop<=nLoop; i
2e8f0 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Loop++){.    if(
2e900 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79   iLoop>0 ) ready
2e910 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   |= pLoop->maskS
2e920 65 6c 66 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  elf;.    pLoop =
2e930 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70   iLoop<nLoop ? p
2e940 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f  Path->aLoop[iLoo
2e950 70 5d 20 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20  p] : pLast;.    
2e960 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
2e970 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2e980 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
2e990 20 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 70   );.    iCur = p
2e9a0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
2e9b0 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e  >a[pLoop->iTab].
2e9c0 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a  iCursor;..    /*
2e9d0 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52   Mark off any OR
2e9e0 44 45 52 20 42 59 20 74 65 72 6d 20 58 20 74 68  DER BY term X th
2e9f0 61 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69  at is a column i
2ea00 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20  n the table of. 
2ea10 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
2ea20 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63 68  t loop for which
2ea30 20 74 68 65 72 65 20 69 73 20 74 65 72 6d 20 69   there is term i
2ea40 6e 20 74 68 65 20 57 48 45 52 45 0a 20 20 20 20  n the WHERE.    
2ea50 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  ** clause of the
2ea60 20 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20   form X IS NULL 
2ea70 6f 72 20 58 3d 3f 20 74 68 61 74 20 72 65 66 65  or X=? that refe
2ea80 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72  rence only outer
2ea90 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20  .    ** loops.. 
2eaa0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
2eab0 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
2eac0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4d  ++){.      if( M
2ead0 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61  ASKBIT(i) & obSa
2eae0 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
2eaf0 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71      pOBExpr = sq
2eb00 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
2eb10 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61  late(pOrderBy->a
2eb20 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
2eb30 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f    if( pOBExpr->o
2eb40 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63  p!=TK_COLUMN ) c
2eb50 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
2eb60 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62  f( pOBExpr->iTab
2eb70 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69  le!=iCur ) conti
2eb80 6e 75 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  nue;.      pTerm
2eb90 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 70 57 49   = findTerm(&pWI
2eba0 6e 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20  nfo->sWC, iCur, 
2ebb0 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
2ebc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2ebd0 20 20 20 20 20 20 20 20 20 7e 72 65 61 64 79 2c           ~ready,
2ebe0 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c   WO_EQ|WO_ISNULL
2ebf0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2ec00 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69  pTerm==0 ) conti
2ec10 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nue;.      if( (
2ec20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2ec30 26 57 4f 5f 45 51 29 21 3d 30 20 26 26 20 70 4f  &WO_EQ)!=0 && pO
2ec40 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  BExpr->iColumn>=
2ec50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
2ec60 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 2a 7a 32  st char *z1, *z2
2ec70 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
2ec80 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
2ec90 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61  lSeq(pWInfo->pPa
2eca0 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61  rse, pOrderBy->a
2ecb0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
2ecc0 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
2ecd0 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
2ece0 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
2ecf0 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  z1 = pColl->zNam
2ed00 65 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  e;.        pColl
2ed10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2ed20 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50  llSeq(pWInfo->pP
2ed30 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78  arse, pTerm->pEx
2ed40 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
2ed50 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
2ed60 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
2ed70 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 43  .        z2 = pC
2ed80 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
2ed90 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
2eda0 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 21 3d  trICmp(z1, z2)!=
2edb0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2edc0 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61      }.      obSa
2edd0 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
2ede0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2edf0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2ee00 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d  & WHERE_ONEROW)=
2ee10 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
2ee20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2ee30 20 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20   WHERE_IPK ){.  
2ee40 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30        pIndex = 0
2ee50 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d  ;.        nColum
2ee60 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  n = 0;.      }el
2ee70 73 65 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d  se if( (pIndex =
2ee80 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2ee90 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49  pIndex)==0 || pI
2eea0 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  ndex->bUnordered
2eeb0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2eec0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 0;.      }els
2eed0 65 7b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75  e{.        nColu
2eee0 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  mn = pIndex->nCo
2eef0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 73  lumn;.        is
2ef00 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
2ef10 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
2ef20 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 20 20 20 20  =OE_None;.      
2ef30 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  }..      /* Loop
2ef40 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c   through all col
2ef50 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
2ef60 78 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68 20  x and deal with 
2ef70 74 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a  the ones.      *
2ef80 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63  * that are not c
2ef90 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d  onstrained by ==
2efa0 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f   or IN..      */
2efb0 0a 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76  .      rev = rev
2efc0 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64  Set = 0;.      d
2efd0 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d  istinctColumns =
2efe0 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   0;.      for(j=
2eff0 30 3b 20 6a 3c 3d 6e 43 6f 6c 75 6d 6e 3b 20 6a  0; j<=nColumn; j
2f000 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  ++){.        u8 
2f010 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72 75 65  bOnce;   /* True
2f020 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45   to run the ORDE
2f030 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70  R BY search loop
2f040 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
2f050 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64  Skip over == and
2f060 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d 73 20 2a   IS NULL terms *
2f070 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  /.        if( j<
2f080 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
2f090 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  Eq.         && (
2f0a0 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  (i = pLoop->aLTe
2f0b0 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72  rm[j]->eOperator
2f0c0 29 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  ) & (WO_EQ|WO_IS
2f0d0 4e 55 4c 4c 29 29 21 3d 30 0a 20 20 20 20 20 20  NULL))!=0.      
2f0e0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
2f0f0 66 28 20 69 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  f( i & WO_ISNULL
2f100 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f110 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65  testcase( isOrde
2f120 72 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  rDistinct );.   
2f130 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
2f140 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
2f150 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f160 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a      continue;  .
2f170 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2f180 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f     /* Get the co
2f190 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74  lumn number in t
2f1a0 68 65 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d  he table (iColum
2f1b0 6e 29 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65  n) and sort orde
2f1c0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65  r.        ** (re
2f1d0 76 49 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d  vIdx) for the j-
2f1e0 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  th column of the
2f1f0 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
2f200 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  */.        if( j
2f210 3c 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  <nColumn ){.    
2f220 20 20 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20        /* Normal 
2f230 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f  index columns */
2f240 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75  .          iColu
2f250 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43  mn = pIndex->aiC
2f260 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20  olumn[j];.      
2f270 20 20 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e      revIdx = pIn
2f280 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
2f290 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  j];.          if
2f2a0 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65  ( iColumn==pInde
2f2b0 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79  x->pTable->iPKey
2f2c0 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b   ) iColumn = -1;
2f2d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2f2e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2f2f0 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 61 74   ROWID column at
2f300 20 74 68 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20   the end */.    
2f310 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d        assert( j=
2f320 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20  =nColumn );.    
2f330 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
2f340 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  -1;.          re
2f350 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  vIdx = 0;.      
2f360 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
2f370 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64  An unconstrained
2f380 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67   column that mig
2f390 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73  ht be NULL means
2f3a0 20 74 68 61 74 20 74 68 69 73 0a 20 20 20 20 20   that this.     
2f3b0 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20     ** WhereLoop 
2f3c0 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65  is not well-orde
2f3d0 72 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  red .        */.
2f3e0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72          if( isOr
2f3f0 64 65 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20  derDistinct.    
2f400 20 20 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e       && iColumn>
2f410 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a  =0.         && j
2f420 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  >=pLoop->u.btree
2f430 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26  .nEq.         &&
2f440 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
2f450 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e  >aCol[iColumn].n
2f460 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20  otNull==0.      
2f470 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
2f480 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
2f490 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
2f4a0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74         /* Find t
2f4b0 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
2f4c0 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
2f4d0 73 20 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f  s to the j-th co
2f4e0 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  lumn.        ** 
2f4f0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
2f500 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20 4f   and mark that O
2f510 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66 66  RDER BY term off
2f520 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
2f530 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 31 3b 0a       bOnce = 1;.
2f540 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20          isMatch 
2f550 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
2f560 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20 69  (i=0; bOnce && i
2f570 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
2f580 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4d  .          if( M
2f590 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61  ASKBIT(i) & obSa
2f5a0 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
2f5b0 20 20 20 20 20 20 20 20 70 4f 42 45 78 70 72 20          pOBExpr 
2f5c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
2f5d0 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42  pCollate(pOrderB
2f5e0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
2f5f0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2f600 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  se( wctrlFlags &
2f610 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29   WHERE_GROUPBY )
2f620 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
2f630 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73  case( wctrlFlags
2f640 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
2f650 54 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20  TBY );.         
2f660 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
2f670 20 26 20 28 57 48 45 52 45 5f 47 52 4f 55 50 42   & (WHERE_GROUPB
2f680 59 7c 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  Y|WHERE_DISTINCT
2f690 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20  BY))==0 ) bOnce 
2f6a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
2f6b0 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d  f( pOBExpr->op!=
2f6c0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74  TK_COLUMN ) cont
2f6d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2f6e0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61  if( pOBExpr->iTa
2f6f0 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74  ble!=iCur ) cont
2f700 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2f710 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  if( pOBExpr->iCo
2f720 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20  lumn!=iColumn ) 
2f730 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2f740 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e      if( iColumn>
2f750 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2f760 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2f770 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49  3ExprCollSeq(pWI
2f780 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72  nfo->pParse, pOr
2f790 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
2f7a0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
2f7b0 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
2f7c0 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
2f7d0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
2f7e0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
2f7f0 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
2f800 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
2f810 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  j])!=0 ) continu
2f820 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2f830 20 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68           isMatch
2f840 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2f850 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
2f860 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d  .        if( isM
2f870 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  atch ){.        
2f880 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20    if( iColumn<0 
2f890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
2f8a0 65 73 74 63 61 73 65 28 20 64 69 73 74 69 6e 63  estcase( distinc
2f8b0 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20  tColumns==0 );. 
2f8c0 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 69             disti
2f8d0 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a  nctColumns = 1;.
2f8e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f8f0 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d        obSat |= M
2f900 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20  ASKBIT(i);.     
2f910 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f       if( (pWInfo
2f920 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
2f930 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30  HERE_GROUPBY)==0
2f940 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f950 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
2f960 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63   sort order is c
2f970 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20  ompatible in an 
2f980 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
2f990 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2f9a0 53 6f 72 74 20 6f 72 64 65 72 20 69 73 20 69 72  Sort order is ir
2f9b0 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47  relevant for a G
2f9c0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
2f9d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
2f9e0 66 28 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20  f( revSet ){.   
2f9f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
2fa00 72 65 76 20 5e 20 72 65 76 49 64 78 29 21 3d 70  rev ^ revIdx)!=p
2fa10 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
2fa20 72 74 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e  rtOrder ) return
2fa30 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
2fa40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2fa50 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 49 64       rev = revId
2fa60 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  x ^ pOrderBy->a[
2fa70 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
2fa80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2fa90 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20  rev ) *pRevMask 
2faa0 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70  |= MASKBIT(iLoop
2fab0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2fac0 20 72 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20   revSet = 1;.   
2fad0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2fae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2faf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2fb00 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e  /* No match foun
2fb10 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  d */.          i
2fb20 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 43 6f  f( j==0 || j<nCo
2fb30 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
2fb40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
2fb50 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21 3d 30  OrderDistinct!=0
2fb60 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2fb70 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2fb80 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
2fb90 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2fba0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2fbb0 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20    } /* end Loop 
2fbc0 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20 63  over all index c
2fbd0 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20  olumns */.      
2fbe0 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75  if( distinctColu
2fbf0 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20 20 74  mns ){.        t
2fc00 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72  estcase( isOrder
2fc10 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20  Distinct==0 );. 
2fc20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
2fc30 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20  stinct = 1;.    
2fc40 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64    }.    } /* end
2fc50 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20  -if not one-row 
2fc60 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20  */..    /* Mark 
2fc70 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f 52  off any other OR
2fc80 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61  DER BY terms tha
2fc90 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f  t reference pLoo
2fca0 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f  p */.    if( isO
2fcb0 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a  rderDistinct ){.
2fcc0 20 20 20 20 20 20 6f 72 64 65 72 44 69 73 74 69        orderDisti
2fcd0 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70  nctMask |= pLoop
2fce0 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
2fcf0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
2fd00 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
2fd10 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20       Expr *p;.  
2fd20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
2fd30 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
2fd40 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2fd50 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61   p = pOrderBy->a
2fd60 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
2fd70 20 20 20 69 66 28 20 28 65 78 70 72 54 61 62 6c     if( (exprTabl
2fd80 65 55 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e  eUsage(&pWInfo->
2fd90 73 4d 61 73 6b 53 65 74 2c 20 70 29 26 7e 6f 72  sMaskSet, p)&~or
2fda0 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29  derDistinctMask)
2fdb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2fdc0 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49   obSat |= MASKBI
2fdd0 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  T(i);.        }.
2fde0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2fdf0 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f  } /* End the loo
2fe00 70 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65  p over all Where
2fe10 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72  Loops from outer
2fe20 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e  -most down to in
2fe30 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66  ner-most */.  if
2fe40 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20  ( obSat==obDone 
2fe50 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
2fe60 28 20 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e  ( !isOrderDistin
2fe70 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ct ) return 0;. 
2fe80 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 23   return -1;.}..#
2fe90 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
2fea0 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20  _ENABLED./* For 
2feb0 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e  debugging use on
2fec0 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ly: */.static co
2fed0 6e 73 74 20 63 68 61 72 20 2a 77 68 65 72 65 50  nst char *whereP
2fee0 61 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74  athName(WherePat
2fef0 68 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c  h *pPath, int nL
2ff00 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  oop, WhereLoop *
2ff10 70 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63  pLast){.  static
2ff20 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b   char zName[65];
2ff30 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
2ff40 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b  i=0; i<nLoop; i+
2ff50 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70  +){ zName[i] = p
2ff60 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e  Path->aLoop[i]->
2ff70 63 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61  cId; }.  if( pLa
2ff80 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20  st ) zName[i++] 
2ff90 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20  = pLast->cId;.  
2ffa0 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  zName[i] = 0;.  
2ffb0 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
2ffc0 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47  #endif.../*.** G
2ffd0 69 76 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  iven the list of
2ffe0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
2fff0 74 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c  ts at pWInfo->pL
30000 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69  oops, this routi
30010 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ne.** attempts t
30020 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73  o find the lowes
30030 74 20 63 6f 73 74 20 70 61 74 68 20 74 68 61 74  t cost path that
30040 20 76 69 73 69 74 73 20 65 61 63 68 20 57 68 65   visits each Whe
30050 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20  reLoop.** once. 
30060 20 54 68 69 73 20 70 61 74 68 20 69 73 20 74 68   This path is th
30070 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74  en loaded into t
30080 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70  he pWInfo->a[].p
30090 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a  WLoop fields..**
300a0 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20  .** Assume that 
300b0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
300c0 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
300d0 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74  that will need t
300e0 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77  o be sorted.** w
300f0 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28  ill be nRowEst (
30100 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72  in the 10*log2 r
30110 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20  epresentation). 
30120 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74   Or, ignore sort
30130 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20  ing.** costs if 
30140 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a  nRowEst==0..**.*
30150 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
30160 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
30170 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66   SQLITE_NOMEM of
30180 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
30190 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  tion.** error oc
301a0 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
301b0 69 6e 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c  int wherePathSol
301c0 76 65 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  ver(WhereInfo *p
301d0 57 49 6e 66 6f 2c 20 57 68 65 72 65 43 6f 73 74  WInfo, WhereCost
301e0 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74   nRowEst){.  int
301f0 20 6d 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20   mxChoice;      
30200 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
30210 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75  m number of simu
30220 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74  ltaneous paths t
30230 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racked */.  int 
30240 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nLoop;          
30250 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
30260 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  of terms in the 
30270 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20  join */.  Parse 
30280 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
30290 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
302a0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
302b0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
302c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
302d0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
302e0 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b   */.  int iLoop;
302f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30300 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
30310 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f  over the terms o
30320 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  f the join */.  
30330 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20  int ii, jj;     
30340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
30350 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
30360 57 68 65 72 65 43 6f 73 74 20 72 43 6f 73 74 3b  WhereCost rCost;
30370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30380 43 6f 73 74 20 6f 66 20 61 20 70 61 74 68 20 2a  Cost of a path *
30390 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6d 78  /.  WhereCost mx
303a0 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Cost = 0;       
303b0 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74   /* Maximum cost
303c0 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61 74   of a set of pat
303d0 68 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  hs */.  WhereCos
303e0 74 20 72 53 6f 72 74 43 6f 73 74 3b 20 20 20 20  t rSortCost;    
303f0 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 74 6f 20       /* Cost to 
30400 64 6f 20 61 20 73 6f 72 74 20 2a 2f 0a 20 20 69  do a sort */.  i
30410 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20  nt nTo, nFrom;  
30420 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
30430 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72  er of valid entr
30440 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64  ies in aTo[] and
30450 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68   aFrom[] */.  Wh
30460 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20  erePath *aFrom; 
30470 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e          /* All n
30480 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68  From paths at th
30490 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c  e previous level
304a0 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
304b0 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20  *aTo;           
304c0 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20  /* The nTo best 
304d0 70 61 74 68 73 20 61 74 20 74 68 65 20 63 75 72  paths at the cur
304e0 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  rent level */.  
304f0 57 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d  WherePath *pFrom
30500 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ;         /* An 
30510 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d  element of aFrom
30520 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
30530 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
30540 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20  herePath *pTo;  
30550 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
30560 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20  lement of aTo[] 
30570 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b  that we are work
30580 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ing on */.  Wher
30590 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20  eLoop *pWLoop;  
305a0 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
305b0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
305c0 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65  jects */.  Where
305d0 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20  Loop **pX;      
305e0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
305f0 64 69 76 79 20 75 70 20 74 68 65 20 70 53 70 61  divy up the pSpa
30600 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 63  ce memory */.  c
30610 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20  har *pSpace;    
30620 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
30630 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65  orary memory use
30640 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
30650 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d  e */..  pParse =
30660 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
30670 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
30680 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57  db;.  nLoop = pW
30690 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20  Info->nLevel;.  
306a0 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73  /* TUNING: For s
306b0 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f  imple queries, o
306c0 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70 61 74  nly the best pat
306d0 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20  h is tracked..  
306e0 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69  ** For 2-way joi
306f0 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74 20 70  ns, the 5 best p
30700 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65  aths are followe
30710 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e  d..  ** For join
30720 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74  s of 3 or more t
30730 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65  ables, track the
30740 20 31 30 20 62 65 73 74 20 70 61 74 68 73 20 2a   10 best paths *
30750 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28  /.  mxChoice = (
30760 6e 4c 6f 6f 70 3d 3d 31 29 20 3f 20 31 20 3a 20  nLoop==1) ? 1 : 
30770 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20  (nLoop==2 ? 5 : 
30780 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  10);.  assert( n
30790 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54  Loop<=pWInfo->pT
307a0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
307b0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30    WHERETRACE(0x0
307c0 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e  02, ("---- begin
307d0 20 73 6f 6c 76 65 72 5c 6e 22 29 29 3b 0a 0a 20   solver\n"));.. 
307e0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
307f0 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63   initialize spac
30800 65 20 66 6f 72 20 61 54 6f 20 61 6e 64 20 61 46  e for aTo and aF
30810 72 6f 6d 20 2a 2f 0a 20 20 69 69 20 3d 20 28 73  rom */.  ii = (s
30820 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68 29  izeof(WherePath)
30830 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f  +sizeof(WhereLoo
30840 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f  p*)*nLoop)*mxCho
30850 69 63 65 2a 32 3b 0a 20 20 70 53 70 61 63 65 20  ice*2;.  pSpace 
30860 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
30870 63 52 61 77 28 64 62 2c 20 69 69 29 3b 0a 20 20  cRaw(db, ii);.  
30880 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20  if( pSpace==0 ) 
30890 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
308a0 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68  MEM;.  aTo = (Wh
308b0 65 72 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b  erePath*)pSpace;
308c0 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d  .  aFrom = aTo+m
308d0 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65  xChoice;.  memse
308e0 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65  t(aFrom, 0, size
308f0 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20  of(aFrom[0]));. 
30900 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70   pX = (WhereLoop
30910 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69  **)(aFrom+mxChoi
30920 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78  ce);.  for(ii=mx
30930 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d  Choice*2, pFrom=
30940 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c  aTo; ii>0; ii--,
30950 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20   pFrom++, pX += 
30960 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f  nLoop){.    pFro
30970 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20  m->aLoop = pX;. 
30980 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68   }..  /* Seed th
30990 65 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20  e search with a 
309a0 73 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68  single WherePath
309b0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f   containing zero
309c0 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a   WhereLoops..  *
309d0 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44  *.  ** TUNING: D
309e0 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75  o not let the nu
309f0 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f  mber of iteratio
30a00 6e 73 20 67 6f 20 61 62 6f 76 65 20 32 35 2e 20  ns go above 25. 
30a10 20 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a   If the cost.  *
30a20 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61  * of computing a
30a30 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
30a40 78 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61  x is not paid ba
30a50 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  ck within the fi
30a60 72 73 74 20 32 35 0a 20 20 2a 2a 20 72 6f 77 73  rst 25.  ** rows
30a70 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73  , then do not us
30a80 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
30a90 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f  index. */.  aFro
30aa0 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28  m[0].nRow = MIN(
30ab0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
30ac0 6f 70 2c 20 34 36 29 3b 20 20 61 73 73 65 72 74  op, 46);  assert
30ad0 28 20 34 36 3d 3d 77 68 65 72 65 43 6f 73 74 28  ( 46==whereCost(
30ae0 32 35 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d  25) );.  nFrom =
30af0 20 31 3b 0a 0a 20 20 2f 2a 20 50 72 65 63 6f 6d   1;..  /* Precom
30b00 70 75 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66  pute the cost of
30b10 20 73 6f 72 74 69 6e 67 20 74 68 65 20 66 69 6e   sorting the fin
30b20 61 6c 20 72 65 73 75 6c 74 20 73 65 74 2c 20 69  al result set, i
30b30 66 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a  f the caller.  *
30b40 2a 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  * to sqlite3Wher
30b50 65 42 65 67 69 6e 28 29 20 77 61 73 20 63 6f 6e  eBegin() was con
30b60 63 65 72 6e 65 64 20 61 62 6f 75 74 20 73 6f 72  cerned about sor
30b70 74 69 6e 67 20 2a 2f 0a 20 20 72 53 6f 72 74 43  ting */.  rSortC
30b80 6f 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ost = 0;.  if( p
30b90 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d  WInfo->pOrderBy=
30ba0 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30  =0 || nRowEst==0
30bb0 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d   ){.    aFrom[0]
30bc0 2e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20  .isOrderedValid 
30bd0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
30be0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74    /* TUNING: Est
30bf0 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20 73  imated cost of s
30c00 6f 72 74 69 6e 67 20 69 73 20 4e 2a 6c 6f 67 32  orting is N*log2
30c10 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20 74  (N) where N is t
30c20 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  he.    ** number
30c30 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2e   of output rows.
30c40 20 2a 2f 0a 20 20 20 20 72 53 6f 72 74 43 6f 73   */.    rSortCos
30c50 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 65 73  t = nRowEst + es
30c60 74 4c 6f 67 28 6e 52 6f 77 45 73 74 29 3b 0a 20  tLog(nRowEst);. 
30c70 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
30c80 30 30 32 2c 28 22 2d 2d 2d 2d 20 73 6f 72 74 20  002,("---- sort 
30c90 63 6f 73 74 3d 25 2d 33 64 5c 6e 22 2c 20 72 53  cost=%-3d\n", rS
30ca0 6f 72 74 43 6f 73 74 29 29 3b 0a 20 20 7d 0a 0a  ortCost));.  }..
30cb0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75 63    /* Compute suc
30cc0 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72  cessively longer
30cd0 20 57 68 65 72 65 50 61 74 68 73 20 75 73 69 6e   WherePaths usin
30ce0 67 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 67  g the previous g
30cf0 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f  eneration.  ** o
30d00 66 20 57 68 65 72 65 50 61 74 68 73 20 61 73 20  f WherePaths as 
30d10 74 68 65 20 62 61 73 69 73 20 66 6f 72 20 74 68  the basis for th
30d20 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20 74 72  e next.  Keep tr
30d30 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43 68 6f  ack of the mxCho
30d40 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20 70 61  ice.  ** best pa
30d50 74 68 73 20 61 74 20 65 61 63 68 20 67 65 6e 65  ths at each gene
30d60 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28  ration */.  for(
30d70 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e  iLoop=0; iLoop<n
30d80 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
30d90 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20      nTo = 0;.   
30da0 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d   for(ii=0, pFrom
30db0 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d  =aFrom; ii<nFrom
30dc0 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  ; ii++, pFrom++)
30dd0 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57 4c 6f  {.      for(pWLo
30de0 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  op=pWInfo->pLoop
30df0 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f  s; pWLoop; pWLoo
30e00 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c  p=pWLoop->pNextL
30e10 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20 42 69  oop){.        Bi
30e20 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 0a 20  tmask maskNew;. 
30e30 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72         Bitmask r
30e40 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  evMask = 0;.    
30e50 20 20 20 20 75 38 20 69 73 4f 72 64 65 72 65 64      u8 isOrdered
30e60 56 61 6c 69 64 20 3d 20 70 46 72 6f 6d 2d 3e 69  Valid = pFrom->i
30e70 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b 0a 20  sOrderedValid;. 
30e80 20 20 20 20 20 20 20 75 38 20 69 73 4f 72 64 65         u8 isOrde
30e90 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f  red = pFrom->isO
30ea0 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20  rdered;.        
30eb0 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65  if( (pWLoop->pre
30ec0 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61  req & ~pFrom->ma
30ed0 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
30ee0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
30ef0 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  f( (pWLoop->mask
30f00 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61  Self & pFrom->ma
30f10 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e  skLoop)!=0 ) con
30f20 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 2f  tinue;.        /
30f30 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
30f40 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e   pWLoop is a can
30f50 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 68 65  didate to be the
30f60 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20   next loop. .   
30f70 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20       ** Compute 
30f80 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20  its cost */.    
30f90 20 20 20 20 72 43 6f 73 74 20 3d 20 77 68 65 72      rCost = wher
30fa0 65 43 6f 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d  eCostAdd(pWLoop-
30fb0 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e  >rSetup,pWLoop->
30fc0 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52  rRun + pFrom->nR
30fd0 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 72 43 6f  ow);.        rCo
30fe0 73 74 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64  st = whereCostAd
30ff0 64 28 72 43 6f 73 74 2c 20 70 46 72 6f 6d 2d 3e  d(rCost, pFrom->
31000 72 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20  rCost);.        
31010 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d  maskNew = pFrom-
31020 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f  >maskLoop | pWLo
31030 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
31040 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 72 64        if( !isOrd
31050 65 72 65 64 56 61 6c 69 64 20 29 7b 0a 20 20 20  eredValid ){.   
31060 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 77         switch( w
31070 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
31080 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c  sOrderBy(pWInfo,
31090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
310a0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
310b0 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c  pOrderBy, pFrom,
310c0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
310d0 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ags,.           
310e0 20 20 20 20 20 20 20 20 20 20 20 20 69 4c 6f 6f              iLoo
310f0 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d  p, pWLoop, &revM
31100 61 73 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ask) ){.        
31110 20 20 20 20 63 61 73 65 20 31 3a 20 20 2f 2a 20      case 1:  /* 
31120 59 65 73 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f  Yes.  pFrom+pWLo
31130 6f 70 20 64 6f 65 73 20 73 61 74 69 73 66 79 20  op does satisfy 
31140 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
31150 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  use */.         
31160 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d       isOrdered =
31170 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
31180 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64    isOrderedValid
31190 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
311a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
311b0 20 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 20         case 0:  
311c0 2f 2a 20 4e 6f 2e 20 20 70 46 72 6f 6d 2b 70 57  /* No.  pFrom+pW
311d0 4c 6f 6f 70 20 77 69 6c 6c 20 72 65 71 75 69 72  Loop will requir
311e0 65 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72  e a separate sor
311f0 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  t */.           
31200 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20 30     isOrdered = 0
31210 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
31220 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d  isOrderedValid =
31230 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
31240 20 20 72 43 6f 73 74 20 3d 20 77 68 65 72 65 43    rCost = whereC
31250 6f 73 74 41 64 64 28 72 43 6f 73 74 2c 20 72 53  ostAdd(rCost, rS
31260 6f 72 74 43 6f 73 74 29 3b 0a 20 20 20 20 20 20  ortCost);.      
31270 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
31280 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75             defau
31290 6c 74 3a 20 2f 2a 20 43 61 6e 6e 6f 74 20 74 65  lt: /* Cannot te
312a0 6c 6c 20 79 65 74 2e 20 20 54 72 79 20 61 67 61  ll yet.  Try aga
312b0 69 6e 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 69  in on the next i
312c0 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  teration */.    
312d0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
312e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
312f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
31300 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20 3d 20        revMask = 
31310 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a  pFrom->revLoop;.
31320 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31330 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
31340 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75  e if pWLoop shou
31350 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ld be added to t
31360 68 65 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74  he mxChoice best
31370 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20   so far */.     
31380 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f     for(jj=0, pTo
31390 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a  =aTo; jj<nTo; jj
313a0 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20  ++, pTo++){.    
313b0 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d        if( pTo->m
313c0 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77  askLoop==maskNew
313d0 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72   && pTo->isOrder
313e0 65 64 56 61 6c 69 64 3d 3d 69 73 4f 72 64 65 72  edValid==isOrder
313f0 65 64 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20  edValid ){.     
31400 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
31410 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20   jj==nTo-1 );.  
31420 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
31430 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
31450 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20  f( jj>=nTo ){.  
31460 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e          if( nTo>
31470 3d 6d 78 43 68 6f 69 63 65 20 26 26 20 72 43 6f  =mxChoice && rCo
31480 73 74 3e 3d 6d 78 43 6f 73 74 20 29 7b 0a 23 69  st>=mxCost ){.#i
31490 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
314a0 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20  ENABLED.        
314b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
314c0 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
314d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
314e0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
314f0 66 28 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73  f("Skip   %s cos
31500 74 3d 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  t=%3d order=%c\n
31510 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
31520 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
31530 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
31540 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
31550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31560 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69     isOrderedVali
31570 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f  d ? (isOrdered ?
31580 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f   'Y' : 'N') : '?
31590 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
315a0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
315b0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
315c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
315d0 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20 6e 65       /* Add a ne
315e0 77 20 50 61 74 68 20 74 6f 20 74 68 65 20 61 54  w Path to the aT
315f0 6f 5b 5d 20 73 65 74 20 2a 2f 0a 20 20 20 20 20  o[] set */.     
31600 20 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43       if( nTo<mxC
31610 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20  hoice ){.       
31620 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65       /* Increase
31630 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
31640 20 61 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20   aTo set by one 
31650 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  */.            j
31660 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20  j = nTo++;.     
31670 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
31680 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70          /* New p
31690 61 74 68 20 72 65 70 6c 61 63 65 73 20 74 68 65  ath replaces the
316a0 20 70 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20   prior worst to 
316b0 6b 65 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77  keep count below
316c0 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20   mxChoice */.   
316d0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d           for(jj=
316e0 6e 54 6f 2d 31 3b 20 61 54 6f 5b 6a 6a 5d 2e 72  nTo-1; aTo[jj].r
316f0 43 6f 73 74 3c 6d 78 43 6f 73 74 3b 20 6a 6a 2d  Cost<mxCost; jj-
31700 2d 29 7b 20 61 73 73 65 72 74 28 6a 6a 3e 30 29  -){ assert(jj>0)
31710 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ; }.          }.
31720 20 20 20 20 20 20 20 20 20 20 70 54 6f 20 3d 20            pTo = 
31730 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66  &aTo[jj];.#ifdef
31740 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
31750 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20 69 66  LED.          if
31760 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
31770 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
31780 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
31790 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20  bugPrintf("New  
317a0 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f    %s cost=%-3d o
317b0 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
317c0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
317d0 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
317e0 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
317f0 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20   rCost,.        
31800 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
31810 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65  dValid ? (isOrde
31820 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29  red ? 'Y' : 'N')
31830 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
31840 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
31850 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31860 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
31870 6f 73 74 3c 3d 72 43 6f 73 74 20 29 7b 0a 23 69  ost<=rCost ){.#i
31880 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
31890 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20  ENABLED.        
318a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
318b0 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
318c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
318d0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
318e0 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
318f0 20 20 20 20 20 22 53 6b 69 70 20 20 20 25 73 20       "Skip   %s 
31900 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d  cost=%-3d order=
31910 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %c",.           
31920 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
31930 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
31940 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
31950 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
31960 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61       isOrderedVa
31970 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64  lid ? (isOrdered
31980 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20   ? 'Y' : 'N') : 
31990 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
319a0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
319b0 50 72 69 6e 74 66 28 22 20 20 20 76 73 20 25 73  Printf("   vs %s
319c0 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65 72   cost=%-3d order
319d0 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
319e0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
319f0 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
31a00 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
31a10 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Cost,.          
31a20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
31a30 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70  rderedValid ? (p
31a40 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20  To->isOrdered ? 
31a50 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27  'Y' : 'N') : '?'
31a60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
31a70 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
31a80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
31a90 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20  o->rCost==rCost 
31aa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  );.            c
31ab0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
31ac0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
31ad0 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43  estcase( pTo->rC
31ae0 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a  ost==rCost+1 );.
31af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e            /* A n
31b00 65 77 20 61 6e 64 20 62 65 74 74 65 72 20 73 63  ew and better sc
31b10 6f 72 65 20 66 6f 72 20 61 20 70 72 65 76 69 6f  ore for a previo
31b20 75 73 6c 79 20 63 72 65 61 74 65 64 20 65 71 75  usly created equ
31b30 69 76 61 6c 65 6e 74 20 70 61 74 68 20 2a 2f 0a  ivalent path */.
31b40 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
31b50 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20  E_ENABLED.      
31b60 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
31b70 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
31b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
31b90 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
31ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31bb0 20 22 55 70 64 61 74 65 20 25 73 20 63 6f 73 74   "Update %s cost
31bc0 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c  =%-3d order=%c",
31bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31be0 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
31bf0 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
31c00 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20  oop), rCost,.   
31c10 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
31c20 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69  rderedValid ? (i
31c30 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a  sOrdered ? 'Y' :
31c40 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20   'N') : '?');.  
31c50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31c60 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
31c70 77 61 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  was %s cost=%-3d
31c80 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
31c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
31ca0 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c  erePathName(pTo,
31cb0 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54   iLoop+1, 0), pT
31cc0 6f 2d 3e 72 43 6f 73 74 2c 0a 20 20 20 20 20 20  o->rCost,.      
31cd0 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
31ce0 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20  sOrderedValid ? 
31cf0 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20  (pTo->isOrdered 
31d00 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27  ? 'Y' : 'N') : '
31d10 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ?');.          }
31d20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
31d30 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c  }.        /* pWL
31d40 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e  oop is a winner.
31d50 20 20 41 64 64 20 69 74 20 74 6f 20 74 68 65 20    Add it to the 
31d60 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66  set of best so f
31d70 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54  ar */.        pT
31d80 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46  o->maskLoop = pF
31d90 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
31da0 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
31db0 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72  ;.        pTo->r
31dc0 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b  evLoop = revMask
31dd0 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e  ;.        pTo->n
31de0 52 6f 77 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Row = pFrom->nRo
31df0 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74  w + pWLoop->nOut
31e00 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72  ;.        pTo->r
31e10 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20  Cost = rCost;.  
31e20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
31e30 65 72 65 64 56 61 6c 69 64 20 3d 20 69 73 4f 72  eredValid = isOr
31e40 64 65 72 65 64 56 61 6c 69 64 3b 0a 20 20 20 20  deredValid;.    
31e50 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
31e60 65 64 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a  ed = isOrdered;.
31e70 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
31e80 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d  To->aLoop, pFrom
31e90 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28  ->aLoop, sizeof(
31ea0 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f  WhereLoop*)*iLoo
31eb0 70 29 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  p);.        pTo-
31ec0 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20  >aLoop[iLoop] = 
31ed0 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  pWLoop;.        
31ee0 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63  if( nTo>=mxChoic
31ef0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  e ){.          m
31f00 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72  xCost = aTo[0].r
31f10 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
31f20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61  for(jj=1, pTo=&a
31f30 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69  To[1]; jj<mxChoi
31f40 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29  ce; jj++, pTo++)
31f50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
31f60 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43  ( pTo->rCost>mxC
31f70 6f 73 74 20 29 20 6d 78 43 6f 73 74 20 3d 20 70  ost ) mxCost = p
31f80 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20  To->rCost;.     
31f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
31fa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
31fb0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
31fc0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66  E_ENABLED.    if
31fd0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
31fe0 61 63 65 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20  ace>=2 ){.      
31ff0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
32000 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72  tf("---- after r
32010 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c  ound %d ----\n",
32020 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66   iLoop);.      f
32030 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f  or(ii=0, pTo=aTo
32040 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20  ; ii<nTo; ii++, 
32050 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pTo++){.        
32060 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
32070 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d 33  tf(" %s cost=%-3
32080 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65  d nrow=%-3d orde
32090 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  r=%c",.         
320a0 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
320b0 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29  pTo, iLoop+1, 0)
320c0 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54  , pTo->rCost, pT
320d0 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20  o->nRow,.       
320e0 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
320f0 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e  edValid ? (pTo->
32100 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20  isOrdered ? 'Y' 
32110 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20  : 'N') : '?');. 
32120 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
32130 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 26  isOrderedValid &
32140 26 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  & pTo->isOrdered
32150 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
32160 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
32170 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22  (" rev=0x%llx\n"
32180 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b  , pTo->revLoop);
32190 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
321a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
321b0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
321c0 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
321d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
321e0 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70 20  if..    /* Swap 
321f0 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61 46 72  the roles of aFr
32200 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72 20 74  om and aTo for t
32210 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61 74 69  he next generati
32220 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20  on */.    pFrom 
32230 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d  = aTo;.    aTo =
32240 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f   aFrom;.    aFro
32250 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e  m = pFrom;.    n
32260 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a  From = nTo;.  }.
32270 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20  .  if( nFrom==0 
32280 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
32290 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
322a0 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f  no query solutio
322b0 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n");.    sqlite3
322c0 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63  DbFree(db, pSpac
322d0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
322e0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
322f0 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68  .  .  /* Find th
32300 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
32310 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20  th.  pFrom will 
32320 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  be left pointing
32330 20 74 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f   to that path */
32340 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d  .  pFrom = aFrom
32350 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46 72 6f  ;.  assert( nFro
32360 6d 3d 3d 31 20 29 3b 0a 23 69 66 20 30 20 2f 2a  m==1 );.#if 0 /*
32370 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
32380 73 20 6e 65 65 64 65 64 20 69 66 20 6e 46 72 6f  s needed if nFro
32390 6d 20 69 73 20 65 76 65 72 20 6d 6f 72 65 20 74  m is ever more t
323a0 68 61 6e 20 31 20 2a 2f 0a 20 20 66 6f 72 28 69  han 1 */.  for(i
323b0 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69  i=1; ii<nFrom; i
323c0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46  i++){.    if( pF
323d0 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d  rom->rCost>aFrom
323e0 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72  [ii].rCost ) pFr
323f0 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b  om = &aFrom[ii];
32400 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73  .  }.#endif.  as
32410 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  sert( pWInfo->nL
32420 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20  evel==nLoop );. 
32430 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77   /* Load the low
32440 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 69 6e  est cost path in
32450 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66  to pWInfo */.  f
32460 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
32470 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
32480 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65  ){.    WhereLeve
32490 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e  l *pLevel = pWIn
324a0 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20  fo->a + iLoop;. 
324b0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f     pLevel->pWLoo
324c0 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72  p = pWLoop = pFr
324d0 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  om->aLoop[iLoop]
324e0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46  ;.    pLevel->iF
324f0 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54  rom = pWLoop->iT
32500 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ab;.    pLevel->
32510 69 54 61 62 43 75 72 20 3d 20 70 57 49 6e 66 6f  iTabCur = pWInfo
32520 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
32530 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75  evel->iFrom].iCu
32540 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rsor;.  }.  if( 
32550 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
32560 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
32570 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 0a 20 20  _DISTINCT)!=0.  
32580 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
32590 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
325a0 44 49 53 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20  DISTINCTBY)==0. 
325b0 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69    && pWInfo->eDi
325c0 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49  stinct==WHERE_DI
325d0 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26  STINCT_NOOP.   &
325e0 26 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20  & nRowEst.  ){. 
325f0 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73     Bitmask notUs
32600 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  ed;.    int rc =
32610 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
32620 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66  iesOrderBy(pWInf
32630 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  o, pWInfo->pResu
32640 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20  ltSet, pFrom,.  
32650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
32660 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 2c  HERE_DISTINCTBY,
32670 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d   nLoop-1, pFrom-
32680 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c  >aLoop[nLoop-1],
32690 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20   &notUsed);.    
326a0 69 66 28 20 72 63 3d 3d 31 20 29 20 70 57 49 6e  if( rc==1 ) pWIn
326b0 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
326c0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
326d0 52 44 45 52 45 44 3b 0a 20 20 7d 0a 20 20 69 66  RDERED;.  }.  if
326e0 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72  ( pFrom->isOrder
326f0 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 57  ed ){.    if( pW
32700 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
32710 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
32720 54 42 59 20 29 7b 0a 20 20 20 20 20 20 70 57 49  TBY ){.      pWI
32730 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
32740 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
32750 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 7d 65 6c  ORDERED;.    }el
32760 73 65 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  se{.      pWInfo
32770 2d 3e 62 4f 42 53 61 74 20 3d 20 31 3b 0a 20 20  ->bOBSat = 1;.  
32780 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d      pWInfo->revM
32790 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76  ask = pFrom->rev
327a0 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Loop;.    }.  }.
327b0 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75    pWInfo->nRowOu
327c0 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b  t = pFrom->nRow;
327d0 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d 70  ..  /* Free temp
327e0 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e 64  orary memory and
327f0 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 20   return success 
32800 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
32810 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a  ee(db, pSpace);.
32820 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32830 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73  OK;.}../*.** Mos
32840 74 20 71 75 65 72 69 65 73 20 75 73 65 20 6f 6e  t queries use on
32850 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
32860 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f 74 20  e (they are not 
32870 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76 65 0a  joins) and have.
32880 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e  ** simple == con
32890 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e 73 74  straints against
328a0 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64 73 2e   indexed fields.
328b0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
328c0 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c  ttempts.** to pl
328d0 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c 65 20  an those simple 
328e0 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75 63 68  cases using much
328f0 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79 20 74   less ceremony t
32900 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72  han the.** gener
32910 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79  al-purpose query
32920 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68   planner, and th
32930 65 72 65 62 79 20 79 69 65 6c 64 20 66 61 73 74  ereby yield fast
32940 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  er sqlite3_prepa
32950 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f  re().** times fo
32960 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
32970 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
32980 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63  non-zero on succ
32990 65 73 73 2c 20 69 66 20 74 68 69 73 20 71 75 65  ess, if this que
329a0 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64 6c 65  ry can be handle
329b0 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d  d by this.** no-
329c0 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70 6c 61  frills query pla
329d0 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20 7a 65  nner.  Return ze
329e0 72 6f 20 69 66 20 74 68 69 73 20 71 75 65 72 79  ro if this query
329f0 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a 20 67   needs the .** g
32a00 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71  eneral-purpose q
32a10 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f  uery planner..*/
32a20 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
32a30 65 53 68 6f 72 74 43 75 74 28 57 68 65 72 65 4c  eShortCut(WhereL
32a40 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
32a50 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e  lder){.  WhereIn
32a60 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74  fo *pWInfo;.  st
32a70 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
32a80 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65 72  m *pItem;.  Wher
32a90 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20  eClause *pWC;.  
32aa0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
32ab0 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
32ac0 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75 72  Loop;.  int iCur
32ad0 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62  ;.  int j;.  Tab
32ae0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
32af0 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20 20 70 57  x *pIdx;.  .  pW
32b00 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
32b10 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  >pWInfo;.  if( p
32b20 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
32b30 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f  s & WHERE_FORCE_
32b40 54 41 42 4c 45 20 29 20 72 65 74 75 72 6e 20 30  TABLE ) return 0
32b50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ;.  assert( pWIn
32b60 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
32b70 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d  rc>=1 );.  pItem
32b80 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
32b90 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d  ist->a;.  pTab =
32ba0 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
32bb0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
32bc0 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
32bd0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 49 6e    if( pItem->zIn
32be0 64 65 78 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  dex ) return 0;.
32bf0 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e    iCur = pItem->
32c00 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d  iCursor;.  pWC =
32c10 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20   &pWInfo->sWC;. 
32c20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65   pLoop = pBuilde
32c30 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70  r->pNew;.  pLoop
32c40 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20  ->wsFlags = 0;. 
32c50 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
32c60 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
32c70 20 30 2c 20 57 4f 5f 45 51 2c 20 30 29 3b 0a 20   0, WO_EQ, 0);. 
32c80 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
32c90 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
32ca0 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
32cb0 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48 45  EQ|WHERE_IPK|WHE
32cc0 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70  RE_ONEROW;.    p
32cd0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  Loop->aLTerm[0] 
32ce0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f  = pTerm;.    pLo
32cf0 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a  op->nLTerm = 1;.
32d00 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
32d10 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20  ee.nEq = 1;.    
32d20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
32d30 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75  of a rowid looku
32d40 70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20 20 70  p is 10 */.    p
32d50 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b  Loop->rRun = 33;
32d60 20 20 2f 2a 20 33 33 3d 3d 77 68 65 72 65 43 6f    /* 33==whereCo
32d70 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73  st(10) */.  }els
32d80 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  e{.    for(pIdx=
32d90 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
32da0 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
32db0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
32dc0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d   pIdx->onError==
32dd0 4f 45 5f 4e 6f 6e 65 20 7c 7c 20 70 49 64 78 2d  OE_None || pIdx-
32de0 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d  >pPartIdxWhere!=
32df0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
32e00 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
32e10 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b  Idx->nColumn; j+
32e20 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72  +){.        pTer
32e30 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
32e40 2c 20 69 43 75 72 2c 20 70 49 64 78 2d 3e 61 69  , iCur, pIdx->ai
32e50 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c 20 57 4f  Column[j], 0, WO
32e60 5f 45 51 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  _EQ, pIdx);.    
32e70 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
32e80 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
32e90 20 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a    whereLoopResiz
32ea0 65 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  e(pWInfo->pParse
32eb0 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6a 29 3b  ->db, pLoop, j);
32ec0 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
32ed0 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72  aLTerm[j] = pTer
32ee0 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
32ef0 20 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 43   if( j!=pIdx->nC
32f00 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65  olumn ) continue
32f10 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77  ;.      pLoop->w
32f20 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
32f30 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f  OLUMN_EQ|WHERE_O
32f40 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45  NEROW|WHERE_INDE
32f50 58 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20 28  XED;.      if( (
32f60 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26  pItem->colUsed &
32f70 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78   ~columnsInIndex
32f80 28 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20  (pIdx))==0 ){.  
32f90 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46        pLoop->wsF
32fa0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44  lags |= WHERE_ID
32fb0 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a  X_ONLY;.      }.
32fc0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54        pLoop->nLT
32fd0 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70  erm = j;.      p
32fe0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
32ff0 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f  q = j;.      pLo
33000 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
33010 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  ex = pIdx;.     
33020 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
33030 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64   of a unique ind
33040 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20  ex lookup is 15 
33050 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  */.      pLoop->
33060 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33  rRun = 39;  /* 3
33070 39 3d 3d 77 68 65 72 65 43 6f 73 74 28 31 35 29  9==whereCost(15)
33080 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
33090 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
330a0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
330b0 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  ){.    pLoop->nO
330c0 75 74 20 3d 20 28 57 68 65 72 65 43 6f 73 74 29  ut = (WhereCost)
330d0 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  1;.    pWInfo->a
330e0 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f  [0].pWLoop = pLo
330f0 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d  op;.    pLoop->m
33100 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73  askSelf = getMas
33110 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
33120 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  Set, iCur);.    
33130 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61  pWInfo->a[0].iTa
33140 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20  bCur = iCur;.   
33150 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
33160 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57   = 1;.    if( pW
33170 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
33180 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20   pWInfo->bOBSat 
33190 3d 20 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57  =  1;.    if( pW
331a0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
331b0 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
331c0 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20  STINCT ){.      
331d0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
331e0 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
331f0 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  CT_UNIQUE;.    }
33200 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
33210 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  EBUG.    pLoop->
33220 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69  cId = '0';.#endi
33230 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  f.    return 1;.
33240 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
33250 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
33260 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  e the beginning 
33270 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64  of the loop used
33280 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73   for WHERE claus
33290 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
332a0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
332b0 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
332c0 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75  o an opaque stru
332d0 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
332e0 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  ins.** informati
332f0 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72  on needed to ter
33300 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
33310 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c    Later, the cal
33320 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  ling routine.** 
33330 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71  should invoke sq
33340 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
33350 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
33360 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
33370 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64  nction.** in ord
33380 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  er to complete t
33390 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
333a0 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
333b0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
333c0 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69  curs, this routi
333d0 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e  ne returns NULL.
333e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63  .**.** The basic
333f0 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61   idea is to do a
33400 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e   nested loop, on
33410 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20  e loop for each 
33420 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20  table in.** the 
33430 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
33440 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52   select.  (INSER
33450 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61  T and UPDATE sta
33460 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a  tements are the.
33470 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c  ** same as a SEL
33480 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20  ECT with only a 
33490 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
334a0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
334b0 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  )  For.** exampl
334c0 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73  e, if the SQL is
334d0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
334e0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
334f0 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52   t1, t2, t3 WHER
33500 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  E ...;.**.** The
33510 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  n the code gener
33520 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75  ated is conceptu
33530 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f  ally like the fo
33540 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
33550 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
33560 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20   in t1 do       
33570 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
33580 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f  ted.**        fo
33590 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
335a0 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20   do      |-- by 
335b0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
335c0 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  n().**          
335d0 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20  foreach row3 in 
335e0 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20  t3 do   /.**    
335f0 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
33600 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
33610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33620 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
33630 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e  ted.**        en
33640 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
33650 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20           |-- by 
33660 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
33670 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20  ).**      end   
33680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33690 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f        /.**.** No
336a0 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70  te that the loop
336b0 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e  s might not be n
336c0 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ested in the ord
336d0 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79  er in which they
336e0 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68  .** appear in th
336f0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66  e FROM clause if
33700 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64   a different ord
33710 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62 6c  er is better abl
33720 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65  e to make.** use
33730 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f   of indices.  No
33740 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65  te also that whe
33750 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  n the IN operato
33760 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20  r appears in.** 
33770 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
33780 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c  , it might resul
33790 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  t in additional 
337a0 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72  nested loops for
337b0 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  .** scanning thr
337c0 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20  ough all values 
337d0 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
337e0 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  d side of the IN
337f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
33800 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20  e Btree cursors 
33810 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
33820 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20  each table.  t1 
33830 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e  uses cursor.** n
33840 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e  umber pTabList->
33850 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74  a[0].iCursor.  t
33860 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f  2 uses the curso
33870 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d  r pTabList->a[1]
33880 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64  .iCursor..** And
33890 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73   so forth.  This
338a0 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
338b0 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20  es code to open 
338c0 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f  those VDBE curso
338d0 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  rs.** and sqlite
338e0 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65  3WhereEnd() gene
338f0 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  rates the code t
33900 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a  o close them..**
33910 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61  .** The code tha
33920 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  t sqlite3WhereBe
33930 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20  gin() generates 
33940 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f  leaves the curso
33950 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70  rs named.** in p
33960 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67  TabList pointing
33970 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70   at their approp
33980 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20  riate entries.  
33990 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a  The [...] code.*
339a0 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c  * can use OP_Col
339b0 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64  umn and OP_Rowid
339c0 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73   opcodes on thes
339d0 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74  e cursors to ext
339e0 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f  ract.** data fro
339f0 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61  m the various ta
33a00 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  bles of the loop
33a10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57  ..**.** If the W
33a20 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65  HERE clause is e
33a30 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63  mpty, the foreac
33a40 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63  h loops must eac
33a50 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20  h scan their.** 
33a60 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20  entire tables.  
33a70 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79  Thus a three-way
33a80 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e   join is an O(N^
33a90 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  3) operation.  B
33aa0 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  ut if.** the tab
33ab0 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73  les have indices
33ac0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74   and there are t
33ad0 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
33ae0 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a  E clause that.**
33af0 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20   refer to those 
33b00 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c  indices, a compl
33b10 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63  ete table scan c
33b20 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e  an be avoided an
33b30 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69  d the.** code wi
33b40 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74  ll run much fast
33b50 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65  er.  Most of the
33b60 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f   work of this ro
33b70 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e  utine is checkin
33b80 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74  g.** to see if t
33b90 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73  here are indices
33ba0 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
33bb0 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68  d to speed up th
33bc0 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65  e loop..**.** Te
33bd0 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
33be0 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f   clause are also
33bf0 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77   used to limit w
33c00 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c  hich rows actual
33c10 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f  ly.** make it to
33c20 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68   the "..." in th
33c30 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20  e middle of the 
33c40 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63  loop.  After eac
33c50 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20  h "foreach",.** 
33c60 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
33c70 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75  RE clause that u
33c80 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e  se only terms in
33c90 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f   that loop and o
33ca0 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72  uter.** loops ar
33cb0 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  e evaluated and 
33cc0 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20  if false a jump 
33cd0 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61  is made around a
33ce0 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  ll subsequent.**
33cf0 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72   inner loops (or
33d00 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e   around the "...
33d10 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63  " if the test oc
33d20 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
33d30 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c  inner-.** most l
33d40 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52  oop).**.** OUTER
33d50 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20   JOINS.**.** An 
33d60 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61  outer join of ta
33d70 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69  bles t1 and t2 i
33d80 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f  s conceptally co
33d90 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ded as follows:.
33da0 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68  **.**    foreach
33db0 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a   row1 in t1 do.*
33dc0 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a  *      flag = 0.
33dd0 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
33de0 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a  row2 in t2 do.**
33df0 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a          start:.*
33e00 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a  *          ....*
33e10 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  *          flag 
33e20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a  = 1.**      end.
33e30 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d  **      if flag=
33e40 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  =0 then.**      
33e50 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20    move the row2 
33e60 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c  cursor to a null
33e70 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67   row.**        g
33e80 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20  oto start.**    
33e90 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a    fi.**    end.*
33ea0 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c  *.** ORDER BY CL
33eb0 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a  AUSE PROCESSING.
33ec0 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69  **.** pOrderBy i
33ed0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
33ee0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
33ef0 73 65 20 28 6f 72 20 74 68 65 20 47 52 4f 55 50  se (or the GROUP
33f00 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66   BY clause.** if
33f10 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50   the WHERE_GROUP
33f20 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  BY flag is set i
33f30 6e 20 77 63 74 72 6c 46 6c 61 67 73 29 20 6f 66  n wctrlFlags) of
33f40 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
33f50 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ent.** if there 
33f60 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72  is one.  If ther
33f70 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
33f80 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68   clause or if th
33f90 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
33fa0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20   called from an 
33fb0 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
33fc0 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
33fd0 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c   pOrderBy is NUL
33fe0 4c 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20  L..*/.WhereInfo 
33ff0 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67  *sqlite3WhereBeg
34000 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  in(.  Parse *pPa
34010 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  rse,        /* T
34020 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
34030 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
34040 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20  pTabList,    /* 
34050 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c  FROM clause: A l
34060 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ist of all table
34070 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  s to be scanned 
34080 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
34090 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
340a0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
340b0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
340c0 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20  rderBy,   /* An 
340d0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
340e0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   or NULL */.  Ex
340f0 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53  prList *pResultS
34100 65 74 2c 20 2f 2a 20 52 65 73 75 6c 74 20 73 65  et, /* Result se
34110 74 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  t of the query *
34120 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
34130 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  gs,       /* One
34140 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20   of the WHERE_* 
34150 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e  flags defined in
34160 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a   sqliteInt.h */.
34170 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 20 20    int iIdxCur   
34180 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48          /* If WH
34190 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
341a0 59 20 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20  Y is set, index 
341b0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f  cursor number */
341c0 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57  .){.  int nByteW
341d0 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
341e0 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61   /* Num. bytes a
341f0 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65  llocated for Whe
34200 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f  reInfo struct */
34210 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b  .  int nTabList;
34220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34230 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
34240 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20  nts in pTabList 
34250 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
34260 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
34270 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74  /* Will become t
34280 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
34290 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
342a0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
342b0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
342c0 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
342d0 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20  database engine 
342e0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
342f0 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
34300 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20  /* Cursors that 
34310 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69  are not yet posi
34320 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72  tioned */.  Wher
34330 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c  eLoopBuilder sWL
34340 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  B;     /* The Wh
34350 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20  ereLoop builder 
34360 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
34370 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
34380 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
34390 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20  n mask set */.  
343a0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
343b0 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20  el;        /* A 
343c0 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
343d0 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20  pWInfo->a[] */. 
343e0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
343f0 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  p;          /* P
34400 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67  ointer to a sing
34410 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  le WhereLoop obj
34420 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b  ect */.  int ii;
34430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34440 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
34450 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ter */.  sqlite3
34460 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
34470 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
34480 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
34490 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
344a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
344b0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 0a 20  turn code */... 
344c0 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 6e 69   /* Variable ini
344d0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  tialization */. 
344e0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
344f0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42  ;.  memset(&sWLB
34500 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42  , 0, sizeof(sWLB
34510 29 29 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65  ));.  sWLB.pOrde
34520 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
34530 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68  .  /* Disable th
34540 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d  e DISTINCT optim
34550 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54  ization if SQLIT
34560 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73  E_DistinctOpt is
34570 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71   set via.  ** sq
34580 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28  lite3_test_ctrl(
34590 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
345a0 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e  OPTIMIZATIONS,..
345b0 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  .) */.  if( Opti
345c0 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
345d0 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74  (db, SQLITE_Dist
345e0 69 6e 63 74 4f 70 74 29 20 29 7b 0a 20 20 20 20  inctOpt) ){.    
345f0 77 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57  wctrlFlags &= ~W
34600 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
34610 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  CT;.  }..  /* Th
34620 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c  e number of tabl
34630 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
34640 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
34650 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   by the number o
34660 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61  f.  ** bits in a
34670 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20   Bitmask .  */. 
34680 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 4c   testcase( pTabL
34690 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29  ist->nSrc==BMS )
346a0 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  ;.  if( pTabList
346b0 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20  ->nSrc>BMS ){.  
346c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
346d0 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f  g(pParse, "at mo
346e0 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20  st %d tables in 
346f0 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20  a join", BMS);. 
34700 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
34710 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
34720 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65  tion normally ge
34730 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74 65 64  nerates a nested
34740 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61   loop for all ta
34750 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54  bles in .  ** pT
34760 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20  abList.  But if 
34770 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  the WHERE_ONETAB
34780 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20  LE_ONLY flag is 
34790 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f  set, then we sho
347a0 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65  uld.  ** only ge
347b0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
347c0 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65 20  the first table 
347d0 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20  in pTabList and 
347e0 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a  assume that.  **
347f0 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73   any cursors ass
34800 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 75 62  ociated with sub
34810 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61  sequent tables a
34820 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  re uninitialized
34830 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73  ..  */.  nTabLis
34840 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20  t = (wctrlFlags 
34850 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
34860 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54 61  _ONLY) ? 1 : pTa
34870 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20  bList->nSrc;..  
34880 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
34890 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57  initialize the W
348a0 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
348b0 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  re that will bec
348c0 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74  ome the.  ** ret
348d0 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e  urn value. A sin
348e0 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  gle allocation i
348f0 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
34900 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20  the WhereInfo.  
34910 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20 63  ** struct, the c
34920 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65  ontents of Where
34930 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68  Info.a[], the Wh
34940 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
34950 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ure.  ** and the
34960 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74   WhereMaskSet st
34970 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57  ructure. Since W
34980 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61  hereClause conta
34990 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20  ins an 8-byte.  
349a0 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20 42  ** field (type B
349b0 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20  itmask) it must 
349c0 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e  be aligned on an
349d0 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79   8-byte boundary
349e0 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72   on.  ** some ar
349f0 63 68 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e  chitectures. Hen
34a00 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20  ce the ROUND8() 
34a10 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42  below..  */.  nB
34a20 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44  yteWInfo = ROUND
34a30 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e  8(sizeof(WhereIn
34a40 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29  fo)+(nTabList-1)
34a50 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76  *sizeof(WhereLev
34a60 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  el));.  pWInfo =
34a70 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
34a80 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 57 49  Zero(db, nByteWI
34a90 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68 65  nfo + sizeof(Whe
34aa0 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20  reLoop));.  if( 
34ab0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
34ac0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
34ad0 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  bFree(db, pWInfo
34ae0 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  );.    pWInfo = 
34af0 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  0;.    goto wher
34b00 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
34b10 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  .  pWInfo->nLeve
34b20 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20  l = nTabList;.  
34b30 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d  pWInfo->pParse =
34b40 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66   pParse;.  pWInf
34b50 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54  o->pTabList = pT
34b60 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
34b70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
34b80 64 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d  derBy;.  pWInfo-
34b90 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 70 52  >pResultSet = pR
34ba0 65 73 75 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e  esultSet;.  pWIn
34bb0 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c  fo->iBreak = sql
34bc0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
34bd0 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  l(v);.  pWInfo->
34be0 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74  wctrlFlags = wct
34bf0 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66  rlFlags;.  pWInf
34c00 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  o->savedNQueryLo
34c10 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75  op = pParse->nQu
34c20 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b  eryLoop;.  pMask
34c30 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  Set = &pWInfo->s
34c40 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e  MaskSet;.  sWLB.
34c50 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b  pWInfo = pWInfo;
34c60 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70  .  sWLB.pWC = &p
34c70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57  WInfo->sWC;.  sW
34c80 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65  LB.pNew = (Where
34c90 4c 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a 29 70  Loop*)(((char*)p
34ca0 57 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66  WInfo)+nByteWInf
34cb0 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  o);.  assert( EI
34cc0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
34cd0 4e 54 28 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b  NT(sWLB.pNew) );
34ce0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  .  whereLoopInit
34cf0 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66  (sWLB.pNew);.#if
34d00 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
34d10 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49  .  sWLB.pNew->cI
34d20 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a  d = '*';.#endif.
34d30 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20  .  /* Split the 
34d40 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74  WHERE clause int
34d50 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78  o separate subex
34d60 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20  pressions where 
34d70 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70  each.  ** subexp
34d80 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
34d90 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f  ated by an AND o
34da0 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20  perator..  */.  
34db0 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73  initMaskSet(pMas
34dc0 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c  kSet);.  whereCl
34dd0 61 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f  auseInit(&pWInfo
34de0 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a  ->sWC, pWInfo);.
34df0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
34e00 65 43 6f 6e 73 74 61 6e 74 73 28 70 50 61 72 73  eConstants(pPars
34e10 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 77 68  e, pWhere);.  wh
34e20 65 72 65 53 70 6c 69 74 28 26 70 57 49 6e 66 6f  ereSplit(&pWInfo
34e30 2d 3e 73 57 43 2c 20 70 57 68 65 72 65 2c 20 54  ->sWC, pWhere, T
34e40 4b 5f 41 4e 44 29 3b 0a 20 20 73 71 6c 69 74 65  K_AND);.  sqlite
34e50 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
34e60 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f  a(pParse, -1); /
34e70 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63 6f 6f  * Insert the coo
34e80 6b 69 65 20 76 65 72 69 66 69 65 72 20 47 6f 74  kie verifier Got
34e90 6f 20 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a 20 53  o */.    .  /* S
34ea0 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57  pecial case: a W
34eb0 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
34ec0 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45   is constant.  E
34ed0 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a  valuate the.  **
34ee0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
34ef0 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72  either jump over
34f00 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65   all of the code
34f10 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20   or fall thru.. 
34f20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65   */.  if( pWhere
34f30 20 26 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30   && (nTabList==0
34f40 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49   || sqlite3ExprI
34f50 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
34f60 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20  (pWhere)) ){.   
34f70 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
34f80 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57 68 65  lse(pParse, pWhe
34f90 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  re, pWInfo->iBre
34fa0 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ak, SQLITE_JUMPI
34fb0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65  FNULL);.    pWhe
34fc0 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  re = 0;.  }..  /
34fd0 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
34fe0 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  No FROM clause. 
34ff0 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c 69   */.  if( nTabLi
35000 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  st==0 ){.    if(
35010 20 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e   pOrderBy ) pWIn
35020 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 31 3b 0a  fo->bOBSat = 1;.
35030 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61      if( wctrlFla
35040 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
35050 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
35060 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
35070 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
35080 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20  INCT_UNIQUE;.   
35090 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73   }.  }..  /* Ass
350a0 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74  ign a bit from t
350b0 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76  he bitmask to ev
350c0 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ery term in the 
350d0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a  FROM clause..  *
350e0 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73 73 69  *.  ** When assi
350f0 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20 76 61  gning bitmask va
35100 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61  lues to FROM cla
35110 75 73 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  use cursors, it 
35120 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 74 68 65  must be.  ** the
35130 20 63 61 73 65 20 74 68 61 74 20 69 66 20 58 20   case that if X 
35140 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  is the bitmask f
35150 6f 72 20 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d  or the N-th FROM
35160 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 65   clause term the
35170 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69 74 6d 61  n.  ** the bitma
35180 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20  sk for all FROM 
35190 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 6f 20  clause terms to 
351a0 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
351b0 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69  N-th term.  ** i
351c0 73 20 28 58 2d 31 29 2e 20 20 20 41 6e 20 65 78  s (X-1).   An ex
351d0 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68  pression from th
351e0 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61  e ON clause of a
351f0 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75   LEFT JOIN can u
35200 73 65 0a 20 20 2a 2a 20 69 74 73 20 45 78 70 72  se.  ** its Expr
35210 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
35220 20 76 61 6c 75 65 20 74 6f 20 66 69 6e 64 20 74   value to find t
35230 68 65 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68  he bitmask of th
35240 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20  e right table.  
35250 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ** of the join. 
35260 20 53 75 62 74 72 61 63 74 69 6e 67 20 6f 6e 65   Subtracting one
35270 20 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74 20   from the right 
35280 74 61 62 6c 65 20 62 69 74 6d 61 73 6b 20 67 69  table bitmask gi
35290 76 65 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61  ves a.  ** bitma
352a0 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  sk for all table
352b0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
352c0 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77   the join.  Know
352d0 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 0a  ing the bitmask.
352e0 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62    ** for all tab
352f0 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
35300 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69  of a left join i
35310 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69  s important.  Ti
35320 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a  cket #3015..  **
35330 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
35340 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65  bitmasks are cre
35350 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61  ated for all pTa
35360 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c  bList->nSrc tabl
35370 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c  es in.  ** pTabL
35380 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68  ist, not just th
35390 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74  e first nTabList
353a0 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69   tables.  nTabLi
353b0 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20  st is normally. 
353c0 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61   ** equal to pTa
353d0 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20  bList->nSrc but 
353e0 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e  might be shorten
353f0 65 64 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20  ed to 1 if the. 
35400 20 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42   ** WHERE_ONETAB
35410 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20  LE_ONLY flag is 
35420 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  set..  */.  for(
35430 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73  ii=0; ii<pTabLis
35440 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a  t->nSrc; ii++){.
35450 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70      createMask(p
35460 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
35470 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72  t->a[ii].iCursor
35480 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  );.  }.#ifndef N
35490 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69  DEBUG.  {.    Bi
354a0 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20  tmask toTheLeft 
354b0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  = 0;.    for(ii=
354c0 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e  0; ii<pTabList->
354d0 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nSrc; ii++){.   
354e0 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67     Bitmask m = g
354f0 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
35500 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d   pTabList->a[ii]
35510 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .iCursor);.     
35520 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d   assert( (m-1)==
35530 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20  toTheLeft );.   
35540 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20     toTheLeft |= 
35550 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  m;.    }.  }.#en
35560 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  dif..  /* Analyz
35570 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62  e all of the sub
35580 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f  expressions.  No
35590 74 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c  te that exprAnal
355a0 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a  yze() might.  **
355b0 20 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c   add new virtual
355c0 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20   terms onto the 
355d0 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
355e0 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20   clause.  We do 
355f0 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f  not.  ** want to
35600 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76   analyze these v
35610 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f  irtual terms, so
35620 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67   start analyzing
35630 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a   at the end.  **
35640 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72   and work forwar
35650 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64  d so that the ad
35660 64 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d  ded virtual term
35670 73 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63  s are never proc
35680 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78  essed..  */.  ex
35690 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61  prAnalyzeAll(pTa
356a0 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e  bList, &pWInfo->
356b0 73 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  sWC);.  if( db->
356c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
356d0 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
356e0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20  ginError;.  }.. 
356f0 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52   /* If the ORDER
35700 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
35710 29 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  ) clause contain
35720 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  s references to 
35730 67 65 6e 65 72 61 6c 0a 20 20 2a 2a 20 65 78 70  general.  ** exp
35740 72 65 73 73 69 6f 6e 73 2c 20 74 68 65 6e 20 77  ressions, then w
35750 65 20 77 6f 6e 27 74 20 62 65 20 61 62 6c 65 20  e won't be able 
35760 74 6f 20 73 61 74 69 73 66 79 20 69 74 20 75 73  to satisfy it us
35770 69 6e 67 20 69 6e 64 69 63 65 73 2c 20 73 6f 0a  ing indices, so.
35780 20 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e    ** go ahead an
35790 64 20 64 69 73 61 62 6c 65 20 69 74 20 6e 6f 77  d disable it now
357a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
357b0 64 65 72 42 79 20 26 26 20 28 77 63 74 72 6c 46  derBy && (wctrlF
357c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
357d0 54 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 20 29  T_DISTINCT)!=0 )
357e0 7b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  {.    for(ii=0; 
357f0 69 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  ii<pOrderBy->nEx
35800 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  pr; ii++){.     
35810 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73   Expr *pExpr = s
35820 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
35830 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e  llate(pOrderBy->
35840 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  a[ii].pExpr);.  
35850 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
35860 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p!=TK_COLUMN ){.
35870 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
35880 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
35890 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rBy = 0;.       
358a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
358b0 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69  lse if( pExpr->i
358c0 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
358d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
358e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
358f0 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
35900 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
35910 49 4e 43 54 20 29 7b 0a 20 20 20 20 69 66 28 20  INCT ){.    if( 
35920 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
35930 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ant(pParse, pTab
35940 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  List, &pWInfo->s
35950 57 43 2c 20 70 52 65 73 75 6c 74 53 65 74 29 20  WC, pResultSet) 
35960 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
35970 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e 67  DISTINCT marking
35980 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20   is pointless.  
35990 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20  Ignore it. */.  
359a0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
359b0 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
359c0 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
359d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
359e0 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
359f0 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44 45    /* Try to ORDE
35a00 52 20 42 59 20 74 68 65 20 72 65 73 75 6c 74 20  R BY the result 
35a10 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69 73 74  set to make dist
35a20 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e 67 20  inct processing 
35a30 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20 20 20  easier */.      
35a40 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
35a50 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49 53 54  gs |= WHERE_DIST
35a60 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20 70 57  INCTBY;.      pW
35a70 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d  Info->pOrderBy =
35a80 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 20   pResultSet;.   
35a90 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e   }.  }..  /* Con
35aa0 73 74 72 75 63 74 20 74 68 65 20 57 68 65 72 65  struct the Where
35ab0 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Loop objects */.
35ac0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
35ad0 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  fff,("*** Optimi
35ae0 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22  zer Start ***\n"
35af0 29 29 3b 0a 20 20 69 66 28 20 6e 54 61 62 4c 69  ));.  if( nTabLi
35b00 73 74 21 3d 31 20 7c 7c 20 77 68 65 72 65 53 68  st!=1 || whereSh
35b10 6f 72 74 43 75 74 28 26 73 57 4c 42 29 3d 3d 30  ortCut(&sWLB)==0
35b20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 68 65   ){.    rc = whe
35b30 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57  reLoopAddAll(&sW
35b40 4c 42 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  LB);.    if( rc 
35b50 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
35b60 6e 45 72 72 6f 72 3b 0a 20 20 0a 20 20 20 20 2f  nError;.  .    /
35b70 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66  * Display all of
35b80 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   the WhereLoop o
35b90 62 6a 65 63 74 73 20 69 66 20 77 68 65 72 65 74  bjects if wheret
35ba0 72 61 63 65 20 69 73 20 65 6e 61 62 6c 65 64 20  race is enabled 
35bb0 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  */.#ifdef WHERET
35bc0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
35bd0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
35be0 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eTrace ){.      
35bf0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20  WhereLoop *p;.  
35c00 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
35c10 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4c 61   static char zLa
35c20 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35 36  bel[] = "0123456
35c30 37 38 39 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d  789abcdefghijklm
35c40 6e 6f 70 71 72 73 74 75 76 77 79 78 7a 22 0a 20  nopqrstuvwyxz". 
35c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c70 20 20 20 20 20 20 22 41 42 43 44 45 46 47 48 49        "ABCDEFGHI
35c80 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58  JKLMNOPQRSTUVWYX
35c90 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d  Z";.      for(p=
35ca0 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
35cb0 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  i=0; p; p=p->pNe
35cc0 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20  xtLoop, i++){.  
35cd0 20 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a        p->cId = z
35ce0 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a  Label[i%sizeof(z
35cf0 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20  Label)];.       
35d00 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
35d10 70 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20  p, pTabList);.  
35d20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
35d30 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50  if.  .    whereP
35d40 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f  athSolver(pWInfo
35d50 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62  , 0);.    if( db
35d60 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
35d70 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
35d80 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70  Error;.    if( p
35d90 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
35da0 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65 50  ){.       whereP
35db0 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f  athSolver(pWInfo
35dc0 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  , pWInfo->nRowOu
35dd0 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28  t+1);.       if(
35de0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
35df0 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
35e00 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ginError;.    }.
35e10 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f    }.  if( pWInfo
35e20 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ->pOrderBy==0 &&
35e30 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
35e40 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65  LITE_ReverseOrde
35e50 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57  r)!=0 ){.     pW
35e60 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
35e70 28 42 69 74 6d 61 73 6b 29 28 2d 31 29 3b 0a 20  (Bitmask)(-1);. 
35e80 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
35e90 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45 52 28 64  >nErr || NEVER(d
35ea0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
35eb0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
35ec0 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
35ed0 7d 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  }.#ifdef WHERETR
35ee0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
35ef0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
35f00 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ace ){.    int i
35f10 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  i;.    sqlite3De
35f20 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20  bugPrintf("---- 
35f30 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64  Solution nRow=%d
35f40 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  ", pWInfo->nRowO
35f50 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ut);.    if( pWI
35f60 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 29 7b 0a 20  nfo->bOBSat ){. 
35f70 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
35f80 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42  gPrintf(" ORDERB
35f90 59 3d 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66  Y=0x%llx", pWInf
35fa0 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20  o->revMask);.   
35fb0 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20 70   }.    switch( p
35fc0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
35fd0 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57   ){.      case W
35fe0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
35ff0 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  IQUE: {.        
36000 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
36010 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75  tf("  DISTINCT=u
36020 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20 20 20  nique");.       
36030 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
36040 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
36050 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
36060 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D: {.        sql
36070 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
36080 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72 64 65  "  DISTINCT=orde
36090 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62  red");.        b
360a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
360b0 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
360c0 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
360d0 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D: {.        sql
360e0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
360f0 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72  "  DISTINCT=unor
36100 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20  dered");.       
36110 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
36120 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
36130 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
36140 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ");.    for(ii=0
36150 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ; ii<pWInfo->nLe
36160 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  vel; ii++){.    
36170 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
36180 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70  (pWInfo->a[ii].p
36190 57 4c 6f 6f 70 2c 20 70 54 61 62 4c 69 73 74 29  WLoop, pTabList)
361a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
361b0 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20  if.  /* Attempt 
361c0 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73 20 66  to omit tables f
361d0 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68 61  rom the join tha
361e0 74 20 64 6f 20 6e 6f 74 20 65 66 66 65 63 74 20  t do not effect 
361f0 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
36200 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
36210 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52 65 73  el>=2.   && pRes
36220 75 6c 74 53 65 74 21 3d 30 0a 20 20 20 26 26 20  ultSet!=0.   && 
36230 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
36240 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  led(db, SQLITE_O
36250 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29  mitNoopJoin).  )
36260 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 61  {.    Bitmask ta
36270 62 55 73 65 64 20 3d 20 65 78 70 72 4c 69 73 74  bUsed = exprList
36280 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
36290 53 65 74 2c 20 70 52 65 73 75 6c 74 53 65 74 29  Set, pResultSet)
362a0 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  ;.    if( pOrder
362b0 42 79 20 29 20 74 61 62 55 73 65 64 20 7c 3d 20  By ) tabUsed |= 
362c0 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
362d0 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72  ge(pMaskSet, pOr
362e0 64 65 72 42 79 29 3b 0a 20 20 20 20 77 68 69 6c  derBy);.    whil
362f0 65 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  e( pWInfo->nLeve
36300 6c 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 57 68  l>=2 ){.      Wh
36310 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
36320 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 4c 6f  *pEnd;.      pLo
36330 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 70  op = pWInfo->a[p
36340 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d  WInfo->nLevel-1]
36350 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69  .pWLoop;.      i
36360 66 28 20 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62  f( (pWInfo->pTab
36370 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69  List->a[pLoop->i
36380 54 61 62 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  Tab].jointype & 
36390 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62 72  JT_LEFT)==0 ) br
363a0 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 28  eak;.      if( (
363b0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
363c0 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
363d0 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28  )==0.       && (
363e0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
363f0 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d   WHERE_ONEROW)==
36400 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
36410 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
36420 7d 0a 20 20 20 20 20 20 69 66 28 20 28 74 61 62  }.      if( (tab
36430 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  Used & pLoop->ma
36440 73 6b 53 65 6c 66 29 21 3d 30 20 29 20 62 72 65  skSelf)!=0 ) bre
36450 61 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d  ak;.      pEnd =
36460 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73   sWLB.pWC->a + s
36470 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  WLB.pWC->nTerm;.
36480 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
36490 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65  sWLB.pWC->a; pTe
364a0 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  rm<pEnd; pTerm++
364b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
364c0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
364d0 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65   & pLoop->maskSe
364e0 6c 66 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  lf)!=0.         
364f0 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
36500 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
36510 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20  , EP_FromJoin). 
36520 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
36530 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
36540 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
36550 20 20 20 69 66 28 20 70 54 65 72 6d 3c 70 45 6e     if( pTerm<pEn
36560 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  d ) break;.     
36570 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66   WHERETRACE(0xff
36580 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c 6f  ff, ("-> drop lo
36590 6f 70 20 25 63 20 6e 6f 74 20 75 73 65 64 5c 6e  op %c not used\n
365a0 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b  ", pLoop->cId));
365b0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e  .      pWInfo->n
365c0 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e  Level--;.      n
365d0 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d  TabList--;.    }
365e0 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43  .  }.  WHERETRAC
365f0 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f  E(0xffff,("*** O
36600 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65  ptimizer Finishe
36610 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57  d ***\n"));.  pW
36620 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51  Info->pParse->nQ
36630 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e  ueryLoop += pWIn
36640 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20  fo->nRowOut;..  
36650 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  /* If the caller
36660 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72   is an UPDATE or
36670 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
36680 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73  t that is reques
36690 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65  ting.  ** to use
366a0 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f   a one-pass algo
366b0 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65  rithm, determine
366c0 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72   if this is appr
366d0 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68  opriate..  ** Th
366e0 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  e one-pass algor
366f0 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  ithm only works 
36700 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
36710 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  use constraints.
36720 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
36730 6e 74 20 74 6f 20 75 70 64 61 74 65 20 61 20 73  nt to update a s
36740 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a  ingle row..  */.
36750 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c    assert( (wctrl
36760 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
36770 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
36780 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0 || pWInfo->nLe
36790 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  vel==1 );.  if( 
367a0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
367b0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
367c0 52 45 44 29 21 3d 30 20 0a 20 20 20 26 26 20 28  RED)!=0 .   && (
367d0 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
367e0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
367f0 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 20  HERE_ONEROW)!=0 
36800 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f  ){.    pWInfo->o
36810 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20 20  kOnePass = 1;.  
36820 20 20 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 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  = ~WHERE_IDX_ONL
36850 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  Y;.  }..  /* Ope
36860 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  n all tables in 
36870 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64  the pTabList and
36880 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c   any indices sel
36890 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73  ected for.  ** s
368a0 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74  earching those t
368b0 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 6e 6f  ables..  */.  no
368c0 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
368d0 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30  sk)0;.  for(ii=0
368e0 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
368f0 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b  >a; ii<nTabList;
36900 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29   ii++, pLevel++)
36910 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
36920 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  b;     /* Table 
36930 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69  to open */.    i
36940 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
36950 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61  /* Index of data
36960 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
36970 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20  table/index */. 
36980 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
36990 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
369a0 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20  ;..    pTabItem 
369b0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
369c0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
369d0 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74     pTab = pTabIt
369e0 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44  em->pTab;.    iD
369f0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
36a00 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
36a10 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
36a20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
36a30 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28  >pWLoop;.    if(
36a40 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
36a50 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
36a60 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  !=0 || pTab->pSe
36a70 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  lect ){.      /*
36a80 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
36a90 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66     }else.#ifndef
36aa0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
36ab0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
36ac0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
36ad0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
36ae0 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
36af0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
36b00 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63  pVTab = (const c
36b10 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74  har *)sqlite3Get
36b20 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
36b30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72  ;.      int iCur
36b40 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
36b50 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  rsor;.      sqli
36b60 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
36b70 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c   OP_VOpen, iCur,
36b80 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34   0, 0, pVTab, P4
36b90 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73  _VTAB);.    }els
36ba0 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28  e if( IsVirtual(
36bb0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f  pTab) ){.      /
36bc0 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65  * noop */.    }e
36bd0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
36be0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
36bf0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
36c00 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  NLY)==0.        
36c10 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
36c20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45  & WHERE_OMIT_OPE
36c30 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a 20  N_CLOSE)==0 ){. 
36c40 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 57       int op = pW
36c50 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
36c60 3f 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 3a  ? OP_OpenWrite :
36c70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20   OP_OpenRead;.  
36c80 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
36c90 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
36ca0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  bItem->iCursor, 
36cb0 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a  iDb, pTab, op);.
36cc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
36cd0 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
36ce0 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  ss && pTab->nCol
36cf0 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
36d00 20 74 65 73 74 63 61 73 65 28 20 21 70 57 49 6e   testcase( !pWIn
36d10 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26  fo->okOnePass &&
36d20 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
36d30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
36d40 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
36d50 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42   && pTab->nCol<B
36d60 4d 53 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69  MS ){.        Bi
36d70 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74  tmask b = pTabIt
36d80 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20  em->colUsed;.   
36d90 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a       int n = 0;.
36da0 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b          for(; b;
36db0 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a   b=b>>1, n++){}.
36dc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
36dd0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 73  dbeChangeP4(v, s
36de0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
36df0 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20 20 20  tAddr(v)-1, .   
36e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e10 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
36e20 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50  INT_TO_PTR(n), P
36e30 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20  4_INT32);.      
36e40 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61    assert( n<=pTa
36e50 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
36e60 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
36e70 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
36e80 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
36e90 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
36ea0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
36eb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f     }.    if( pLo
36ec0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
36ed0 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
36ee0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20       Index *pIx 
36ef0 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
36f00 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 4b  .pIndex;.      K
36f10 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73  eyInfo *pKey = s
36f20 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
36f30 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b  fo(pParse, pIx);
36f40 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a  .      /* FIXME:
36f50 20 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61    As an optimiza
36f60 74 69 6f 6e 20 75 73 65 20 70 54 61 62 49 74 65  tion use pTabIte
36f70 6d 2d 3e 69 43 75 72 73 6f 72 20 69 66 20 57 48  m->iCursor if WH
36f80 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 2a 2f 0a  ERE_IDX_ONLY */.
36f90 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78        int iIndex
36fa0 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  Cur = pLevel->iI
36fb0 64 78 43 75 72 20 3d 20 69 49 64 78 43 75 72 20  dxCur = iIdxCur 
36fc0 3f 20 69 49 64 78 43 75 72 20 3a 20 70 50 61 72  ? iIdxCur : pPar
36fd0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
36fe0 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70    assert( pIx->p
36ff0 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
37000 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61  chema );.      a
37010 73 73 65 72 74 28 20 69 49 6e 64 65 78 43 75 72  ssert( iIndexCur
37020 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  >=0 );.      sql
37030 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
37040 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
37050 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e 74  IndexCur, pIx->t
37060 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20  num, iDb,.      
37070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37080 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50    (char*)pKey, P
37090 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
370a0 46 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  F);.      VdbeCo
370b0 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
370c0 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  pIx->zName));.  
370d0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
370e0 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
370f0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
37100 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67    notReady &= ~g
37110 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
37120 73 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74  sMaskSet, pTabIt
37130 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
37140 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  }.  pWInfo->iTop
37150 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
37160 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
37170 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
37180 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
37190 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20  eBeginError;..  
371a0 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
371b0 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73  code to do the s
371c0 65 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65  earch.  Each ite
371d0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f  ration of the fo
371e0 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f  r.  ** loop belo
371f0 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  w generates code
37200 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65   for a single ne
37210 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65  sted loop of the
37220 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d   VM.  ** program
37230 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64  ..  */.  notRead
37240 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  y = ~(Bitmask)0;
37250 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
37260 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b  nTabList; ii++){
37270 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
37280 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 23 69  WInfo->a[ii];.#i
37290 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
372a0 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
372b0 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  X.    if( (pLeve
372c0 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  l->pWLoop->wsFla
372d0 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
372e0 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20  INDEX)!=0 ){.   
372f0 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f     constructAuto
37300 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61 72 73  maticIndex(pPars
37310 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  e, &pWInfo->sWC,
37320 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
37330 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
37340 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f  evel->iFrom], no
37350 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b  tReady, pLevel);
37360 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  .      if( db->m
37370 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
37380 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
37390 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  or;.    }.#endif
373a0 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53  .    explainOneS
373b0 63 61 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  can(pParse, pTab
373c0 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69  List, pLevel, ii
373d0 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c  , pLevel->iFrom,
373e0 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20   wctrlFlags);.  
373f0 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f    pLevel->addrBo
37400 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dy = sqlite3Vdbe
37410 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
37420 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 63      notReady = c
37430 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28  odeOneLoopStart(
37440 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52  pWInfo, ii, notR
37450 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66  eady);.    pWInf
37460 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70  o->iContinue = p
37470 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b  Level->addrCont;
37480 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e  .  }..  /* Done.
37490 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 57 49   */.  return pWI
374a0 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  nfo;..  /* Jump 
374b0 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66  here if malloc f
374c0 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67  ails */.whereBeg
374d0 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28 20 70  inError:.  if( p
374e0 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50 61  WInfo ){.    pPa
374f0 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
37500 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e  = pWInfo->savedN
37510 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77  QueryLoop;.    w
37520 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c  hereInfoFree(db,
37530 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20   pWInfo);.  }.  
37540 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
37550 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
37560 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
37570 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d   loop.  See comm
37580 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69  ents on .** sqli
37590 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
375a0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
375b0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  nformation..*/.v
375c0 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  oid sqlite3Where
375d0 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  End(WhereInfo *p
375e0 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20  WInfo){.  Parse 
375f0 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
37600 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65  ->pParse;.  Vdbe
37610 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
37620 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
37630 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
37640 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  el;.  WhereLoop 
37650 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73  *pLoop;.  SrcLis
37660 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57  t *pTabList = pW
37670 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
37680 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
37690 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
376a0 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20  * Generate loop 
376b0 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65  termination code
376c0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
376d0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
376e0 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d  Parse);.  for(i=
376f0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31  pWInfo->nLevel-1
37700 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
37710 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
37720 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c  fo->a[i];.    pL
37730 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
37740 4c 6f 6f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65  Loop;.    sqlite
37750 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
37760 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
37770 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  rCont);.    if( 
37780 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e  pLevel->op!=OP_N
37790 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  oop ){.      sql
377a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
377b0 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c  , pLevel->op, pL
377c0 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c  evel->p1, pLevel
377d0 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  ->p2);.      sql
377e0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
377f0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b  (v, pLevel->p5);
37800 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
37810 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
37820 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26  WHERE_IN_ABLE &&
37830 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
37840 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  n>0 ){.      str
37850 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b  uct InLoop *pIn;
37860 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
37870 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
37880 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
37890 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b  Level->addrNxt);
378a0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65  .      for(j=pLe
378b0 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70  vel->u.in.nIn, p
378c0 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  In=&pLevel->u.in
378d0 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a  .aInLoop[j-1]; j
378e0 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b  >0; j--, pIn--){
378f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
37900 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
37910 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31  pIn->addrInTop+1
37920 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
37930 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
37940 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c  pIn->eEndLoopOp,
37950 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d   pIn->iCur, pIn-
37960 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20  >addrInTop);.   
37970 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37980 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d  JumpHere(v, pIn-
37990 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20  >addrInTop-1);. 
379a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
379b0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
379c0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
379d0 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  oop);.    }.    
379e0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
379f0 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
37a00 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  l->addrBrk);.   
37a10 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
37a20 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
37a30 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
37a40 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
37a50 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
37a60 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  fPos, pLevel->iL
37a70 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20  eftJoin);.      
37a80 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
37a90 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
37aa0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20  IDX_ONLY)==0.   
37ab0 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f          || (pLoo
37ac0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
37ad0 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29  RE_INDEXED)!=0 )
37ae0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f  ;.      if( (pLo
37af0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
37b00 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
37b10 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
37b20 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
37b30 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61   OP_NullRow, pTa
37b40 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
37b50 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
37b60 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
37b70 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
37b80 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20  NDEXED ){.      
37b90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
37ba0 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
37bb0 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  w, pLevel->iIdxC
37bc0 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ur);.      }.   
37bd0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
37be0 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a  p==OP_Return ){.
37bf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
37c00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
37c10 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70  Gosub, pLevel->p
37c20 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46  1, pLevel->addrF
37c30 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  irst);.      }el
37c40 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
37c50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
37c60 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
37c70 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
37c80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
37c90 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
37ca0 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
37cb0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
37cc0 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69   "break" point i
37cd0 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73  s here, just pas
37ce0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
37cf0 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a   outer loop..  *
37d00 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20  * Set it..  */. 
37d10 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
37d20 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e  lveLabel(v, pWIn
37d30 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
37d40 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20  /* Close all of 
37d50 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
37d60 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20   were opened by 
37d70 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
37d80 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
37d90 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
37da0 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  <=pTabList->nSrc
37db0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   );.  for(i=0, p
37dc0 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
37dd0 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   i<pWInfo->nLeve
37de0 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  l; i++, pLevel++
37df0 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
37e00 64 78 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75  dx = 0;.    stru
37e10 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
37e20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61  *pTabItem = &pTa
37e30 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
37e40 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62  >iFrom];.    Tab
37e50 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49  le *pTab = pTabI
37e60 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  tem->pTab;.    a
37e70 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
37e80 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ;.    pLoop = pL
37e90 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
37ea0 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
37eb0 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
37ec0 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26  eral)==0.     &&
37ed0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
37ee0 30 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66  0.     && (pWInf
37ef0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
37f00 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f  WHERE_OMIT_OPEN_
37f10 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b  CLOSE)==0.    ){
37f20 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20  .      int ws = 
37f30 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  pLoop->wsFlags;.
37f40 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66        if( !pWInf
37f50 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20  o->okOnePass && 
37f60 28 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  (ws & WHERE_IDX_
37f70 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
37f80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
37f90 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
37fa0 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
37fb0 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
37fc0 20 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57       if( (ws & W
37fd0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
37fe0 20 26 26 20 28 77 73 20 26 20 28 57 48 45 52 45   && (ws & (WHERE
37ff0 5f 49 50 4b 7c 57 48 45 52 45 5f 41 55 54 4f 5f  _IPK|WHERE_AUTO_
38000 49 4e 44 45 58 29 29 3d 3d 30 20 29 7b 0a 20 20  INDEX))==0 ){.  
38010 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
38020 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
38030 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ose, pLevel->iId
38040 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
38050 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
38060 74 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61  this scan uses a
38070 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44  n index, make VD
38080 42 45 20 63 6f 64 65 20 73 75 62 73 74 69 74 75  BE code substitu
38090 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61  tions to read da
380a0 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  ta.    ** from t
380b0 68 65 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64  he index instead
380c0 20 6f 66 20 66 72 6f 6d 20 74 68 65 20 74 61 62   of from the tab
380d0 6c 65 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c  le where possibl
380e0 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63 61 73 65  e.  In some case
380f0 73 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 6f 70  s.    ** this op
38100 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72 65 76 65  timization preve
38110 6e 74 73 20 74 68 65 20 74 61 62 6c 65 20 66 72  nts the table fr
38120 6f 6d 20 65 76 65 72 20 62 65 69 6e 67 20 72 65  om ever being re
38130 61 64 2c 20 77 68 69 63 68 20 63 61 6e 0a 20 20  ad, which can.  
38140 20 20 2a 2a 20 79 69 65 6c 64 20 61 20 73 69 67    ** yield a sig
38150 6e 69 66 69 63 61 6e 74 20 70 65 72 66 6f 72 6d  nificant perform
38160 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20  ance boost..    
38170 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73  ** .    ** Calls
38180 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
38190 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65  erator in betwee
381a0 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  n sqlite3WhereBe
381b0 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73  gin and.    ** s
381c0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77  qlite3WhereEnd w
381d0 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64  ill have created
381e0 20 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72   code that refer
381f0 65 6e 63 65 73 20 74 6