/ Hex Artifact Content
Login

Artifact 67a823e7816464bc1de998841e87a2a3e4c20a94:


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 75 38 20 69 46 72  loop */.  u8 iFr
0eb0: 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  om;             
0ec0: 2f 2a 20 57 68 69 63 68 20 65 6e 74 72 79 20 69  /* Which entry i
0ed0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
0ee0: 65 20 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 70 35  e */.  u8 op, p5
0ef0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0f00: 4f 70 63 6f 64 65 20 61 6e 64 20 50 35 20 6f 66  Opcode and P5 of
0f10: 20 74 68 65 20 6f 70 63 6f 64 65 20 74 68 61 74   the opcode that
0f20: 20 65 6e 64 73 20 74 68 65 20 6c 6f 6f 70 20 2a   ends the loop *
0f30: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 70 32 3b 20  /.  int p1, p2; 
0f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
0f50: 72 61 6e 64 73 20 6f 66 20 74 68 65 20 6f 70 63  rands of the opc
0f60: 6f 64 65 20 75 73 65 64 20 74 6f 20 65 6e 64 73  ode used to ends
0f70: 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75   the loop */.  u
0f80: 6e 69 6f 6e 20 7b 20 20 20 20 20 20 20 20 20 20  nion {          
0f90: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
0fa0: 69 6f 6e 20 74 68 61 74 20 64 65 70 65 6e 64 73  ion that depends
0fb0: 20 6f 6e 20 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c   on pWLoop->wsFl
0fc0: 61 67 73 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  ags */.    struc
0fd0: 74 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49  t {.      int nI
0fe0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
0ff0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
1000: 72 69 65 73 20 69 6e 20 61 49 6e 4c 6f 6f 70 5b  ries in aInLoop[
1010: 5d 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  ] */.      struc
1020: 74 20 49 6e 4c 6f 6f 70 20 7b 0a 20 20 20 20 20  t InLoop {.     
1030: 20 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20     int iCur;    
1040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1050: 20 56 44 42 45 20 63 75 72 73 6f 72 20 75 73 65   VDBE cursor use
1060: 64 20 62 79 20 74 68 69 73 20 49 4e 20 6f 70 65  d by this IN ope
1070: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  rator */.       
1080: 20 69 6e 74 20 61 64 64 72 49 6e 54 6f 70 3b 20   int addrInTop; 
1090: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
10a0: 66 20 74 68 65 20 49 4e 20 6c 6f 6f 70 20 2a 2f  f the IN loop */
10b0: 0a 20 20 20 20 20 20 20 20 75 38 20 65 45 6e 64  .        u8 eEnd
10c0: 4c 6f 6f 70 4f 70 3b 20 20 20 20 20 20 20 20 20  LoopOp;         
10d0: 2f 2a 20 49 4e 20 4c 6f 6f 70 20 74 65 72 6d 69  /* IN Loop termi
10e0: 6e 61 74 6f 72 2e 20 4f 50 5f 4e 65 78 74 20 6f  nator. OP_Next o
10f0: 72 20 4f 50 5f 50 72 65 76 20 2a 2f 0a 20 20 20  r OP_Prev */.   
1100: 20 20 20 7d 20 2a 61 49 6e 4c 6f 6f 70 3b 20 20     } *aInLoop;  
1110: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
1120: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 65 61  rmation about ea
1130: 63 68 20 6e 65 73 74 65 64 20 49 4e 20 6f 70 65  ch nested IN ope
1140: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 20 69  rator */.    } i
1150: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1160: 20 20 20 2f 2a 20 55 73 65 64 20 77 68 65 6e 20     /* Used when 
1170: 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26  pWLoop->wsFlags&
1180: 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 2a 2f  WHERE_IN_ABLE */
1190: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76  .    Index *pCov
11a0: 69 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  idx;       /* Po
11b0: 73 73 69 62 6c 65 20 63 6f 76 65 72 69 6e 67 20  ssible covering 
11c0: 69 6e 64 65 78 20 66 6f 72 20 57 48 45 52 45 5f  index for WHERE_
11d0: 4d 55 4c 54 49 5f 4f 52 20 2a 2f 0a 20 20 7d 20  MULTI_OR */.  } 
11e0: 75 3b 0a 20 20 73 74 72 75 63 74 20 57 68 65 72  u;.  struct Wher
11f0: 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20  eLoop *pWLoop;  
1200: 2f 2a 20 54 68 65 20 73 65 6c 65 63 74 65 64 20  /* The selected 
1210: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1220: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61   */.};../*.** Ea
1230: 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ch instance of t
1240: 68 69 73 20 6f 62 6a 65 63 74 20 72 65 70 72 65  his object repre
1250: 73 65 6e 74 73 20 61 6e 20 61 6c 67 6f 72 69 74  sents an algorit
1260: 68 6d 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e  hm for evaluatin
1270: 67 20 6f 6e 65 0a 2a 2a 20 74 65 72 6d 20 6f 66  g one.** term of
1280: 20 61 20 6a 6f 69 6e 2e 20 20 45 76 65 72 79 20   a join.  Every 
1290: 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d  term of the FROM
12a0: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 68 61 76   clause will hav
12b0: 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e  e at least.** on
12c0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
12d0: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
12e0: 20 28 75 6e 6c 65 73 73 20 49 4e 44 45 58 45 44   (unless INDEXED
12f0: 20 42 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a   BY constraints.
1300: 2a 2a 20 70 72 65 76 65 6e 74 20 61 20 71 75 65  ** prevent a que
1310: 72 79 20 73 6f 6c 75 74 69 6f 6e 20 2d 20 77 68  ry solution - wh
1320: 69 63 68 20 69 73 20 61 6e 20 65 72 72 6f 72 29  ich is an error)
1330: 20 61 6e 64 20 6d 61 6e 79 20 74 65 72 6d 73 20   and many terms 
1340: 6f 66 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  of the.** FROM c
1350: 6c 61 75 73 65 20 77 69 6c 6c 20 68 61 76 65 20  lause will have 
1360: 6d 75 6c 74 69 70 6c 65 20 57 68 65 72 65 4c 6f  multiple WhereLo
1370: 6f 70 20 6f 62 6a 65 63 74 73 2c 20 65 61 63 68  op objects, each
1380: 20 64 65 73 63 72 69 62 69 6e 67 20 61 0a 2a 2a   describing a.**
1390: 20 70 6f 74 65 6e 74 69 61 6c 20 77 61 79 20 6f   potential way o
13a0: 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  f implementing t
13b0: 68 61 74 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  hat FROM-clause 
13c0: 74 65 72 6d 2c 20 74 6f 67 65 74 68 65 72 20 77  term, together w
13d0: 69 74 68 0a 2a 2a 20 64 65 70 65 6e 64 65 6e 63  ith.** dependenc
13e0: 69 65 73 20 61 6e 64 20 63 6f 73 74 20 65 73 74  ies and cost est
13f0: 69 6d 61 74 65 73 20 66 6f 72 20 75 73 69 6e 67  imates for using
1400: 20 74 68 65 20 63 68 6f 73 65 6e 20 61 6c 67 6f   the chosen algo
1410: 72 69 74 68 6d 2e 0a 2a 2a 0a 2a 2a 20 51 75 65  rithm..**.** Que
1420: 72 79 20 70 6c 61 6e 6e 69 6e 67 20 63 6f 6e 73  ry planning cons
1430: 69 73 74 73 20 6f 66 20 62 75 69 6c 64 69 6e 67  ists of building
1440: 20 75 70 20 61 20 63 6f 6c 6c 65 63 74 69 6f 6e   up a collection
1450: 20 6f 66 20 74 68 65 73 65 20 57 68 65 72 65 4c   of these WhereL
1460: 6f 6f 70 0a 2a 2a 20 6f 62 6a 65 63 74 73 2c 20  oop.** objects, 
1470: 74 68 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20 61  then computing a
1480: 20 70 61 72 74 69 63 75 6c 61 72 20 73 65 71 75   particular sequ
1490: 65 6e 63 65 20 6f 66 20 57 68 65 72 65 4c 6f 6f  ence of WhereLoo
14a0: 70 20 6f 62 6a 65 63 74 73 2c 20 77 69 74 68 0a  p objects, with.
14b0: 2a 2a 20 6f 6e 65 20 57 68 65 72 65 4c 6f 6f 70  ** one WhereLoop
14c0: 20 6f 62 6a 65 63 74 20 70 65 72 20 46 52 4f 4d   object per FROM
14d0: 20 63 6c 61 75 73 65 20 74 65 72 6d 2c 20 74 68   clause term, th
14e0: 61 74 20 73 61 74 69 73 66 79 20 61 6c 6c 20 64  at satisfy all d
14f0: 65 70 65 6e 64 65 6e 63 69 65 73 0a 2a 2a 20 61  ependencies.** a
1500: 6e 64 20 74 68 61 74 20 6d 69 6e 69 6d 69 7a 65  nd that minimize
1510: 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 63 6f 73   the overall cos
1520: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  t..*/.struct Whe
1530: 72 65 4c 6f 6f 70 20 7b 0a 20 20 42 69 74 6d 61  reLoop {.  Bitma
1540: 73 6b 20 70 72 65 72 65 71 3b 20 20 20 20 20 20  sk prereq;      
1550: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 6f   /* Bitmask of o
1560: 74 68 65 72 20 6c 6f 6f 70 73 20 74 68 61 74 20  ther loops that 
1570: 6d 75 73 74 20 72 75 6e 20 66 69 72 73 74 20 2a  must run first *
1580: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  /.  Bitmask mask
1590: 53 65 6c 66 3b 20 20 20 20 20 2f 2a 20 42 69 74  Self;     /* Bit
15a0: 6d 61 73 6b 20 69 64 65 6e 74 69 66 79 69 6e 67  mask identifying
15b0: 20 74 61 62 6c 65 20 69 54 61 62 20 2a 2f 0a 23   table iTab */.#
15c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
15d0: 55 47 0a 20 20 63 68 61 72 20 63 49 64 3b 20 20  UG.  char cId;  
15e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79             /* Sy
15f0: 6d 62 6f 6c 69 63 20 49 44 20 6f 66 20 74 68 69  mbolic ID of thi
1600: 73 20 6c 6f 6f 70 20 66 6f 72 20 64 65 62 75 67  s loop for debug
1610: 67 69 6e 67 20 75 73 65 20 2a 2f 0a 23 65 6e 64  ging use */.#end
1620: 69 66 0a 20 20 75 38 20 69 54 61 62 3b 20 20 20  if.  u8 iTab;   
1630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1640: 73 69 74 69 6f 6e 20 69 6e 20 46 52 4f 4d 20 63  sition in FROM c
1650: 6c 61 75 73 65 20 6f 66 20 74 61 62 6c 65 20 66  lause of table f
1660: 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a  or this loop */.
1670: 20 20 75 38 20 69 53 6f 72 74 49 64 78 3b 20 20    u8 iSortIdx;  
1680: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 69          /* Sorti
1690: 6e 67 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 2e  ng index number.
16a0: 20 20 30 3d 3d 4e 6f 6e 65 20 2a 2f 0a 20 20 57    0==None */.  W
16b0: 68 65 72 65 43 6f 73 74 20 72 53 65 74 75 70 3b  hereCost rSetup;
16c0: 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65       /* One-time
16d0: 20 73 65 74 75 70 20 63 6f 73 74 20 28 65 78 3a   setup cost (ex:
16e0: 20 63 72 65 61 74 65 20 74 72 61 6e 73 69 65 6e   create transien
16f0: 74 20 69 6e 64 65 78 29 20 2a 2f 0a 20 20 57 68  t index) */.  Wh
1700: 65 72 65 43 6f 73 74 20 72 52 75 6e 3b 20 20 20  ereCost rRun;   
1710: 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 72      /* Cost of r
1720: 75 6e 6e 69 6e 67 20 65 61 63 68 20 6c 6f 6f 70  unning each loop
1730: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
1740: 6e 4f 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 45  nOut;       /* E
1750: 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
1760: 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a  of output rows *
1770: 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20  /.  union {.    
1780: 73 74 72 75 63 74 20 7b 20 20 20 20 20 20 20 20  struct {        
1790: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d         /* Inform
17a0: 61 74 69 6f 6e 20 66 6f 72 20 69 6e 74 65 72 6e  ation for intern
17b0: 61 6c 20 62 74 72 65 65 20 74 61 62 6c 65 73 20  al btree tables 
17c0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71  */.      int nEq
17d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 71 75  /* Number of equ
17f0: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1800: 73 20 2a 2f 0a 20 20 20 20 20 20 49 6e 64 65 78  s */.      Index
1810: 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
1820: 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 2c    /* Index used,
1830: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20   or NULL */.    
1840: 7d 20 62 74 72 65 65 3b 0a 20 20 20 20 73 74 72  } btree;.    str
1850: 75 63 74 20 7b 20 20 20 20 20 20 20 20 20 20 20  uct {           
1860: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
1870: 6f 6e 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74  on for virtual t
1880: 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 69  ables */.      i
1890: 6e 74 20 69 64 78 4e 75 6d 3b 20 20 20 20 20 20  nt idxNum;      
18a0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e        /* Index n
18b0: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 75  umber */.      u
18c0: 38 20 6e 65 65 64 46 72 65 65 3b 20 20 20 20 20  8 needFree;     
18d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
18e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 69 64   sqlite3_free(id
18f0: 78 53 74 72 29 20 69 73 20 6e 65 65 64 65 64 20  xStr) is needed 
1900: 2a 2f 0a 20 20 20 20 20 20 75 38 20 69 73 4f 72  */.      u8 isOr
1910: 64 65 72 65 64 3b 20 20 20 20 20 20 20 20 20 20  dered;          
1920: 2f 2a 20 54 72 75 65 20 69 66 20 73 61 74 69 73  /* True if satis
1930: 66 69 65 73 20 4f 52 44 45 52 20 42 59 20 2a 2f  fies ORDER BY */
1940: 0a 20 20 20 20 20 20 75 31 36 20 6f 6d 69 74 4d  .      u16 omitM
1950: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ask;          /*
1960: 20 54 65 72 6d 73 20 74 68 61 74 20 6d 61 79 20   Terms that may 
1970: 62 65 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20  be omitted */.  
1980: 20 20 20 20 63 68 61 72 20 2a 69 64 78 53 74 72      char *idxStr
1990: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
19a0: 64 65 78 20 69 64 65 6e 74 69 66 69 65 72 20 73  dex identifier s
19b0: 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 20 76  tring */.    } v
19c0: 74 61 62 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33  tab;.  } u;.  u3
19d0: 32 20 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20  2 wsFlags;      
19e0: 20 20 20 20 2f 2a 20 57 48 45 52 45 5f 2a 20 66      /* WHERE_* f
19f0: 6c 61 67 73 20 64 65 73 63 72 69 62 69 6e 67 20  lags describing 
1a00: 74 68 65 20 70 6c 61 6e 20 2a 2f 0a 20 20 75 31  the plan */.  u1
1a10: 36 20 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20 20  6 nLTerm;       
1a20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1a30: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 4c 54 65   entries in aLTe
1a40: 72 6d 5b 5d 20 2a 2f 0a 20 20 2f 2a 2a 2a 2a 20  rm[] */.  /**** 
1a50: 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 29 20  whereLoopXfer() 
1a60: 63 6f 70 69 65 73 20 66 69 65 6c 64 73 20 61 62  copies fields ab
1a70: 6f 76 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ove ************
1a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 20 64  ***********/.# d
1a90: 65 66 69 6e 65 20 57 48 45 52 45 5f 4c 4f 4f 50  efine WHERE_LOOP
1aa0: 5f 58 46 45 52 5f 53 5a 20 6f 66 66 73 65 74 6f  _XFER_SZ offseto
1ab0: 66 28 57 68 65 72 65 4c 6f 6f 70 2c 6e 4c 53 6c  f(WhereLoop,nLSl
1ac0: 6f 74 29 0a 20 20 75 31 36 20 6e 4c 53 6c 6f 74  ot).  u16 nLSlot
1ad0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
1ae0: 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 61  umber of slots a
1af0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4c 54  llocated for aLT
1b00: 65 72 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  erm[] */.  Where
1b10: 54 65 72 6d 20 2a 2a 61 4c 54 65 72 6d 3b 20 20  Term **aLTerm;  
1b20: 20 2f 2a 20 57 68 65 72 65 54 65 72 6d 73 20 75   /* WhereTerms u
1b30: 73 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  sed */.  WhereLo
1b40: 6f 70 20 2a 70 4e 65 78 74 4c 6f 6f 70 3b 20 2f  op *pNextLoop; /
1b50: 2a 20 4e 65 78 74 20 57 68 65 72 65 4c 6f 6f 70  * Next WhereLoop
1b60: 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 57   object in the W
1b70: 68 65 72 65 43 6c 61 75 73 65 20 2a 2f 0a 20 20  hereClause */.  
1b80: 57 68 65 72 65 54 65 72 6d 20 2a 61 4c 54 65 72  WhereTerm *aLTer
1b90: 6d 53 70 61 63 65 5b 34 5d 3b 20 20 2f 2a 20 49  mSpace[4];  /* I
1ba0: 6e 69 74 69 61 6c 20 61 4c 54 65 72 6d 5b 5d 20  nitial aLTerm[] 
1bb0: 73 70 61 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  space */.};../* 
1bc0: 54 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64  This object hold
1bd0: 73 20 74 68 65 20 70 72 65 72 65 71 75 69 73 69  s the prerequisi
1be0: 74 65 73 20 61 6e 64 20 74 68 65 20 63 6f 73 74  tes and the cost
1bf0: 20 6f 66 20 72 75 6e 6e 69 6e 67 20 61 0a 2a 2a   of running a.**
1c00: 20 73 75 62 71 75 65 72 79 20 6f 6e 20 6f 6e 65   subquery on one
1c10: 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 4f   operand of an O
1c20: 52 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 74 68  R operator in th
1c30: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  e WHERE clause..
1c40: 2a 2a 20 53 65 65 20 57 68 65 72 65 4f 72 53 65  ** See WhereOrSe
1c50: 74 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  t for additional
1c60: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 0a 2a 2f   information .*/
1c70: 0a 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 43  .struct WhereOrC
1c80: 6f 73 74 20 7b 0a 20 20 42 69 74 6d 61 73 6b 20  ost {.  Bitmask 
1c90: 70 72 65 72 65 71 3b 20 20 20 20 20 2f 2a 20 50  prereq;     /* P
1ca0: 72 65 72 65 71 75 69 73 69 74 65 73 20 2a 2f 0a  rerequisites */.
1cb0: 20 20 57 68 65 72 65 43 6f 73 74 20 72 52 75 6e    WhereCost rRun
1cc0: 3b 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66  ;     /* Cost of
1cd0: 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 73 75   running this su
1ce0: 62 71 75 65 72 79 20 2a 2f 0a 20 20 57 68 65 72  bquery */.  Wher
1cf0: 65 43 6f 73 74 20 6e 4f 75 74 3b 20 20 20 20 20  eCost nOut;     
1d00: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
1d10: 70 75 74 73 20 66 6f 72 20 74 68 69 73 20 73 75  puts for this su
1d20: 62 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  bquery */.};../*
1d30: 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74 20   The WhereOrSet 
1d40: 6f 62 6a 65 63 74 20 68 6f 6c 64 73 20 61 20 73  object holds a s
1d50: 65 74 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57  et of possible W
1d60: 68 65 72 65 4f 72 43 6f 73 74 73 20 74 68 61 74  hereOrCosts that
1d70: 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  .** correspond t
1d80: 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 28 73  o the subquery(s
1d90: 29 20 6f 66 20 4f 52 2d 63 6c 61 75 73 65 20 70  ) of OR-clause p
1da0: 72 6f 63 65 73 73 69 6e 67 2e 20 20 4f 6e 6c 79  rocessing.  Only
1db0: 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 4e 5f 4f   the.** best N_O
1dc0: 52 5f 43 4f 53 54 20 65 6c 65 6d 65 6e 74 73 20  R_COST elements 
1dd0: 61 72 65 20 72 65 74 61 69 6e 65 64 2e 0a 2a 2f  are retained..*/
1de0: 0a 23 64 65 66 69 6e 65 20 4e 5f 4f 52 5f 43 4f  .#define N_OR_CO
1df0: 53 54 20 33 0a 73 74 72 75 63 74 20 57 68 65 72  ST 3.struct Wher
1e00: 65 4f 72 53 65 74 20 7b 0a 20 20 75 31 36 20 6e  eOrSet {.  u16 n
1e10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e30: 20 6f 66 20 76 61 6c 69 64 20 61 5b 5d 20 65 6e   of valid a[] en
1e40: 74 72 69 65 73 20 2a 2f 0a 20 20 57 68 65 72 65  tries */.  Where
1e50: 4f 72 43 6f 73 74 20 61 5b 4e 5f 4f 52 5f 43 4f  OrCost a[N_OR_CO
1e60: 53 54 5d 3b 20 20 20 2f 2a 20 53 65 74 20 6f 66  ST];   /* Set of
1e70: 20 62 65 73 74 20 63 6f 73 74 73 20 2a 2f 0a 7d   best costs */.}
1e80: 3b 0a 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  ;.../* Forward d
1e90: 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20 6d 65  eclaration of me
1ea0: 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20  thods */.static 
1eb0: 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  int whereLoopRes
1ec0: 69 7a 65 28 73 71 6c 69 74 65 33 2a 2c 20 57 68  ize(sqlite3*, Wh
1ed0: 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e 74 29 3b 0a  ereLoop*, int);.
1ee0: 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74  ./*.** Each inst
1ef0: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
1f00: 65 63 74 20 68 6f 6c 64 73 20 61 20 73 65 71 75  ect holds a sequ
1f10: 65 6e 63 65 20 6f 66 20 57 68 65 72 65 4c 6f 6f  ence of WhereLoo
1f20: 70 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 74 68 61  p objects.** tha
1f30: 74 20 69 6d 70 6c 65 6d 65 6e 74 20 73 6f 6d 65  t implement some
1f40: 20 6f 72 20 61 6c 6c 20 6f 66 20 61 20 71 75 65   or all of a que
1f50: 72 79 20 70 6c 61 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ry plan..**.** T
1f60: 68 69 6e 6b 20 6f 66 20 65 61 63 68 20 57 68 65  hink of each Whe
1f70: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 61 73  reLoop object as
1f80: 20 61 20 6e 6f 64 65 20 69 6e 20 61 20 67 72 61   a node in a gra
1f90: 70 68 20 77 69 74 68 20 61 72 63 73 0a 2a 2a 20  ph with arcs.** 
1fa0: 73 68 6f 77 69 6e 67 20 64 65 70 65 6e 64 65 6e  showing dependen
1fb0: 63 65 73 20 61 6e 64 20 63 6f 73 74 73 20 66 6f  ces and costs fo
1fc0: 72 20 74 72 61 76 65 6c 6c 69 6e 67 20 62 65 74  r travelling bet
1fd0: 77 65 65 6e 20 6e 6f 64 65 73 2e 20 20 28 54 68  ween nodes.  (Th
1fe0: 61 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 61 20 63  at is.** not a c
1ff0: 6f 6d 70 6c 65 74 65 6c 79 20 61 63 63 75 72 61  ompletely accura
2000: 74 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 62  te description b
2010: 65 63 61 75 73 65 20 57 68 65 72 65 4c 6f 6f 70  ecause WhereLoop
2020: 20 63 6f 73 74 73 20 61 72 65 20 61 0a 2a 2a 20   costs are a.** 
2030: 76 65 63 74 6f 72 2c 20 6e 6f 74 20 61 20 73 63  vector, not a sc
2040: 61 6c 61 72 2c 20 61 6e 64 20 62 65 63 61 75 73  alar, and becaus
2050: 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20 61 72  e dependences ar
2060: 65 20 6d 61 6e 79 2d 74 6f 2d 6f 6e 65 2c 20 6e  e many-to-one, n
2070: 6f 74 0a 2a 2a 20 6f 6e 65 2d 74 6f 2d 6f 6e 65  ot.** one-to-one
2080: 20 61 73 20 61 72 65 20 67 72 61 70 68 20 6e 6f   as are graph no
2090: 64 65 73 2e 20 20 42 75 74 20 69 74 20 69 73 20  des.  But it is 
20a0: 61 20 75 73 65 66 75 6c 20 76 69 73 75 61 6c 69  a useful visuali
20b0: 7a 61 74 69 6f 6e 20 61 69 64 2e 29 0a 2a 2a 20  zation aid.).** 
20c0: 54 68 65 6e 20 61 20 57 68 65 72 65 50 61 74 68  Then a WherePath
20d0: 20 6f 62 6a 65 63 74 20 69 73 20 61 20 70 61 74   object is a pat
20e0: 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 67 72  h through the gr
20f0: 61 70 68 20 74 68 61 74 20 76 69 73 69 74 73 20  aph that visits 
2100: 73 6f 6d 65 0a 2a 2a 20 6f 72 20 61 6c 6c 20 6f  some.** or all o
2110: 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
2120: 6f 62 6a 65 63 74 73 20 6f 6e 63 65 2e 0a 2a 2a  objects once..**
2130: 0a 2a 2a 20 54 68 65 20 22 73 6f 6c 76 65 72 22  .** The "solver"
2140: 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69   works by creati
2150: 6e 67 20 74 68 65 20 4e 20 62 65 73 74 20 57 68  ng the N best Wh
2160: 65 72 65 50 61 74 68 20 6f 62 6a 65 63 74 73 20  erePath objects 
2170: 6f 66 20 6c 65 6e 67 74 68 0a 2a 2a 20 31 2e 20  of length.** 1. 
2180: 20 54 68 65 6e 20 75 73 69 6e 67 20 74 68 6f 73   Then using thos
2190: 65 20 61 73 20 61 20 62 61 73 69 73 20 74 6f 20  e as a basis to 
21a0: 63 6f 6d 70 75 74 65 20 74 68 65 20 4e 20 62 65  compute the N be
21b0: 73 74 20 57 68 65 72 65 50 61 74 68 20 6f 62 6a  st WherePath obj
21c0: 65 63 74 73 0a 2a 2a 20 6f 66 20 6c 65 6e 67 74  ects.** of lengt
21d0: 68 20 32 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  h 2.  And so for
21e0: 74 68 20 75 6e 74 69 6c 20 74 68 65 20 6c 65 6e  th until the len
21f0: 67 74 68 20 6f 66 20 57 68 65 72 65 50 61 74 68  gth of WherePath
2200: 73 20 65 71 75 61 6c 73 20 74 68 65 0a 2a 2a 20  s equals the.** 
2210: 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 64 65 73 20  number of nodes 
2220: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2230: 73 65 2e 20 20 54 68 65 20 62 65 73 74 20 28 6c  se.  The best (l
2240: 6f 77 65 73 74 20 63 6f 73 74 29 20 57 68 65 72  owest cost) Wher
2250: 65 50 61 74 68 0a 2a 2a 20 61 74 20 74 68 65 20  ePath.** at the 
2260: 65 6e 64 20 69 73 20 74 68 65 20 63 68 6f 6f 73  end is the choos
2270: 65 6e 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a  en query plan..*
2280: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 50 61  /.struct WherePa
2290: 74 68 20 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  th {.  Bitmask m
22a0: 61 73 6b 4c 6f 6f 70 3b 20 20 20 20 20 2f 2a 20  askLoop;     /* 
22b0: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 57  Bitmask of all W
22c0: 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
22d0: 20 69 6e 20 74 68 69 73 20 70 61 74 68 20 2a 2f   in this path */
22e0: 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4c 6f  .  Bitmask revLo
22f0: 6f 70 3b 20 20 20 20 20 20 2f 2a 20 61 4c 6f 6f  op;      /* aLoo
2300: 70 5b 5d 73 20 74 68 61 74 20 73 68 6f 75 6c 64  p[]s that should
2310: 20 62 65 20 72 65 76 65 72 73 65 64 20 66 6f 72   be reversed for
2320: 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 57   ORDER BY */.  W
2330: 68 65 72 65 43 6f 73 74 20 6e 52 6f 77 3b 20 20  hereCost nRow;  
2340: 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65       /* Estimate
2350: 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  d number of rows
2360: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
2370: 69 73 20 70 61 74 68 20 2a 2f 0a 20 20 57 68 65  is path */.  Whe
2380: 72 65 43 6f 73 74 20 72 43 6f 73 74 3b 20 20 20  reCost rCost;   
2390: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63 6f 73 74     /* Total cost
23a0: 20 6f 66 20 74 68 69 73 20 70 61 74 68 20 2a 2f   of this path */
23b0: 0a 20 20 75 38 20 69 73 4f 72 64 65 72 65 64 3b  .  u8 isOrdered;
23c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
23d0: 20 69 66 20 74 68 69 73 20 70 61 74 68 20 73 61   if this path sa
23e0: 74 69 73 66 69 65 73 20 4f 52 44 45 52 20 42 59  tisfies ORDER BY
23f0: 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72   */.  u8 isOrder
2400: 65 64 56 61 6c 69 64 3b 20 20 20 20 2f 2a 20 54  edValid;    /* T
2410: 72 75 65 20 69 66 20 74 68 65 20 69 73 4f 72 64  rue if the isOrd
2420: 65 72 65 64 20 66 69 65 6c 64 20 69 73 20 76 61  ered field is va
2430: 6c 69 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  lid */.  WhereLo
2440: 6f 70 20 2a 2a 61 4c 6f 6f 70 3b 20 20 20 20 2f  op **aLoop;    /
2450: 2a 20 41 72 72 61 79 20 6f 66 20 57 68 65 72 65  * Array of Where
2460: 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69 6d 70  Loop objects imp
2470: 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 70  lementing this p
2480: 61 74 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ath */.};../*.**
2490: 20 54 68 65 20 71 75 65 72 79 20 67 65 6e 65 72   The query gener
24a0: 61 74 6f 72 20 75 73 65 73 20 61 6e 20 61 72 72  ator uses an arr
24b0: 61 79 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20  ay of instances 
24c0: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
24d0: 65 20 74 6f 0a 2a 2a 20 68 65 6c 70 20 69 74 20  e to.** help it 
24e0: 61 6e 61 6c 79 7a 65 20 74 68 65 20 73 75 62 65  analyze the sube
24f0: 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
2500: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
2510: 20 45 61 63 68 20 57 48 45 52 45 0a 2a 2a 20 63   Each WHERE.** c
2520: 6c 61 75 73 65 20 73 75 62 65 78 70 72 65 73 73  lause subexpress
2530: 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64  ion is separated
2540: 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73   from the others
2550: 20 62 79 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   by AND operator
2560: 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c 79 2c 20 6f  s,.** usually, o
2570: 72 20 73 6f 6d 65 74 69 6d 65 73 20 73 75 62 65  r sometimes sube
2580: 78 70 72 65 73 73 69 6f 6e 73 20 73 65 70 61 72  xpressions separ
2590: 61 74 65 64 20 62 79 20 4f 52 2e 0a 2a 2a 0a 2a  ated by OR..**.*
25a0: 2a 20 41 6c 6c 20 57 68 65 72 65 54 65 72 6d 73  * All WhereTerms
25b0: 20 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 20 69   are collected i
25c0: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65  nto a single Whe
25d0: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
25e0: 72 65 2e 20 20 0a 2a 2a 20 54 68 65 20 66 6f 6c  re.  .** The fol
25f0: 6c 6f 77 69 6e 67 20 69 64 65 6e 74 69 74 79 20  lowing identity 
2600: 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  holds:.**.**    
2610: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 70 57      WhereTerm.pW
2620: 43 2d 3e 61 5b 57 68 65 72 65 54 65 72 6d 2e 69  C->a[WhereTerm.i
2630: 64 78 5d 20 3d 3d 20 57 68 65 72 65 54 65 72 6d  dx] == WhereTerm
2640: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 74 65  .**.** When a te
2650: 72 6d 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  rm is of the for
2660: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  m:.**.**        
2670: 20 20 20 20 20 20 58 20 3c 6f 70 3e 20 3c 65 78        X <op> <ex
2680: 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  pr>.**.** where 
2690: 58 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61  X is a column na
26a0: 6d 65 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  me and <op> is o
26b0: 6e 65 20 6f 66 20 63 65 72 74 61 69 6e 20 6f 70  ne of certain op
26c0: 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 74 68 65 6e  erators,.** then
26d0: 20 57 68 65 72 65 54 65 72 6d 2e 6c 65 66 74 43   WhereTerm.leftC
26e0: 75 72 73 6f 72 20 61 6e 64 20 57 68 65 72 65 54  ursor and WhereT
26f0: 65 72 6d 2e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  erm.u.leftColumn
2700: 20 72 65 63 6f 72 64 20 74 68 65 0a 2a 2a 20 63   record the.** c
2710: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 61 6e 64  ursor number and
2720: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 66   column number f
2730: 6f 72 20 58 2e 20 20 57 68 65 72 65 54 65 72 6d  or X.  WhereTerm
2740: 2e 65 4f 70 65 72 61 74 6f 72 20 72 65 63 6f 72  .eOperator recor
2750: 64 73 0a 2a 2a 20 74 68 65 20 3c 6f 70 3e 20 75  ds.** the <op> u
2760: 73 69 6e 67 20 61 20 62 69 74 6d 61 73 6b 20 65  sing a bitmask e
2770: 6e 63 6f 64 69 6e 67 20 64 65 66 69 6e 65 64 20  ncoding defined 
2780: 62 79 20 57 4f 5f 78 78 78 20 62 65 6c 6f 77 2e  by WO_xxx below.
2790: 20 20 54 68 65 0a 2a 2a 20 75 73 65 20 6f 66 20    The.** use of 
27a0: 61 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69  a bitmask encodi
27b0: 6e 67 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61  ng for the opera
27c0: 74 6f 72 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f  tor allows us to
27d0: 20 73 65 61 72 63 68 0a 2a 2a 20 71 75 69 63 6b   search.** quick
27e0: 6c 79 20 66 6f 72 20 74 65 72 6d 73 20 74 68 61  ly for terms tha
27f0: 74 20 6d 61 74 63 68 20 61 6e 79 20 6f 66 20 73  t match any of s
2800: 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74  everal different
2810: 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a   operators..**.*
2820: 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20 6d 69  * A WhereTerm mi
2830: 67 68 74 20 61 6c 73 6f 20 62 65 20 74 77 6f 20  ght also be two 
2840: 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73  or more subterms
2850: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52   connected by OR
2860: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
2870: 28 74 31 2e 58 20 3c 6f 70 3e 20 3c 65 78 70 72  (t1.X <op> <expr
2880: 3e 29 20 4f 52 20 28 74 31 2e 59 20 3c 6f 70 3e  >) OR (t1.Y <op>
2890: 20 3c 65 78 70 72 3e 29 20 4f 52 20 2e 2e 2e 2e   <expr>) OR ....
28a0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 73  .**.** In this s
28b0: 65 63 6f 6e 64 20 63 61 73 65 2c 20 77 74 46 6c  econd case, wtFl
28c0: 61 67 20 68 61 73 20 74 68 65 20 54 45 52 4d 5f  ag has the TERM_
28d0: 4f 52 49 4e 46 4f 20 62 69 74 20 73 65 74 20 61  ORINFO bit set a
28e0: 6e 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  nd eOperator==WO
28f0: 5f 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65 20 57  _OR.** and the W
2900: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
2910: 66 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20  fo field points 
2920: 74 6f 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66  to auxiliary inf
2930: 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  ormation that.**
2940: 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 61 62   is collected ab
2950: 6f 75 74 20 74 68 65 20 4f 52 20 63 6c 61 75 73  out the OR claus
2960: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 65  e..**.** If a te
2970: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
2980: 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20  clause does not 
2990: 6d 61 74 63 68 20 65 69 74 68 65 72 20 6f 66 20  match either of 
29a0: 74 68 65 20 74 77 6f 20 70 72 65 76 69 6f 75 73  the two previous
29b0: 0a 2a 2a 20 63 61 74 65 67 6f 72 69 65 73 2c 20  .** categories, 
29c0: 74 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 3d 3d  then eOperator==
29d0: 30 2e 20 20 54 68 65 20 57 68 65 72 65 54 65 72  0.  The WhereTer
29e0: 6d 2e 70 45 78 70 72 20 66 69 65 6c 64 20 69 73  m.pExpr field is
29f0: 20 73 74 69 6c 6c 20 73 65 74 0a 2a 2a 20 74 6f   still set.** to
2a00: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 75   the original su
2a10: 62 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74  bexpression cont
2a20: 65 6e 74 20 61 6e 64 20 77 74 46 6c 61 67 73 20  ent and wtFlags 
2a30: 69 73 20 73 65 74 20 75 70 20 61 70 70 72 6f 70  is set up approp
2a40: 72 69 61 74 65 6c 79 0a 2a 2a 20 62 75 74 20 6e  riately.** but n
2a50: 6f 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 69  o other fields i
2a60: 6e 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 20  n the WhereTerm 
2a70: 6f 62 6a 65 63 74 20 61 72 65 20 6d 65 61 6e 69  object are meani
2a80: 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ngful..**.** Whe
2a90: 6e 20 65 4f 70 65 72 61 74 6f 72 21 3d 30 2c 20  n eOperator!=0, 
2aa0: 70 72 65 72 65 71 52 69 67 68 74 20 61 6e 64 20  prereqRight and 
2ab0: 70 72 65 72 65 71 41 6c 6c 20 72 65 63 6f 72 64  prereqAll record
2ac0: 20 73 65 74 73 20 6f 66 20 63 75 72 73 6f 72 20   sets of cursor 
2ad0: 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20 62 75 74 20  numbers,.** but 
2ae0: 74 68 65 79 20 64 6f 20 73 6f 20 69 6e 64 69 72  they do so indir
2af0: 65 63 74 6c 79 2e 20 20 41 20 73 69 6e 67 6c 65  ectly.  A single
2b00: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74   WhereMaskSet st
2b10: 72 75 63 74 75 72 65 20 74 72 61 6e 73 6c 61 74  ructure translat
2b20: 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d  es.** cursor num
2b30: 62 65 72 20 69 6e 74 6f 20 62 69 74 73 20 61 6e  ber into bits an
2b40: 64 20 74 68 65 20 74 72 61 6e 73 6c 61 74 65 64  d the translated
2b50: 20 62 69 74 20 69 73 20 73 74 6f 72 65 64 20 69   bit is stored i
2b60: 6e 20 74 68 65 20 70 72 65 72 65 71 0a 2a 2a 20  n the prereq.** 
2b70: 66 69 65 6c 64 73 2e 20 20 54 68 65 20 74 72 61  fields.  The tra
2b80: 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75 73 65 64  nslation is used
2b90: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 78   in order to max
2ba0: 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d 62 65 72  imize the number
2bb0: 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74 68 61 74   of.** bits that
2bc0: 20 77 69 6c 6c 20 66 69 74 20 69 6e 20 61 20 42   will fit in a B
2bd0: 69 74 6d 61 73 6b 2e 20 20 54 68 65 20 56 44 42  itmask.  The VDB
2be0: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
2bf0: 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 73 70 72   might be.** spr
2c00: 65 61 64 20 6f 75 74 20 6f 76 65 72 20 74 68 65  ead out over the
2c10: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
2c20: 74 65 67 65 72 73 2e 20 20 46 6f 72 20 65 78 61  tegers.  For exa
2c30: 6d 70 6c 65 2c 20 74 68 65 20 63 75 72 73 6f 72  mple, the cursor
2c40: 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d 69 67 68  .** numbers migh
2c50: 74 20 62 65 20 33 2c 20 38 2c 20 39 2c 20 31 30  t be 3, 8, 9, 10
2c60: 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c 20 61 6e  , 20, 23, 41, an
2c70: 64 20 34 35 2e 20 20 54 68 65 20 57 68 65 72 65  d 45.  The Where
2c80: 4d 61 73 6b 53 65 74 0a 2a 2a 20 74 72 61 6e 73  MaskSet.** trans
2c90: 6c 61 74 65 73 20 74 68 65 73 65 20 73 70 61 72  lates these spar
2ca0: 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  se cursor number
2cb0: 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69  s into consecuti
2cc0: 76 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 62  ve integers.** b
2cd0: 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30 20  eginning with 0 
2ce0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65  in order to make
2cf0: 20 74 68 65 20 62 65 73 74 20 70 6f 73 73 69 62   the best possib
2d00: 6c 65 20 75 73 65 20 6f 66 20 74 68 65 20 61 76  le use of the av
2d10: 61 69 6c 61 62 6c 65 0a 2a 2a 20 62 69 74 73 20  ailable.** bits 
2d20: 69 6e 20 74 68 65 20 42 69 74 6d 61 73 6b 2e 20  in the Bitmask. 
2d30: 20 53 6f 2c 20 69 6e 20 74 68 65 20 65 78 61 6d   So, in the exam
2d40: 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 63  ple above, the c
2d50: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 0a 2a 2a  ursor numbers.**
2d60: 20 77 6f 75 6c 64 20 62 65 20 6d 61 70 70 65 64   would be mapped
2d70: 20 69 6e 74 6f 20 69 6e 74 65 67 65 72 73 20 30   into integers 0
2d80: 20 74 68 72 6f 75 67 68 20 37 2e 0a 2a 2a 0a 2a   through 7..**.*
2d90: 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
2da0: 74 65 72 6d 73 20 69 6e 20 61 20 6a 6f 69 6e 20  terms in a join 
2db0: 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68  is limited by th
2dc0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  e number of bits
2dd0: 0a 2a 2a 20 69 6e 20 70 72 65 72 65 71 52 69 67  .** in prereqRig
2de0: 68 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c  ht and prereqAll
2df0: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
2e00: 73 20 36 34 20 62 69 74 73 2c 20 68 65 6e 63 65  s 64 bits, hence
2e10: 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73 20 6f 6e   SQLite.** is on
2e20: 6c 79 20 61 62 6c 65 20 74 6f 20 70 72 6f 63 65  ly able to proce
2e30: 73 73 20 6a 6f 69 6e 73 20 77 69 74 68 20 36 34  ss joins with 64
2e40: 20 6f 72 20 66 65 77 65 72 20 74 61 62 6c 65 73   or fewer tables
2e50: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72  ..*/.struct Wher
2e60: 65 54 65 72 6d 20 7b 0a 20 20 45 78 70 72 20 2a  eTerm {.  Expr *
2e70: 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  pExpr;          
2e80: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2e90: 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
2ea0: 6e 20 74 68 61 74 20 69 73 20 74 68 69 73 20 74  n that is this t
2eb0: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  erm */.  int iPa
2ec0: 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
2ed0: 20 2f 2a 20 44 69 73 61 62 6c 65 20 70 57 43 2d   /* Disable pWC-
2ee0: 3e 61 5b 69 50 61 72 65 6e 74 5d 20 77 68 65 6e  >a[iParent] when
2ef0: 20 74 68 69 73 20 74 65 72 6d 20 64 69 73 61 62   this term disab
2f00: 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 66  led */.  int lef
2f10: 74 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20  tCursor;        
2f20: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
2f30: 72 20 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f 70  r of X in "X <op
2f40: 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20 75  > <expr>" */.  u
2f50: 6e 69 6f 6e 20 7b 0a 20 20 20 20 69 6e 74 20 6c  nion {.    int l
2f60: 65 66 74 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  eftColumn;      
2f70: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
2f80: 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20 3c  ber of X in "X <
2f90: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20  op> <expr>" */. 
2fa0: 20 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a     WhereOrInfo *
2fb0: 70 4f 72 49 6e 66 6f 3b 20 20 20 2f 2a 20 45 78  pOrInfo;   /* Ex
2fc0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
2fd0: 69 66 20 28 65 4f 70 65 72 61 74 6f 72 20 26 20  if (eOperator & 
2fe0: 57 4f 5f 4f 52 29 21 3d 30 20 2a 2f 0a 20 20 20  WO_OR)!=0 */.   
2ff0: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70   WhereAndInfo *p
3000: 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78 74 72  AndInfo; /* Extr
3010: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66  a information if
3020: 20 28 65 4f 70 65 72 61 74 6f 72 26 20 57 4f 5f   (eOperator& WO_
3030: 41 4e 44 29 21 3d 30 20 2a 2f 0a 20 20 7d 20 75  AND)!=0 */.  } u
3040: 3b 0a 20 20 75 31 36 20 65 4f 70 65 72 61 74 6f  ;.  u16 eOperato
3050: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  r;          /* A
3060: 20 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73   WO_xx value des
3070: 63 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a  cribing <op> */.
3080: 20 20 75 38 20 77 74 46 6c 61 67 73 3b 20 20 20    u8 wtFlags;   
3090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 45 52            /* TER
30a0: 4d 5f 78 78 78 20 62 69 74 20 66 6c 61 67 73 2e  M_xxx bit flags.
30b0: 20 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20    See below */. 
30c0: 20 75 38 20 6e 43 68 69 6c 64 3b 20 20 20 20 20   u8 nChild;     
30d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
30e0: 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 74  er of children t
30f0: 68 61 74 20 6d 75 73 74 20 64 69 73 61 62 6c 65  hat must disable
3100: 20 75 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c   us */.  WhereCl
3110: 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
3120: 20 2f 2a 20 54 68 65 20 63 6c 61 75 73 65 20 74   /* The clause t
3130: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
3140: 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b   of */.  Bitmask
3150: 20 70 72 65 72 65 71 52 69 67 68 74 3b 20 20 20   prereqRight;   
3160: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74   /* Bitmask of t
3170: 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 70 45  ables used by pE
3180: 78 70 72 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20  xpr->pRight */. 
3190: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41   Bitmask prereqA
31a0: 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d  ll;      /* Bitm
31b0: 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65  ask of tables re
31c0: 66 65 72 65 6e 63 65 64 20 62 79 20 70 45 78 70  ferenced by pExp
31d0: 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  r */.};../*.** A
31e0: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66  llowed values of
31f0: 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61   WhereTerm.wtFla
3200: 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45  gs.*/.#define TE
3210: 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20 30 78  RM_DYNAMIC    0x
3220: 30 31 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  01   /* Need to 
3230: 63 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  call sqlite3Expr
3240: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
3250: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  ) */.#define TER
3260: 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78 30  M_VIRTUAL    0x0
3270: 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62 79 20  2   /* Added by 
3280: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20  the optimizer.  
3290: 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23  Do not code */.#
32a0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45  define TERM_CODE
32b0: 44 20 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a  D      0x04   /*
32c0: 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 61 6c   This term is al
32d0: 72 65 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23  ready coded */.#
32e0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49  define TERM_COPI
32f0: 45 44 20 20 20 20 20 30 78 30 38 20 20 20 2f 2a  ED     0x08   /*
3300: 20 48 61 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a   Has a child */.
3310: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49  #define TERM_ORI
3320: 4e 46 4f 20 20 20 20 20 30 78 31 30 20 20 20 2f  NFO     0x10   /
3330: 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74  * Need to free t
3340: 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70  he WhereTerm.u.p
3350: 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f  OrInfo object */
3360: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e  .#define TERM_AN
3370: 44 49 4e 46 4f 20 20 20 20 30 78 32 30 20 20 20  DINFO    0x20   
3380: 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20  /* Need to free 
3390: 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  the WhereTerm.u.
33a0: 70 41 6e 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a  pAndInfo obj */.
33b0: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f  #define TERM_OR_
33c0: 4f 4b 20 20 20 20 20 20 30 78 34 30 20 20 20 2f  OK      0x40   /
33d0: 2a 20 55 73 65 64 20 64 75 72 69 6e 67 20 4f 52  * Used during OR
33e0: 2d 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69  -clause processi
33f0: 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ng */.#ifdef SQL
3400: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
3410: 0a 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f  .#  define TERM_
3420: 56 4e 55 4c 4c 20 20 20 20 30 78 38 30 20 20 20  VNULL    0x80   
3430: 2f 2a 20 4d 61 6e 75 66 61 63 74 75 72 65 64 20  /* Manufactured 
3440: 78 3e 4e 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55 4c  x>NULL or x<=NUL
3450: 4c 20 74 65 72 6d 20 2a 2f 0a 23 65 6c 73 65 0a  L term */.#else.
3460: 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  #  define TERM_V
3470: 4e 55 4c 4c 20 20 20 20 30 78 30 30 20 20 20 2f  NULL    0x00   /
3480: 2a 20 44 69 73 61 62 6c 65 64 20 69 66 20 6e 6f  * Disabled if no
3490: 74 20 75 73 69 6e 67 20 73 74 61 74 33 20 2a 2f  t using stat3 */
34a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
34b0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
34c0: 65 20 57 68 65 72 65 53 63 61 6e 20 6f 62 6a 65  e WhereScan obje
34d0: 63 74 20 69 73 20 75 73 65 64 20 61 73 20 61 6e  ct is used as an
34e0: 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f   iterator for lo
34f0: 63 61 74 69 6e 67 0a 2a 2a 20 74 65 72 6d 73 20  cating.** terms 
3500: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
3510: 75 73 65 20 74 68 61 74 20 61 72 65 20 75 73 65  use that are use
3520: 66 75 6c 20 74 6f 20 74 68 65 20 71 75 65 72 79  ful to the query
3530: 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 72   planner..*/.str
3540: 75 63 74 20 57 68 65 72 65 53 63 61 6e 20 7b 0a  uct WhereScan {.
3550: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
3560: 4f 72 69 67 57 43 3b 20 20 20 20 20 20 2f 2a 20  OrigWC;      /* 
3570: 4f 72 69 67 69 6e 61 6c 2c 20 69 6e 6e 65 72 6d  Original, innerm
3580: 6f 73 74 20 57 68 65 72 65 43 6c 61 75 73 65 20  ost WhereClause 
3590: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
35a0: 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
35b0: 2f 2a 20 57 68 65 72 65 43 6c 61 75 73 65 20 63  /* WhereClause c
35c0: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 73  urrently being s
35d0: 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 63 68 61 72  canned */.  char
35e0: 20 2a 7a 43 6f 6c 6c 4e 61 6d 65 3b 20 20 20 20   *zCollName;    
35f0: 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72         /* Requir
3600: 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ed collating seq
3610: 75 65 6e 63 65 2c 20 69 66 20 6e 6f 74 20 4e 55  uence, if not NU
3620: 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 69 64 78  LL */.  char idx
3630: 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  aff;            
3640: 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61 74 63 68     /* Must match
3650: 20 74 68 69 73 20 61 66 66 69 6e 69 74 79 2c 20   this affinity, 
3660: 69 66 20 7a 43 6f 6c 6c 4e 61 6d 65 21 3d 4e 55  if zCollName!=NU
3670: 4c 4c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  LL */.  unsigned
3680: 20 63 68 61 72 20 6e 45 71 75 69 76 3b 20 20 20   char nEquiv;   
3690: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
36a0: 65 6e 74 72 69 65 73 20 69 6e 20 61 45 71 75 69  entries in aEqui
36b0: 76 5b 5d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  v[] */.  unsigne
36c0: 64 20 63 68 61 72 20 69 45 71 75 69 76 3b 20 20  d char iEquiv;  
36d0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73      /* Next unus
36e0: 65 64 20 73 6c 6f 74 20 69 6e 20 61 45 71 75 69  ed slot in aEqui
36f0: 76 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d  v[] */.  u32 opM
3700: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
3710: 20 20 20 20 2f 2a 20 41 63 63 65 70 74 61 62 6c      /* Acceptabl
3720: 65 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  e operators */. 
3730: 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20   int k;         
3740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
3750: 65 73 75 6d 65 20 73 63 61 6e 6e 69 6e 67 20 61  esume scanning a
3760: 74 20 74 68 69 73 2d 3e 70 57 43 2d 3e 61 5b 74  t this->pWC->a[t
3770: 68 69 73 2d 3e 6b 5d 20 2a 2f 0a 20 20 69 6e 74  his->k] */.  int
3780: 20 61 45 71 75 69 76 5b 32 32 5d 3b 20 20 20 20   aEquiv[22];    
3790: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
37a0: 72 2c 43 6f 6c 75 6d 6e 20 70 61 69 72 73 20 66  r,Column pairs f
37b0: 6f 72 20 65 71 75 69 76 61 6c 65 6e 63 65 20 63  or equivalence c
37c0: 6c 61 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  lasses */.};../*
37d0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
37e0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
37f0: 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73   structure holds
3800: 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
3810: 20 61 62 6f 75 74 20 61 0a 2a 2a 20 57 48 45 52   about a.** WHER
3820: 45 20 63 6c 61 75 73 65 2e 20 20 4d 6f 73 74 6c  E clause.  Mostl
3830: 79 20 74 68 69 73 20 69 73 20 61 20 63 6f 6e 74  y this is a cont
3840: 61 69 6e 65 72 20 66 6f 72 20 6f 6e 65 20 6f 72  ainer for one or
3850: 20 6d 6f 72 65 20 57 68 65 72 65 54 65 72 6d 73   more WhereTerms
3860: 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 6c 61 6e 61 74  ..**.** Explanat
3870: 69 6f 6e 20 6f 66 20 70 4f 75 74 65 72 3a 20 20  ion of pOuter:  
3880: 46 6f 72 20 61 20 57 48 45 52 45 20 63 6c 61 75  For a WHERE clau
3890: 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  se of the form.*
38a0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  *.**           a
38b0: 20 41 4e 44 20 28 28 62 20 41 4e 44 20 63 29 20   AND ((b AND c) 
38c0: 4f 52 20 28 64 20 41 4e 44 20 65 29 29 20 41 4e  OR (d AND e)) AN
38d0: 44 20 66 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  D f.**.** There 
38e0: 61 72 65 20 73 65 70 61 72 61 74 65 20 57 68 65  are separate Whe
38f0: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 73  reClause objects
3900: 20 66 6f 72 20 74 68 65 20 77 68 6f 6c 65 20 63   for the whole c
3910: 6c 61 75 73 65 20 61 6e 64 20 66 6f 72 0a 2a 2a  lause and for.**
3920: 20 74 68 65 20 73 75 62 63 6c 61 75 73 65 73 20   the subclauses 
3930: 22 28 62 20 41 4e 44 20 63 29 22 20 61 6e 64 20  "(b AND c)" and 
3940: 22 28 64 20 41 4e 44 20 65 29 22 2e 20 20 54 68  "(d AND e)".  Th
3950: 65 20 70 4f 75 74 65 72 20 66 69 65 6c 64 20 6f  e pOuter field o
3960: 66 20 74 68 65 0a 2a 2a 20 73 75 62 63 6c 61 75  f the.** subclau
3970: 73 65 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ses points to th
3980: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
3990: 6a 65 63 74 20 66 6f 72 20 74 68 65 20 77 68 6f  ject for the who
39a0: 6c 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  le clause..*/.st
39b0: 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65  ruct WhereClause
39c0: 20 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a   {.  WhereInfo *
39d0: 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 2f 2a  pWInfo;       /*
39e0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
39f0: 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74  ocessing context
3a00: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
3a10: 65 20 2a 70 4f 75 74 65 72 3b 20 20 20 20 20 2f  e *pOuter;     /
3a20: 2a 20 4f 75 74 65 72 20 63 6f 6e 6a 75 6e 63 74  * Outer conjunct
3a30: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6f 70 3b 20  ion */.  u8 op; 
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 2f 2a 20 53 70 6c 69 74 20 6f 70 65 72 61    /* Split opera
3a60: 74 6f 72 2e 20 20 54 4b 5f 41 4e 44 20 6f 72 20  tor.  TK_AND or 
3a70: 54 4b 5f 4f 52 20 2a 2f 0a 20 20 69 6e 74 20 6e  TK_OR */.  int n
3a80: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
3a90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3aa0: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20   terms */.  int 
3ab0: 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20  nSlot;          
3ac0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3ad0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 5b 5d  f entries in a[]
3ae0: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
3af0: 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *a;            /
3b00: 2a 20 45 61 63 68 20 61 5b 5d 20 64 65 73 63 72  * Each a[] descr
3b10: 69 62 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ibes a term of t
3b20: 68 65 20 57 48 45 52 45 20 63 6c 75 61 73 65 20  he WHERE cluase 
3b30: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
3b40: 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f 53 54 41 43  QLITE_SMALL_STAC
3b50: 4b 29 0a 20 20 57 68 65 72 65 54 65 72 6d 20 61  K).  WhereTerm a
3b60: 53 74 61 74 69 63 5b 31 5d 3b 20 20 20 20 2f 2a  Static[1];    /*
3b70: 20 49 6e 69 74 69 61 6c 20 73 74 61 74 69 63 20   Initial static 
3b80: 73 70 61 63 65 20 66 6f 72 20 61 5b 5d 20 2a 2f  space for a[] */
3b90: 0a 23 65 6c 73 65 0a 20 20 57 68 65 72 65 54 65  .#else.  WhereTe
3ba0: 72 6d 20 61 53 74 61 74 69 63 5b 38 5d 3b 20 20  rm aStatic[8];  
3bb0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
3bc0: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
3bd0: 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  ] */.#endif.};..
3be0: 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72  /*.** A WhereTer
3bf0: 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74 6f 72  m with eOperator
3c00: 3d 3d 57 4f 5f 4f 52 20 68 61 73 20 69 74 73 20  ==WO_OR has its 
3c10: 75 2e 70 4f 72 49 6e 66 6f 20 70 6f 69 6e 74 65  u.pOrInfo pointe
3c20: 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61 20 64 79  r set to.** a dy
3c30: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
3c40: 74 65 64 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ted instance of 
3c50: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3c60: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
3c70: 63 74 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 7b  ct WhereOrInfo {
3c80: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 77  .  WhereClause w
3c90: 63 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  c;          /* D
3ca0: 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 69 6e 74  ecomposition int
3cb0: 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20  o subterms */.  
3cc0: 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c  Bitmask indexabl
3cd0: 65 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d  e;       /* Bitm
3ce0: 61 73 6b 20 6f 66 20 61 6c 6c 20 69 6e 64 65 78  ask of all index
3cf0: 61 62 6c 65 20 74 61 62 6c 65 73 20 69 6e 20 74  able tables in t
3d00: 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 7d 3b 0a  he clause */.};.
3d10: 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65  ./*.** A WhereTe
3d20: 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74 6f  rm with eOperato
3d30: 72 3d 3d 57 4f 5f 41 4e 44 20 68 61 73 20 69 74  r==WO_AND has it
3d40: 73 20 75 2e 70 41 6e 64 49 6e 66 6f 20 70 6f 69  s u.pAndInfo poi
3d50: 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61  nter set to.** a
3d60: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
3d70: 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65 20  ocated instance 
3d80: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3d90: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
3da0: 74 72 75 63 74 20 57 68 65 72 65 41 6e 64 49 6e  truct WhereAndIn
3db0: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
3dc0: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
3dd0: 2f 2a 20 54 68 65 20 73 75 62 65 78 70 72 65 73  /* The subexpres
3de0: 73 69 6f 6e 20 62 72 6f 6b 65 6e 20 6f 75 74 20  sion broken out 
3df0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
3e00: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
3e10: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
3e20: 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20  ure keeps track 
3e30: 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20  of a mapping.** 
3e40: 62 65 74 77 65 65 6e 20 56 44 42 45 20 63 75 72  between VDBE cur
3e50: 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e 64 20  sor numbers and 
3e60: 62 69 74 73 20 6f 66 20 74 68 65 20 62 69 74 6d  bits of the bitm
3e70: 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54 65 72  asks in WhereTer
3e80: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42  m..**.** The VDB
3e90: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
3ea0: 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65 67   are small integ
3eb0: 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ers contained in
3ec0: 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69 74 65   .** SrcList_ite
3ed0: 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20 45 78  m.iCursor and Ex
3ee0: 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73  pr.iTable fields
3ef0: 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76 65 6e  .  For any given
3f00: 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75 73   WHERE .** claus
3f10: 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  e, the cursor nu
3f20: 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f 74 20  mbers might not 
3f30: 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64  begin with 0 and
3f40: 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a 20 63   they might.** c
3f50: 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e 20 74  ontain gaps in t
3f60: 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73 65 71  he numbering seq
3f70: 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65 20 77  uence.  But we w
3f80: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61 78 69  ant to make maxi
3f90: 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20 74 68  mum.** use of th
3fa0: 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20 62 69  e bits in our bi
3fb0: 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20 73 74  tmasks.  This st
3fc0: 72 75 63 74 75 72 65 20 70 72 6f 76 69 64 65 73  ructure provides
3fd0: 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 66 72   a mapping.** fr
3fe0: 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20 63 75  om the sparse cu
3ff0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74  rsor numbers int
4000: 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e  o consecutive in
4010: 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  tegers beginning
4020: 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a 0a 2a  .** with 0..**.*
4030: 2a 20 49 66 20 57 68 65 72 65 4d 61 73 6b 53 65  * If WhereMaskSe
4040: 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d 65  t.ix[A]==B it me
4050: 61 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d 74  ans that The A-t
4060: 68 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d 61  h bit of a Bitma
4070: 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  sk.** correspond
4080: 73 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  s VDBE cursor nu
4090: 6d 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d 74  mber B.  The A-t
40a0: 68 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d 61  h bit of a bitma
40b0: 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a  sk is 1<<A..**.*
40c0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
40d0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
40e0: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75 73  se expression us
40f0: 65 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a 2a  ed these VDBE.**
4100: 20 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35 2c   cursors:  4, 5,
4110: 20 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e 20   8, 29, 57, 73. 
4120: 20 54 68 65 6e 20 74 68 65 20 20 57 68 65 72 65   Then the  Where
4130: 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
4140: 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20 74  e.** would map t
4150: 68 6f 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  hose cursor numb
4160: 65 72 73 20 69 6e 74 6f 20 62 69 74 73 20 30 20  ers into bits 0 
4170: 74 68 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a 2a  through 5..**.**
4180: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6d   Note that the m
4190: 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  apping is not ne
41a0: 63 65 73 73 61 72 69 6c 79 20 6f 72 64 65 72 65  cessarily ordere
41b0: 64 2e 20 20 49 6e 20 74 68 65 20 65 78 61 6d 70  d.  In the examp
41c0: 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 65  le.** above, the
41d0: 20 6d 61 70 70 69 6e 67 20 6d 69 67 68 74 20 67   mapping might g
41e0: 6f 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 34 2d  o like this:  4-
41f0: 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c 20  >3, 5->1, 8->2, 
4200: 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35 2c  29->0,.** 57->5,
4210: 20 37 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65 20   73->4.  Or one 
4220: 6f 66 20 37 31 39 20 6f 74 68 65 72 20 63 6f 6d  of 719 other com
4230: 62 69 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74 20  binations might 
4240: 62 65 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20 64  be used. It.** d
4250: 6f 65 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6d  oes not really m
4260: 61 74 74 65 72 2e 20 20 57 68 61 74 20 69 73 20  atter.  What is 
4270: 69 6d 70 6f 72 74 61 6e 74 20 69 73 20 74 68 61  important is tha
4280: 74 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 0a  t sparse cursor.
4290: 2a 2a 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20 67  ** numbers all g
42a0: 65 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 62  et mapped into b
42b0: 69 74 20 6e 75 6d 62 65 72 73 20 74 68 61 74 20  it numbers that 
42c0: 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64  begin with 0 and
42d0: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20 67   contain.** no g
42e0: 61 70 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57  aps..*/.struct W
42f0: 68 65 72 65 4d 61 73 6b 53 65 74 20 7b 0a 20 20  hereMaskSet {.  
4300: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4320: 20 4e 75 6d 62 65 72 20 6f 66 20 61 73 73 69 67   Number of assig
4330: 6e 65 64 20 63 75 72 73 6f 72 20 76 61 6c 75 65  ned cursor value
4340: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 78 5b 42 4d  s */.  int ix[BM
4350: 53 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  S];             
4360: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 61       /* Cursor a
4370: 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63 68 20  ssigned to each 
4380: 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  bit */.};../*.**
4390: 20 54 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   This object is 
43a0: 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72  a convenience wr
43b0: 61 70 70 65 72 20 68 6f 6c 64 69 6e 67 20 61 6c  apper holding al
43c0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65  l information ne
43d0: 65 64 65 64 0a 2a 2a 20 74 6f 20 63 6f 6e 73 74  eded.** to const
43e0: 72 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 20 6f  ruct WhereLoop o
43f0: 62 6a 65 63 74 73 20 66 6f 72 20 61 20 70 61 72  bjects for a par
4400: 74 69 63 75 6c 61 72 20 71 75 65 72 79 2e 0a 2a  ticular query..*
4410: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f  /.struct WhereLo
4420: 6f 70 42 75 69 6c 64 65 72 20 7b 0a 20 20 57 68  opBuilder {.  Wh
4430: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
4440: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72          /* Infor
4450: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69  mation about thi
4460: 73 20 57 48 45 52 45 20 2a 2f 0a 20 20 57 68 65  s WHERE */.  Whe
4470: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
4480: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
4490: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a  clause terms */.
44a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
44b0: 65 72 42 79 3b 20 20 20 20 20 20 20 2f 2a 20 4f  erBy;       /* O
44c0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
44d0: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
44e0: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  New;          /*
44f0: 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c   Template WhereL
4500: 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72  oop */.  WhereOr
4510: 53 65 74 20 2a 70 4f 72 53 65 74 3b 20 20 20 20  Set *pOrSet;    
4520: 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 62 65 73     /* Record bes
4530: 74 20 6c 6f 6f 70 73 20 68 65 72 65 2c 20 69 66  t loops here, if
4540: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 7d 3b 0a   not NULL */.};.
4550: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 57 48 45 52 45  ./*.** The WHERE
4560: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
4570: 6e 67 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ng routine has t
4580: 77 6f 20 68 61 6c 76 65 73 2e 20 20 54 68 65 0a  wo halves.  The.
4590: 2a 2a 20 66 69 72 73 74 20 70 61 72 74 20 64 6f  ** first part do
45a0: 65 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  es the start of 
45b0: 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 20 61  the WHERE loop a
45c0: 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  nd the second.**
45d0: 20 68 61 6c 66 20 64 6f 65 73 20 74 68 65 20 74   half does the t
45e0: 61 69 6c 20 6f 66 20 74 68 65 20 57 48 45 52 45  ail of the WHERE
45f0: 20 6c 6f 6f 70 2e 20 20 41 6e 20 69 6e 73 74 61   loop.  An insta
4600: 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 73  nce of.** this s
4610: 74 72 75 63 74 75 72 65 20 69 73 20 72 65 74 75  tructure is retu
4620: 72 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73  rned by the firs
4630: 74 20 68 61 6c 66 20 61 6e 64 20 70 61 73 73 65  t half and passe
4640: 64 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65  d.** into the se
4650: 63 6f 6e 64 20 68 61 6c 66 20 74 6f 20 67 69 76  cond half to giv
4660: 65 20 73 6f 6d 65 20 63 6f 6e 74 69 6e 75 69 74  e some continuit
4670: 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  y..**.** An inst
4680: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
4690: 65 63 74 20 68 6f 6c 64 73 20 74 68 65 20 63 6f  ect holds the co
46a0: 6d 70 6c 65 74 65 20 73 74 61 74 65 20 6f 66 20  mplete state of 
46b0: 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 70 6c 61  the query.** pla
46c0: 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  nner..*/.struct 
46d0: 57 68 65 72 65 49 6e 66 6f 20 7b 0a 20 20 50 61  WhereInfo {.  Pa
46e0: 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
46f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
4700: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
4710: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
4720: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
4730: 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 2f 2a  bList;        /*
4740: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
4750: 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  in the join */. 
4760: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
4770: 72 42 79 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  rBy;       /* Th
4780: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
4790: 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  e or NULL */.  E
47a0: 78 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74  xprList *pResult
47b0: 53 65 74 3b 20 20 20 20 20 2f 2a 20 52 65 73 75  Set;     /* Resu
47c0: 6c 74 20 73 65 74 2e 20 44 49 53 54 49 4e 43 54  lt set. DISTINCT
47d0: 20 6f 70 65 72 61 74 65 73 20 6f 6e 20 74 68 65   operates on the
47e0: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  se */.  WhereLoo
47f0: 70 20 2a 70 4c 6f 6f 70 73 3b 20 20 20 20 20 20  p *pLoops;      
4800: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
4810: 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
4820: 74 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ts */.  Bitmask 
4830: 72 65 76 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  revMask;        
4840: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44    /* Mask of ORD
4850: 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74  ER BY terms that
4860: 20 6e 65 65 64 20 72 65 76 65 72 73 69 6e 67 20   need reversing 
4870: 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6e  */.  WhereCost n
4880: 52 6f 77 4f 75 74 3b 20 20 20 20 20 20 20 20 2f  RowOut;        /
4890: 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  * Estimated numb
48a0: 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
48b0: 73 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  s */.  u16 wctrl
48c0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
48d0: 20 2f 2a 20 46 6c 61 67 73 20 6f 72 69 67 69 6e   /* Flags origin
48e0: 61 6c 6c 79 20 70 61 73 73 65 64 20 74 6f 20 73  ally passed to s
48f0: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
4900: 28 29 20 2a 2f 0a 20 20 75 38 20 62 4f 42 53 61  () */.  u8 bOBSa
4910: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4920: 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 73 61    /* ORDER BY sa
4930: 74 69 73 66 69 65 64 20 62 79 20 69 6e 64 69 63  tisfied by indic
4940: 65 73 20 2a 2f 0a 20 20 75 38 20 6f 6b 4f 6e 65  es */.  u8 okOne
4950: 50 61 73 73 3b 20 20 20 20 20 20 20 20 20 20 20  Pass;           
4960: 20 20 2f 2a 20 4f 6b 20 74 6f 20 75 73 65 20 6f    /* Ok to use o
4970: 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68  ne-pass algorith
4980: 6d 20 66 6f 72 20 55 50 44 41 54 45 2f 44 45 4c  m for UPDATE/DEL
4990: 45 54 45 20 2a 2f 0a 20 20 75 38 20 75 6e 74 65  ETE */.  u8 unte
49a0: 73 74 65 64 54 65 72 6d 73 3b 20 20 20 20 20 20  stedTerms;      
49b0: 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 20 57 48     /* Not all WH
49c0: 45 52 45 20 74 65 72 6d 73 20 72 65 73 6f 6c 76  ERE terms resolv
49d0: 65 64 20 62 79 20 6f 75 74 65 72 20 6c 6f 6f 70  ed by outer loop
49e0: 20 2a 2f 0a 20 20 75 38 20 65 44 69 73 74 69 6e   */.  u8 eDistin
49f0: 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ct;             
4a00: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
4a10: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 76  ERE_DISTINCT_* v
4a20: 61 6c 75 65 73 20 62 65 6c 6f 77 20 2a 2f 0a 20  alues below */. 
4a30: 20 75 38 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20   u8 nLevel;     
4a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4a50: 6d 62 65 72 20 6f 66 20 6e 65 73 74 65 64 20 6c  mber of nested l
4a60: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6f  oop */.  int iTo
4a70: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
4a80: 20 20 20 2f 2a 20 54 68 65 20 76 65 72 79 20 62     /* The very b
4a90: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
4aa0: 57 48 45 52 45 20 6c 6f 6f 70 20 2a 2f 0a 20 20  WHERE loop */.  
4ab0: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 20 20  int iContinue;  
4ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
4ad0: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
4ae0: 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 65 63  ue with next rec
4af0: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  ord */.  int iBr
4b00: 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  eak;            
4b10: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
4b20: 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
4b30: 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  the loop */.  in
4b40: 74 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  t savedNQueryLoo
4b50: 70 3b 20 20 20 20 20 20 2f 2a 20 70 50 61 72 73  p;      /* pPars
4b60: 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 6f 75  e->nQueryLoop ou
4b70: 74 73 69 64 65 20 74 68 65 20 57 48 45 52 45 20  tside the WHERE 
4b80: 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4d  loop */.  WhereM
4b90: 61 73 6b 53 65 74 20 73 4d 61 73 6b 53 65 74 3b  askSet sMaskSet;
4ba0: 20 20 20 20 2f 2a 20 4d 61 70 20 63 75 72 73 6f      /* Map curso
4bb0: 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69 74  r numbers to bit
4bc0: 6d 61 73 6b 73 20 2a 2f 0a 20 20 57 68 65 72 65  masks */.  Where
4bd0: 43 6c 61 75 73 65 20 73 57 43 3b 20 20 20 20 20  Clause sWC;     
4be0: 20 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73       /* Decompos
4bf0: 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 57 48 45  ition of the WHE
4c00: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
4c10: 68 65 72 65 4c 65 76 65 6c 20 61 5b 31 5d 3b 20  hereLevel a[1]; 
4c20: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
4c30: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 65 61  rmation about ea
4c40: 63 68 20 6e 65 73 74 20 6c 6f 6f 70 20 69 6e 20  ch nest loop in 
4c50: 57 48 45 52 45 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  WHERE */.};../*.
4c60: 2a 2a 20 42 69 74 6d 61 73 6b 73 20 66 6f 72 20  ** Bitmasks for 
4c70: 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 6f 6e  the operators on
4c80: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
4c90: 74 73 2e 20 20 54 68 65 73 65 20 61 72 65 20 61  ts.  These are a
4ca0: 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20  ll.** operators 
4cb0: 74 68 61 74 20 61 72 65 20 6f 66 20 69 6e 74 65  that are of inte
4cc0: 72 65 73 74 20 74 6f 20 74 68 65 20 71 75 65 72  rest to the quer
4cd0: 79 20 70 6c 61 6e 6e 65 72 2e 20 20 41 6e 0a 2a  y planner.  An.*
4ce0: 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74  * OR-ed combinat
4cf0: 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61 6c  ion of these val
4d00: 75 65 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  ues can be used 
4d10: 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20 66  when searching f
4d20: 6f 72 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72  or.** particular
4d30: 20 57 68 65 72 65 54 65 72 6d 73 20 77 69 74 68   WhereTerms with
4d40: 69 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73 65  in a WhereClause
4d50: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  ..*/.#define WO_
4d60: 49 4e 20 20 20 20 20 30 78 30 30 31 0a 23 64 65  IN     0x001.#de
4d70: 66 69 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 30  fine WO_EQ     0
4d80: 78 30 30 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f  x002.#define WO_
4d90: 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  LT     (WO_EQ<<(
4da0: 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_LT-TK_EQ)).#d
4db0: 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20  efine WO_LE     
4dc0: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54  (WO_EQ<<(TK_LE-T
4dd0: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
4de0: 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_GT     (WO_EQ<
4df0: 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a  <(TK_GT-TK_EQ)).
4e00: 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20  #define WO_GE   
4e10: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45    (WO_EQ<<(TK_GE
4e20: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
4e30: 20 57 4f 5f 4d 41 54 43 48 20 20 30 78 30 34 30   WO_MATCH  0x040
4e40: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55  .#define WO_ISNU
4e50: 4c 4c 20 30 78 30 38 30 0a 23 64 65 66 69 6e 65  LL 0x080.#define
4e60: 20 57 4f 5f 4f 52 20 20 20 20 20 30 78 31 30 30   WO_OR     0x100
4e70: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
4e80: 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74   more OR-connect
4e90: 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66  ed terms */.#def
4ea0: 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20 30 78  ine WO_AND    0x
4eb0: 32 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  200       /* Two
4ec0: 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e   or more AND-con
4ed0: 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a  nected terms */.
4ee0: 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 55 49 56  #define WO_EQUIV
4ef0: 20 20 30 78 34 30 30 20 20 20 20 20 20 20 2f 2a    0x400       /*
4f00: 20 4f 66 20 74 68 65 20 66 6f 72 6d 20 41 3d 3d   Of the form A==
4f10: 42 2c 20 62 6f 74 68 20 63 6f 6c 75 6d 6e 73 20  B, both columns 
4f20: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f  */.#define WO_NO
4f30: 4f 50 20 20 20 30 78 38 30 30 20 20 20 20 20 20  OP   0x800      
4f40: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 64 6f   /* This term do
4f50: 65 73 20 6e 6f 74 20 72 65 73 74 72 69 63 74 20  es not restrict 
4f60: 73 65 61 72 63 68 20 73 70 61 63 65 20 2a 2f 0a  search space */.
4f70: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20  .#define WO_ALL 
4f80: 20 20 20 30 78 66 66 66 20 20 20 20 20 20 20 2f     0xfff       /
4f90: 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f  * Mask of all po
4fa0: 73 73 69 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75  ssible WO_* valu
4fb0: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  es */.#define WO
4fc0: 5f 53 49 4e 47 4c 45 20 30 78 30 66 66 20 20 20  _SINGLE 0x0ff   
4fd0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
4fe0: 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20  ll non-compound 
4ff0: 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a  WO_* values */..
5000: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  /*.** These are 
5010: 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 62  definitions of b
5020: 69 74 73 20 69 6e 20 74 68 65 20 57 68 65 72 65  its in the Where
5030: 4c 6f 6f 70 2e 77 73 46 6c 61 67 73 20 66 69 65  Loop.wsFlags fie
5040: 6c 64 2e 0a 2a 2a 20 54 68 65 20 70 61 72 74 69  ld..** The parti
5050: 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f  cular combinatio
5060: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 65 61 63  n of bits in eac
5070: 68 20 57 68 65 72 65 4c 6f 6f 70 20 68 65 6c 70  h WhereLoop help
5080: 20 74 6f 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65   to.** determine
5090: 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 74   the algorithm t
50a0: 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 72 65  hat WhereLoop re
50b0: 70 72 65 73 65 6e 74 73 2e 0a 2a 2f 0a 23 64 65  presents..*/.#de
50c0: 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d  fine WHERE_COLUM
50d0: 4e 5f 45 51 20 20 20 20 30 78 30 30 30 30 30 30  N_EQ    0x000000
50e0: 30 31 20 20 2f 2a 20 78 3d 45 58 50 52 20 2a 2f  01  /* x=EXPR */
50f0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
5100: 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30 78 30 30  OLUMN_RANGE 0x00
5110: 30 30 30 30 30 32 20 20 2f 2a 20 78 3c 45 58 50  000002  /* x<EXP
5120: 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52 20  R and/or x>EXPR 
5130: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
5140: 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 30 78  _COLUMN_IN    0x
5150: 30 30 30 30 30 30 30 34 20 20 2f 2a 20 78 20 49  00000004  /* x I
5160: 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69  N (...) */.#defi
5170: 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  ne WHERE_COLUMN_
5180: 4e 55 4c 4c 20 20 30 78 30 30 30 30 30 30 30 38  NULL  0x00000008
5190: 20 20 2f 2a 20 78 20 49 53 20 4e 55 4c 4c 20 2a    /* x IS NULL *
51a0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
51b0: 43 4f 4e 53 54 52 41 49 4e 54 20 20 20 30 78 30  CONSTRAINT   0x0
51c0: 30 30 30 30 30 30 66 20 20 2f 2a 20 41 6e 79 20  000000f  /* Any 
51d0: 6f 66 20 74 68 65 20 57 48 45 52 45 5f 43 4f 4c  of the WHERE_COL
51e0: 55 4d 4e 5f 78 78 78 20 76 61 6c 75 65 73 20 2a  UMN_xxx values *
51f0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
5200: 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20 30 78 30  TOP_LIMIT    0x0
5210: 30 30 30 30 30 31 30 20 20 2f 2a 20 78 3c 45 58  0000010  /* x<EX
5220: 50 52 20 6f 72 20 78 3c 3d 45 58 50 52 20 63 6f  PR or x<=EXPR co
5230: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
5240: 69 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  ine WHERE_BTM_LI
5250: 4d 49 54 20 20 20 20 30 78 30 30 30 30 30 30 32  MIT    0x0000002
5260: 30 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20  0  /* x>EXPR or 
5270: 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69  x>=EXPR constrai
5280: 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  nt */.#define WH
5290: 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 20  ERE_BOTH_LIMIT  
52a0: 20 30 78 30 30 30 30 30 30 33 30 20 20 2f 2a 20   0x00000030  /* 
52b0: 42 6f 74 68 20 78 3e 45 58 50 52 20 61 6e 64 20  Both x>EXPR and 
52c0: 78 3c 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e  x<EXPR */.#defin
52d0: 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  e WHERE_IDX_ONLY
52e0: 20 20 20 20 20 30 78 30 30 30 30 30 30 34 30 20       0x00000040 
52f0: 20 2f 2a 20 55 73 65 20 69 6e 64 65 78 20 6f 6e   /* Use index on
5300: 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20  ly - omit table 
5310: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
5320: 5f 49 50 4b 20 20 20 20 20 20 20 20 20 20 30 78  _IPK          0x
5330: 30 30 30 30 30 31 30 30 20 20 2f 2a 20 78 20 69  00000100  /* x i
5340: 73 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  s the INTEGER PR
5350: 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 23 64 65  IMARY KEY */.#de
5360: 66 69 6e 65 20 57 48 45 52 45 5f 49 4e 44 45 58  fine WHERE_INDEX
5370: 45 44 20 20 20 20 20 20 30 78 30 30 30 30 30 32  ED      0x000002
5380: 30 30 20 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70  00  /* WhereLoop
5390: 2e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  .u.btree.pIndex 
53a0: 69 73 20 76 61 6c 69 64 20 2a 2f 0a 23 64 65 66  is valid */.#def
53b0: 69 6e 65 20 57 48 45 52 45 5f 56 49 52 54 55 41  ine WHERE_VIRTUA
53c0: 4c 54 41 42 4c 45 20 30 78 30 30 30 30 30 34 30  LTABLE 0x0000040
53d0: 30 20 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e  0  /* WhereLoop.
53e0: 75 2e 76 74 61 62 20 69 73 20 76 61 6c 69 64 20  u.vtab is valid 
53f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
5400: 5f 49 4e 5f 41 42 4c 45 20 20 20 20 20 20 30 78  _IN_ABLE      0x
5410: 30 30 30 30 30 38 30 30 20 20 2f 2a 20 41 62 6c  00000800  /* Abl
5420: 65 20 74 6f 20 73 75 70 70 6f 72 74 20 61 6e 20  e to support an 
5430: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 23  IN operator */.#
5440: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4f 4e 45  define WHERE_ONE
5450: 52 4f 57 20 20 20 20 20 20 20 30 78 30 30 30 30  ROW       0x0000
5460: 31 30 30 30 20 20 2f 2a 20 53 65 6c 65 63 74 73  1000  /* Selects
5470: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
5480: 65 20 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65  e row */.#define
5490: 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20   WHERE_MULTI_OR 
54a0: 20 20 20 20 30 78 30 30 30 30 32 30 30 30 20 20      0x00002000  
54b0: 2f 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75 6c 74  /* OR using mult
54c0: 69 70 6c 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a  iple indices */.
54d0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 41 55  #define WHERE_AU
54e0: 54 4f 5f 49 4e 44 45 58 20 20 20 30 78 30 30 30  TO_INDEX   0x000
54f0: 30 34 30 30 30 20 20 2f 2a 20 55 73 65 73 20 61  04000  /* Uses a
5500: 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  n ephemeral inde
5510: 78 20 2a 2f 0a 0a 0a 2f 2a 20 43 6f 6e 76 65 72  x */.../* Conver
5520: 74 20 61 20 57 68 65 72 65 43 6f 73 74 20 76 61  t a WhereCost va
5530: 6c 75 65 20 28 31 30 20 74 69 6d 65 73 20 6c 6f  lue (10 times lo
5540: 67 32 28 58 29 29 20 69 6e 74 6f 20 69 74 73 20  g2(X)) into its 
5550: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 58 2e  integer value X.
5560: 0a 2a 2a 20 41 20 72 6f 75 67 68 20 61 70 70 72  .** A rough appr
5570: 6f 78 69 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  oximation is use
5580: 64 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72 65  d.  The value re
5590: 74 75 72 6e 65 64 20 69 73 20 6e 6f 74 20 65 78  turned is not ex
55a0: 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  act..*/.static u
55b0: 36 34 20 77 68 65 72 65 43 6f 73 74 54 6f 49 6e  64 whereCostToIn
55c0: 74 28 57 68 65 72 65 43 6f 73 74 20 78 29 7b 0a  t(WhereCost x){.
55d0: 20 20 75 36 34 20 6e 3b 0a 20 20 69 66 28 20 78    u64 n;.  if( x
55e0: 3c 31 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  <10 ) return 1;.
55f0: 20 20 6e 20 3d 20 78 25 31 30 3b 0a 20 20 78 20    n = x%10;.  x 
5600: 2f 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 3e 3d  /= 10;.  if( n>=
5610: 35 20 29 20 6e 20 2d 3d 20 32 3b 0a 20 20 65 6c  5 ) n -= 2;.  el
5620: 73 65 20 69 66 28 20 6e 3e 3d 31 20 29 20 6e 20  se if( n>=1 ) n 
5630: 2d 3d 20 31 3b 0a 20 20 69 66 28 20 78 3e 3d 33  -= 1;.  if( x>=3
5640: 20 29 20 72 65 74 75 72 6e 20 28 6e 2b 38 29 3c   ) return (n+8)<
5650: 3c 28 78 2d 33 29 3b 0a 20 20 72 65 74 75 72 6e  <(x-3);.  return
5660: 20 28 6e 2b 38 29 3e 3e 28 33 2d 78 29 3b 0a 7d   (n+8)>>(3-x);.}
5670: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5680: 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
5690: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
56a0: 77 73 20 66 72 6f 6d 20 61 20 57 48 45 52 45 20  ws from a WHERE 
56b0: 63 6c 61 75 73 65 0a 2a 2f 0a 75 36 34 20 73 71  clause.*/.u64 sq
56c0: 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74  lite3WhereOutput
56d0: 52 6f 77 43 6f 75 6e 74 28 57 68 65 72 65 49 6e  RowCount(WhereIn
56e0: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
56f0: 65 74 75 72 6e 20 77 68 65 72 65 43 6f 73 74 54  eturn whereCostT
5700: 6f 49 6e 74 28 70 57 49 6e 66 6f 2d 3e 6e 52 6f  oInt(pWInfo->nRo
5710: 77 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  wOut);.}../*.** 
5720: 52 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68  Return one of th
5730: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
5740: 5f 78 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f  _xxxxx values to
5750: 20 69 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68   indicate how th
5760: 69 73 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  is.** WHERE clau
5770: 73 65 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75  se returns outpu
5780: 74 73 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20  ts for DISTINCT 
5790: 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69  processing..*/.i
57a0: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  nt sqlite3WhereI
57b0: 73 44 69 73 74 69 6e 63 74 28 57 68 65 72 65 49  sDistinct(WhereI
57c0: 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
57d0: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65  return pWInfo->e
57e0: 44 69 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a  Distinct;.}../*.
57f0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
5800: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
5810: 73 65 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20  se returns rows 
5820: 69 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65  in ORDER BY orde
5830: 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c  r..** Return FAL
5840: 53 45 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  SE if the output
5850: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72   needs to be sor
5860: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
5870: 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65  te3WhereIsOrdere
5880: 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  d(WhereInfo *pWI
5890: 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  nfo){.  return p
58a0: 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 21 3d 30  WInfo->bOBSat!=0
58b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
58c0: 6e 20 74 68 65 20 56 44 42 45 20 61 64 64 72 65  n the VDBE addre
58d0: 73 73 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a  ss or label to j
58e0: 75 6d 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20  ump to in order 
58f0: 74 6f 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69  to continue.** i
5900: 6d 6d 65 64 69 61 74 65 6c 79 20 77 69 74 68 20  mmediately with 
5910: 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20  the next row of 
5920: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  a WHERE clause..
5930: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
5940: 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c  ereContinueLabel
5950: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
5960: 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57  fo){.  return pW
5970: 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b  Info->iContinue;
5980: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5990: 20 74 68 65 20 56 44 42 45 20 61 64 64 72 65 73   the VDBE addres
59a0: 73 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75  s or label to ju
59b0: 6d 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74  mp to in order t
59c0: 6f 20 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f  o break.** out o
59d0: 66 20 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a  f a WHERE loop..
59e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
59f0: 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68  ereBreakLabel(Wh
5a00: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
5a10: 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  {.  return pWInf
5a20: 6f 2d 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  o->iBreak;.}../*
5a30: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
5a40: 69 66 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  if an UPDATE or 
5a50: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
5a60: 20 63 61 6e 20 6f 70 65 72 61 74 65 20 64 69 72   can operate dir
5a70: 65 63 74 6c 79 20 6f 6e 0a 2a 2a 20 74 68 65 20  ectly on.** the 
5a80: 72 6f 77 69 64 73 20 72 65 74 75 72 6e 65 64 20  rowids returned 
5a90: 62 79 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  by a WHERE claus
5aa0: 65 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  e.  Return FALSE
5ab0: 20 69 66 20 64 6f 69 6e 67 20 61 6e 0a 2a 2a 20   if doing an.** 
5ac0: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
5ad0: 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 73 75   might change su
5ae0: 62 73 65 71 75 65 6e 74 20 57 48 45 52 45 20 63  bsequent WHERE c
5af0: 6c 61 75 73 65 20 72 65 73 75 6c 74 73 2e 0a 2a  lause results..*
5b00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
5b10: 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68 65 72  reOkOnePass(Wher
5b20: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
5b30: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
5b40: 3e 6f 6b 4f 6e 65 50 61 73 73 3b 0a 7d 0a 0a 2f  >okOnePass;.}../
5b50: 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 6f  *.** Move the co
5b60: 6e 74 65 6e 74 20 6f 66 20 70 53 72 63 20 69 6e  ntent of pSrc in
5b70: 74 6f 20 70 44 65 73 74 0a 2a 2f 0a 73 74 61 74  to pDest.*/.stat
5b80: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72 4d  ic void whereOrM
5b90: 6f 76 65 28 57 68 65 72 65 4f 72 53 65 74 20 2a  ove(WhereOrSet *
5ba0: 70 44 65 73 74 2c 20 57 68 65 72 65 4f 72 53 65  pDest, WhereOrSe
5bb0: 74 20 2a 70 53 72 63 29 7b 0a 20 20 70 44 65 73  t *pSrc){.  pDes
5bc0: 74 2d 3e 6e 20 3d 20 70 53 72 63 2d 3e 6e 3b 0a  t->n = pSrc->n;.
5bd0: 20 20 6d 65 6d 63 70 79 28 70 44 65 73 74 2d 3e    memcpy(pDest->
5be0: 61 2c 20 70 53 72 63 2d 3e 61 2c 20 70 44 65 73  a, pSrc->a, pDes
5bf0: 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28 70 44 65 73  t->n*sizeof(pDes
5c00: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d 0a 0a 2f 2a  t->a[0]));.}../*
5c10: 0a 2a 2a 20 54 72 79 20 74 6f 20 69 6e 73 65 72  .** Try to inser
5c20: 74 20 61 20 6e 65 77 20 70 72 65 72 65 71 75 69  t a new prerequi
5c30: 73 69 74 65 2f 63 6f 73 74 20 65 6e 74 72 79 20  site/cost entry 
5c40: 69 6e 74 6f 20 74 68 65 20 57 68 65 72 65 4f 72  into the WhereOr
5c50: 53 65 74 20 70 53 65 74 2e 0a 2a 2a 0a 2a 2a 20  Set pSet..**.** 
5c60: 54 68 65 20 6e 65 77 20 65 6e 74 72 79 20 6d 69  The new entry mi
5c70: 67 68 74 20 6f 76 65 72 77 72 69 74 65 20 61 6e  ght overwrite an
5c80: 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2c   existing entry,
5c90: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a   or it might be.
5ca0: 2a 2a 20 61 70 70 65 6e 64 65 64 2c 20 6f 72 20  ** appended, or 
5cb0: 69 74 20 6d 69 67 68 74 20 62 65 20 64 69 73 63  it might be disc
5cc0: 61 72 64 65 64 2e 20 20 44 6f 20 77 68 61 74 65  arded.  Do whate
5cd0: 76 65 72 20 69 73 20 74 68 65 20 72 69 67 68 74  ver is the right
5ce0: 20 74 68 69 6e 67 0a 2a 2a 20 73 6f 20 74 68 61   thing.** so tha
5cf0: 74 20 70 53 65 74 20 6b 65 65 70 73 20 74 68 65  t pSet keeps the
5d00: 20 4e 5f 4f 52 5f 43 4f 53 54 20 62 65 73 74 20   N_OR_COST best 
5d10: 65 6e 74 72 69 65 73 20 73 65 65 6e 20 73 6f 20  entries seen so 
5d20: 66 61 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  far..*/.static i
5d30: 6e 74 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74  nt whereOrInsert
5d40: 28 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20 2a  (.  WhereOrSet *
5d50: 70 53 65 74 2c 20 20 20 20 20 20 2f 2a 20 54 68  pSet,      /* Th
5d60: 65 20 57 68 65 72 65 4f 72 53 65 74 20 74 6f 20  e WhereOrSet to 
5d70: 62 65 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20  be updated */.  
5d80: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 2c 20  Bitmask prereq, 
5d90: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71         /* Prereq
5da0: 75 69 73 69 74 65 73 20 6f 66 20 74 68 65 20 6e  uisites of the n
5db0: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20 57 68  ew entry */.  Wh
5dc0: 65 72 65 43 6f 73 74 20 72 52 75 6e 2c 20 20 20  ereCost rRun,   
5dd0: 20 20 20 20 20 2f 2a 20 52 75 6e 2d 63 6f 73 74       /* Run-cost
5de0: 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72   of the new entr
5df0: 79 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  y */.  WhereCost
5e00: 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 2f 2a   nOut         /*
5e10: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   Number of outpu
5e20: 74 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65  ts for the new e
5e30: 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 31 36  ntry */.){.  u16
5e40: 20 69 3b 0a 20 20 57 68 65 72 65 4f 72 43 6f 73   i;.  WhereOrCos
5e50: 74 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 70 53  t *p;.  for(i=pS
5e60: 65 74 2d 3e 6e 2c 20 70 3d 70 53 65 74 2d 3e 61  et->n, p=pSet->a
5e70: 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 2b 2b 29  ; i>0; i--, p++)
5e80: 7b 0a 20 20 20 20 69 66 28 20 72 52 75 6e 3c 3d  {.    if( rRun<=
5e90: 70 2d 3e 72 52 75 6e 20 26 26 20 28 70 72 65 72  p->rRun && (prer
5ea0: 65 71 20 26 20 70 2d 3e 70 72 65 72 65 71 29 3d  eq & p->prereq)=
5eb0: 3d 70 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20  =prereq ){.     
5ec0: 20 67 6f 74 6f 20 77 68 65 72 65 4f 72 49 6e 73   goto whereOrIns
5ed0: 65 72 74 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a  ert_done;.    }.
5ee0: 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c      if( p->rRun<
5ef0: 3d 72 52 75 6e 20 26 26 20 28 70 2d 3e 70 72 65  =rRun && (p->pre
5f00: 72 65 71 20 26 20 70 72 65 72 65 71 29 3d 3d 70  req & prereq)==p
5f10: 2d 3e 70 72 65 72 65 71 20 29 7b 0a 20 20 20 20  ->prereq ){.    
5f20: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
5f30: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 74  }.  }.  if( pSet
5f40: 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53 54 20 29 7b  ->n<N_OR_COST ){
5f50: 0a 20 20 20 20 70 20 3d 20 26 70 53 65 74 2d 3e  .    p = &pSet->
5f60: 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d 3b 0a 20 20  a[pSet->n++];.  
5f70: 20 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74    p->nOut = nOut
5f80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
5f90: 20 3d 20 70 53 65 74 2d 3e 61 3b 0a 20 20 20 20   = pSet->a;.    
5fa0: 66 6f 72 28 69 3d 31 3b 20 69 3c 70 53 65 74 2d  for(i=1; i<pSet-
5fb0: 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  >n; i++){.      
5fc0: 69 66 28 20 70 2d 3e 72 52 75 6e 3e 70 53 65 74  if( p->rRun>pSet
5fd0: 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20 29 20 70 20  ->a[i].rRun ) p 
5fe0: 3d 20 70 53 65 74 2d 3e 61 20 2b 20 69 3b 0a 20  = pSet->a + i;. 
5ff0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
6000: 72 52 75 6e 3c 3d 72 52 75 6e 20 29 20 72 65 74  rRun<=rRun ) ret
6010: 75 72 6e 20 30 3b 0a 20 20 7d 0a 77 68 65 72 65  urn 0;.  }.where
6020: 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3a 0a 20  OrInsert_done:. 
6030: 20 70 2d 3e 70 72 65 72 65 71 20 3d 20 70 72 65   p->prereq = pre
6040: 72 65 71 3b 0a 20 20 70 2d 3e 72 52 75 6e 20 3d  req;.  p->rRun =
6050: 20 72 52 75 6e 3b 0a 20 20 69 66 28 20 70 2d 3e   rRun;.  if( p->
6060: 6e 4f 75 74 3e 6e 4f 75 74 20 29 20 70 2d 3e 6e  nOut>nOut ) p->n
6070: 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 72 65  Out = nOut;.  re
6080: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
6090: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 70 72   Initialize a pr
60a0: 65 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65  eallocated Where
60b0: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
60c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
60d0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
60e0: 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  (.  WhereClause 
60f0: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 2f 2a 20  *pWC,        /* 
6100: 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  The WhereClause 
6110: 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  to be initialize
6120: 64 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  d */.  WhereInfo
6130: 20 2a 70 57 49 6e 66 6f 20 20 20 20 20 20 20 20   *pWInfo        
6140: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 70 72 6f  /* The WHERE pro
6150: 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  cessing context 
6160: 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 57 49  */.){.  pWC->pWI
6170: 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20  nfo = pWInfo;.  
6180: 70 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 30 3b  pWC->pOuter = 0;
6190: 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20 3d 20  .  pWC->nTerm = 
61a0: 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20  0;.  pWC->nSlot 
61b0: 3d 20 41 72 72 61 79 53 69 7a 65 28 70 57 43 2d  = ArraySize(pWC-
61c0: 3e 61 53 74 61 74 69 63 29 3b 0a 20 20 70 57 43  >aStatic);.  pWC
61d0: 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74 61 74  ->a = pWC->aStat
61e0: 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  ic;.}../* Forwar
61f0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
6200: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
6210: 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65 72  ClauseClear(Wher
6220: 65 43 6c 61 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a  eClause*);../*.*
6230: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c  * Deallocate all
6240: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
6250: 65 64 20 77 69 74 68 20 61 20 57 68 65 72 65 4f  ed with a WhereO
6260: 72 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f  rInfo object..*/
6270: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
6280: 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 73  reOrInfoDelete(s
6290: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
62a0: 65 4f 72 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77  eOrInfo *p){.  w
62b0: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
62c0: 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74  &p->wc);.  sqlit
62d0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
62e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
62f0: 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  cate all memory 
6300: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
6310: 61 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 6f  a WhereAndInfo o
6320: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
6330: 20 76 6f 69 64 20 77 68 65 72 65 41 6e 64 49 6e   void whereAndIn
6340: 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  foDelete(sqlite3
6350: 20 2a 64 62 2c 20 57 68 65 72 65 41 6e 64 49 6e   *db, WhereAndIn
6360: 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43  fo *p){.  whereC
6370: 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77  lauseClear(&p->w
6380: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  c);.  sqlite3DbF
6390: 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
63a0: 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
63b0: 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  a WhereClause st
63c0: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 57 68  ructure.  The Wh
63d0: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
63e0: 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69 73  ure.** itself is
63f0: 20 6e 6f 74 20 66 72 65 65 64 2e 20 20 54 68 69   not freed.  Thi
6400: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
6410: 20 69 6e 76 65 72 73 65 20 6f 66 20 77 68 65 72   inverse of wher
6420: 65 43 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a 2a  eClauseInit()..*
6430: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
6440: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57  ereClauseClear(W
6450: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29  hereClause *pWC)
6460: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  {.  int i;.  Whe
6470: 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20 73 71 6c  reTerm *a;.  sql
6480: 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e  ite3 *db = pWC->
6490: 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
64a0: 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d  db;.  for(i=pWC-
64b0: 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43 2d  >nTerm-1, a=pWC-
64c0: 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61  >a; i>=0; i--, a
64d0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e  ++){.    if( a->
64e0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44  wtFlags & TERM_D
64f0: 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20  YNAMIC ){.      
6500: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
6510: 65 28 64 62 2c 20 61 2d 3e 70 45 78 70 72 29 3b  e(db, a->pExpr);
6520: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61  .    }.    if( a
6530: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
6540: 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20  _ORINFO ){.     
6550: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
6560: 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 4f 72 49  te(db, a->u.pOrI
6570: 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  nfo);.    }else 
6580: 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26  if( a->wtFlags &
6590: 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20 29 7b   TERM_ANDINFO ){
65a0: 0a 20 20 20 20 20 20 77 68 65 72 65 41 6e 64 49  .      whereAndI
65b0: 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d  nfoDelete(db, a-
65c0: 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b 0a 20 20  >u.pAndInfo);.  
65d0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57    }.  }.  if( pW
65e0: 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74 61 74  C->a!=pWC->aStat
65f0: 69 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ic ){.    sqlite
6600: 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 43 2d  3DbFree(db, pWC-
6610: 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  >a);.  }.}../*.*
6620: 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 6e  * Add a single n
6630: 65 77 20 57 68 65 72 65 54 65 72 6d 20 65 6e 74  ew WhereTerm ent
6640: 72 79 20 74 6f 20 74 68 65 20 57 68 65 72 65 43  ry to the WhereC
6650: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
6660: 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20 57 68 65  ..** The new Whe
6670: 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73  reTerm object is
6680: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 66 72 6f   constructed fro
6690: 6d 20 45 78 70 72 20 70 20 61 6e 64 20 77 69 74  m Expr p and wit
66a0: 68 20 77 74 46 6c 61 67 73 2e 0a 2a 2a 20 54 68  h wtFlags..** Th
66b0: 65 20 69 6e 64 65 78 20 69 6e 20 70 57 43 2d 3e  e index in pWC->
66c0: 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65 77 20 57  a[] of the new W
66d0: 68 65 72 65 54 65 72 6d 20 69 73 20 72 65 74 75  hereTerm is retu
66e0: 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
66f0: 0a 2a 2a 20 30 20 69 73 20 72 65 74 75 72 6e 65  .** 0 is returne
6700: 64 20 69 66 20 74 68 65 20 6e 65 77 20 57 68 65  d if the new Whe
6710: 72 65 54 65 72 6d 20 63 6f 75 6c 64 20 6e 6f 74  reTerm could not
6720: 20 62 65 20 61 64 64 65 64 20 64 75 65 20 74 6f   be added due to
6730: 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c   a memory.** all
6740: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2e 20 20  ocation error.  
6750: 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  The memory alloc
6760: 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 77 69  ation failure wi
6770: 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69  ll be recorded i
6780: 6e 0a 2a 2a 20 74 68 65 20 64 62 2d 3e 6d 61 6c  n.** the db->mal
6790: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73  locFailed flag s
67a0: 6f 20 74 68 61 74 20 68 69 67 68 65 72 2d 6c 65  o that higher-le
67b0: 76 65 6c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61  vel functions ca
67c0: 6e 20 64 65 74 65 63 74 20 69 74 2e 0a 2a 2a 0a  n detect it..**.
67d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
67e0: 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74 68  will increase th
67f0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 57  e size of the pW
6800: 43 2d 3e 61 5b 5d 20 61 72 72 61 79 20 61 73 20  C->a[] array as 
6810: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
6820: 20 49 66 20 74 68 65 20 77 74 46 6c 61 67 73 20   If the wtFlags 
6830: 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c 75 64 65  argument include
6840: 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 2c 20  s TERM_DYNAMIC, 
6850: 74 68 65 6e 20 72 65 73 70 6f 6e 73 69 62 69 6c  then responsibil
6860: 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72 65 65 69  ity.** for freei
6870: 6e 67 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ng the expressio
6880: 6e 20 70 20 69 73 20 61 73 73 75 6d 65 64 20 62  n p is assumed b
6890: 79 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  y the WhereClaus
68a0: 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a  e object pWC..**
68b0: 20 54 68 69 73 20 69 73 20 74 72 75 65 20 65 76   This is true ev
68c0: 65 6e 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  en if this routi
68d0: 6e 65 20 66 61 69 6c 73 20 74 6f 20 61 6c 6c 6f  ne fails to allo
68e0: 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65  cate a new Where
68f0: 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e  Term..**.** WARN
6900: 49 4e 47 3a 20 20 54 68 69 73 20 72 6f 75 74 69  ING:  This routi
6910: 6e 65 20 6d 69 67 68 74 20 72 65 61 6c 6c 6f 63  ne might realloc
6920: 61 74 65 20 74 68 65 20 73 70 61 63 65 20 75 73  ate the space us
6930: 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 57  ed to store.** W
6940: 68 65 72 65 54 65 72 6d 73 2e 20 20 41 6c 6c 20  hereTerms.  All 
6950: 70 6f 69 6e 74 65 72 73 20 74 6f 20 57 68 65 72  pointers to Wher
6960: 65 54 65 72 6d 73 20 73 68 6f 75 6c 64 20 62 65  eTerms should be
6970: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 66 74   invalidated aft
6980: 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68  er.** calling th
6990: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 53 75 63  is routine.  Suc
69a0: 68 20 70 6f 69 6e 74 65 72 73 20 6d 61 79 20 62  h pointers may b
69b0: 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20  e reinitialized 
69c0: 62 79 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a  by referencing.*
69d0: 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61  * the pWC->a[] a
69e0: 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
69f0: 69 6e 74 20 77 68 65 72 65 43 6c 61 75 73 65 49  int whereClauseI
6a00: 6e 73 65 72 74 28 57 68 65 72 65 43 6c 61 75 73  nsert(WhereClaus
6a10: 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 2c  e *pWC, Expr *p,
6a20: 20 75 38 20 77 74 46 6c 61 67 73 29 7b 0a 20 20   u8 wtFlags){.  
6a30: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
6a40: 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 74  ;.  int idx;.  t
6a50: 65 73 74 63 61 73 65 28 20 77 74 46 6c 61 67 73  estcase( wtFlags
6a60: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
6a70: 29 3b 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e 54  );.  if( pWC->nT
6a80: 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20  erm>=pWC->nSlot 
6a90: 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  ){.    WhereTerm
6aa0: 20 2a 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b   *pOld = pWC->a;
6ab0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
6ac0: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e   = pWC->pWInfo->
6ad0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
6ae0: 70 57 43 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  pWC->a = sqlite3
6af0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
6b00: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
6b10: 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29  )*pWC->nSlot*2 )
6b20: 3b 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61  ;.    if( pWC->a
6b30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
6b40: 20 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f   wtFlags & TERM_
6b50: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20  DYNAMIC ){.     
6b60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
6b70: 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  lete(db, p);.   
6b80: 20 20 20 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e     }.      pWC->
6b90: 61 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20  a = pOld;.      
6ba0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
6bb0: 20 20 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e      memcpy(pWC->
6bc0: 61 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28  a, pOld, sizeof(
6bd0: 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e  pWC->a[0])*pWC->
6be0: 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20  nTerm);.    if( 
6bf0: 70 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74  pOld!=pWC->aStat
6c00: 69 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ic ){.      sqli
6c10: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f  te3DbFree(db, pO
6c20: 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ld);.    }.    p
6c30: 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69  WC->nSlot = sqli
6c40: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
6c50: 64 62 2c 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65  db, pWC->a)/size
6c60: 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20  of(pWC->a[0]);. 
6c70: 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57   }.  pTerm = &pW
6c80: 43 2d 3e 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e  C->a[idx = pWC->
6c90: 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72  nTerm++];.  pTer
6ca0: 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  m->pExpr = sqlit
6cb0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
6cc0: 65 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77  e(p);.  pTerm->w
6cd0: 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73  tFlags = wtFlags
6ce0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d  ;.  pTerm->pWC =
6cf0: 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69   pWC;.  pTerm->i
6d00: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72  Parent = -1;.  r
6d10: 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a  eturn idx;.}../*
6d20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6d30: 20 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65   identifies sube
6d40: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
6d50: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77  e WHERE clause w
6d60: 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62  here.** each sub
6d70: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
6d80: 70 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41  parated by the A
6d90: 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73  ND operator or s
6da0: 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65  ome other.** ope
6db0: 72 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20  rator specified 
6dc0: 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  in the op parame
6dd0: 74 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43  ter.  The WhereC
6de0: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
6df0: 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ** is filled wit
6e00: 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75  h pointers to su
6e10: 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46  bexpressions.  F
6e20: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
6e30: 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27  *    WHERE  a=='
6e40: 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65  hello' AND coale
6e50: 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44  sce(b,11)<10 AND
6e60: 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d   (c+12!=d OR c==
6e70: 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  22).**          
6e80: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20   \________/     
6e90: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
6ea0: 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  /     \_________
6eb0: 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20  _______/.**     
6ec0: 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20         slot[0]  
6ed0: 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31            slot[1
6ee0: 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ]               
6ef0: 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68  slot[2].**.** Th
6f00: 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45  e original WHERE
6f10: 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72   clause in pExpr
6f20: 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20   is unaltered.  
6f30: 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
6f40: 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65  .** does is make
6f50: 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20   slot[] entries 
6f60: 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75  point to substru
6f70: 63 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78  cture within pEx
6f80: 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  pr..**.** In the
6f90: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
6fa0: 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69  ce and in the di
6fb0: 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20  agram, "slot[]" 
6fc0: 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  refers to.** the
6fd0: 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d   WhereClause.a[]
6fe0: 20 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f   array.  The slo
6ff0: 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20  t[] array grows 
7000: 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e  as needed to con
7010: 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d  tain.** all term
7020: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
7030: 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
7040: 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74   void whereSplit
7050: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
7060: 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  C, Expr *pExpr, 
7070: 75 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f  u8 op){.  pWC->o
7080: 70 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70 45  p = op;.  if( pE
7090: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
70a0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
70b0: 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72  !=op ){.    wher
70c0: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
70d0: 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  C, pExpr, 0);.  
70e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65  }else{.    where
70f0: 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72  Split(pWC, pExpr
7100: 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20  ->pLeft, op);.  
7110: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43    whereSplit(pWC
7120: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
7130: 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   op);.  }.}../*.
7140: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
7150: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a  WhereMaskSet obj
7160: 65 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ect.*/.#define i
7170: 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 28  nitMaskSet(P)  (
7180: 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52  P)->n=0../*.** R
7190: 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73  eturn the bitmas
71a0: 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
71b0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20  cursor number.  
71c0: 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69  Return 0 if.** i
71d0: 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  Cursor is not in
71e0: 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61   the set..*/.sta
71f0: 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d  tic Bitmask getM
7200: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
7210: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
7220: 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20  iCursor){.  int 
7230: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  i;.  assert( pMa
7240: 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73  skSet->n<=(int)s
7250: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
7260: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
7270: 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b  <pMaskSet->n; i+
7280: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73  +){.    if( pMas
7290: 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75  kSet->ix[i]==iCu
72a0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65  rsor ){.      re
72b0: 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b  turn MASKBIT(i);
72c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
72d0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
72e0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73  Create a new mas
72f0: 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75  k for cursor iCu
7300: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rsor..**.** Ther
7310: 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20  e is one cursor 
7320: 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65  per table in the
7330: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
7340: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
7350: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
7360: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
7370: 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65  ited by a test e
7380: 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73  arly in the.** s
7390: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
73a0: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20  () routine.  So 
73b0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
73c0: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a   pMaskSet->ix[].
73d0: 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65  ** array will ne
73e0: 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f  ver overflow..*/
73f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
7400: 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  ateMask(WhereMas
7410: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
7420: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
7430: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
7440: 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ->n < ArraySize(
7450: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b  pMaskSet->ix) );
7460: 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  .  pMaskSet->ix[
7470: 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d  pMaskSet->n++] =
7480: 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   iCursor;.}../*.
7490: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
74a0: 73 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76  s walk (recursiv
74b0: 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69  ely) an expressi
74c0: 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65  on tree and gene
74d0: 72 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73  rate.** a bitmas
74e0: 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69  k indicating whi
74f0: 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73  ch tables are us
7500: 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  ed in that expre
7510: 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a  ssion.** tree..*
7520: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
7530: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
7540: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
7550: 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
7560: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
7570: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
7580: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
7590: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74  , Select*);.stat
75a0: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54  ic Bitmask exprT
75b0: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
75c0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
75d0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69  , Expr *p){.  Bi
75e0: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
75f0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
7600: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
7610: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
7620: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d  .    mask = getM
7630: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  ask(pMaskSet, p-
7640: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65  >iTable);.    re
7650: 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20  turn mask;.  }. 
7660: 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c   mask = exprTabl
7670: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
7680: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d   p->pRight);.  m
7690: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
76a0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
76b0: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
76c0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
76d0: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
76e0: 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  ) ){.    mask |=
76f0: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
7700: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
7710: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
7720: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b   }else{.    mask
7730: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
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 4c 69 73 74 29 3b 0a 20 20   p->x.pList);.  
7760: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
7770: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
7780: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
7790: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
77a0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
77b0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
77c0: 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73   int i;.  Bitmas
77d0: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
77e0: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
77f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
7800: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
7810: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
7820: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
7830: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Set, pList->a[i]
7840: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
7850: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
7860: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
7870: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
7880: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
7890: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
78a0: 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42  Select *pS){.  B
78b0: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
78c0: 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a  .  while( pS ){.
78d0: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
78e0: 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  c = pS->pSrc;.  
78f0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
7900: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
7910: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73  skSet, pS->pELis
7920: 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  t);.    mask |= 
7930: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
7940: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
7950: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
7960: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
7970: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
7980: 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42  Set, pS->pOrderB
7990: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
79a0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
79b0: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68  MaskSet, pS->pWh
79c0: 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ere);.    mask |
79d0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
79e0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
79f0: 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28  Having);.    if(
7a00: 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29   ALWAYS(pSrc!=0)
7a10: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
7a20: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
7a30: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
7a40: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  +){.        mask
7a50: 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61   |= exprSelectTa
7a60: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
7a70: 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53  t, pSrc->a[i].pS
7a80: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
7a90: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
7aa0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
7ab0: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29   pSrc->a[i].pOn)
7ac0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7ad0: 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72      pS = pS->pPr
7ae0: 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ior;.  }.  retur
7af0: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
7b00: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
7b10: 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74  the given operat
7b20: 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  or is one of the
7b30: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
7b40: 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f  is.** allowed fo
7b50: 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57  r an indexable W
7b60: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
7b70: 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f  .  The allowed o
7b80: 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20  perators are.** 
7b90: 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22  "=", "<", ">", "
7ba0: 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c  <=", ">=", "IN",
7bb0: 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a   and "IS NULL".*
7bc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
7bd0: 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a  owedOp(int op){.
7be0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e    assert( TK_GT>
7bf0: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54  TK_EQ && TK_GT<T
7c00: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
7c10: 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26  ( TK_LT>TK_EQ &&
7c20: 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a   TK_LT<TK_GE );.
7c30: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e    assert( TK_LE>
7c40: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54  TK_EQ && TK_LE<T
7c50: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
7c60: 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34  ( TK_GE==TK_EQ+4
7c70: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d   );.  return op=
7c80: 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54  =TK_IN || (op>=T
7c90: 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47  K_EQ && op<=TK_G
7ca0: 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  E) || op==TK_ISN
7cb0: 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77  ULL;.}../*.** Sw
7cc0: 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f  ap two objects o
7cd0: 66 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a  f type TYPE..*/.
7ce0: 23 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50  #define SWAP(TYP
7cf0: 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41  E,A,B) {TYPE t=A
7d00: 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a  ; A=B; B=t;}../*
7d10: 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f  .** Commute a co
7d20: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
7d30: 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20  r.  Expressions 
7d40: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f  of the form "X o
7d50: 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76  p Y".** are conv
7d60: 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70  erted into "Y op
7d70: 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c 65   X"..**.** If le
7d80: 66 74 2f 72 69 67 68 74 20 70 72 65 63 65 64 65  ft/right precede
7d90: 6e 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20 69  nce rules come i
7da0: 6e 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64 65  nto play when de
7db0: 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a 2a  termining the.**
7dc0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
7dd0: 6e 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c 41 54  nce, then COLLAT
7de0: 45 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20  E operators are 
7df0: 61 64 6a 75 73 74 65 64 20 74 6f 20 65 6e 73 75  adjusted to ensu
7e00: 72 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  re.** that the c
7e10: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
7e20: 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67  e does not chang
7e30: 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  e.  For example:
7e40: 0a 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e  .** "Y collate N
7e50: 4f 43 41 53 45 20 6f 70 20 58 22 20 62 65 63 6f  OCASE op X" beco
7e60: 6d 65 73 20 22 58 20 6f 70 20 59 22 20 62 65 63  mes "X op Y" bec
7e70: 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69  ause any collati
7e80: 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a  on sequence on.*
7e90: 2a 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20  * the left hand 
7ea0: 73 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72  side of a compar
7eb0: 69 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61  ison overrides a
7ec0: 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ny collation seq
7ed0: 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68  uence .** attach
7ee0: 65 64 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e  ed to the right.
7ef0: 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65   For the same re
7f00: 61 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c 6c  ason the EP_Coll
7f10: 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e  ate flag.** is n
7f20: 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a  ot commuted..*/.
7f30: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
7f40: 43 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a 70  Commute(Parse *p
7f50: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
7f60: 70 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52 69  pr){.  u16 expRi
7f70: 67 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 52  ght = (pExpr->pR
7f80: 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  ight->flags & EP
7f90: 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36  _Collate);.  u16
7fa0: 20 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70   expLeft = (pExp
7fb0: 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  r->pLeft->flags 
7fc0: 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20  & EP_Collate);. 
7fd0: 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64   assert( allowed
7fe0: 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26  Op(pExpr->op) &&
7ff0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49   pExpr->op!=TK_I
8000: 4e 20 29 3b 0a 20 20 69 66 28 20 65 78 70 52 69  N );.  if( expRi
8010: 67 68 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b 0a  ght==expLeft ){.
8020: 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 58 20      /* Either X 
8030: 61 6e 64 20 59 20 62 6f 74 68 20 68 61 76 65 20  and Y both have 
8040: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
8050: 20 6f 72 20 6e 65 69 74 68 65 72 20 64 6f 20 2a   or neither do *
8060: 2f 0a 20 20 20 20 69 66 28 20 65 78 70 52 69 67  /.    if( expRig
8070: 68 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42  ht ){.      /* B
8080: 6f 74 68 20 58 20 61 6e 64 20 59 20 68 61 76 65  oth X and Y have
8090: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
80a0: 72 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 58  rs.  Make sure X
80b0: 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 20   is always.     
80c0: 20 2a 2a 20 75 73 65 64 20 62 79 20 63 6c 65 61   ** used by clea
80d0: 72 69 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c 6c  ring the EP_Coll
80e0: 61 74 65 20 66 6c 61 67 20 66 72 6f 6d 20 59 2e  ate flag from Y.
80f0: 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
8100: 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26  >pRight->flags &
8110: 3d 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20  = ~EP_Collate;. 
8120: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
8130: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
8140: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
8150: 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  Left)!=0 ){.    
8160: 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 58 20 6e    /* Neither X n
8170: 6f 72 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54  or Y have COLLAT
8180: 45 20 6f 70 65 72 61 74 6f 72 73 2c 20 62 75 74  E operators, but
8190: 20 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65 66   X has a non-def
81a0: 61 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ault.      ** co
81b0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
81c0: 2e 20 20 53 6f 20 61 64 64 20 74 68 65 20 45 50  .  So add the EP
81d0: 5f 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72 20  _Collate marker 
81e0: 6f 6e 20 58 20 74 6f 20 63 61 75 73 65 0a 20 20  on X to cause.  
81f0: 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20      ** it to be 
8200: 73 65 61 72 63 68 65 64 20 66 69 72 73 74 2e 20  searched first. 
8210: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
8220: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20  pLeft->flags |= 
8230: 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  EP_Collate;.    
8240: 7d 0a 20 20 7d 0a 20 20 53 57 41 50 28 45 78 70  }.  }.  SWAP(Exp
8250: 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r*,pExpr->pRight
8260: 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  ,pExpr->pLeft);.
8270: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e    if( pExpr->op>
8280: 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73  =TK_GT ){.    as
8290: 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f  sert( TK_LT==TK_
82a0: 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65  GT+2 );.    asse
82b0: 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45  rt( TK_GE==TK_LE
82c0: 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +2 );.    assert
82d0: 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b  ( TK_GT>TK_EQ );
82e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
82f0: 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  GT<TK_LE );.    
8300: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
8310: 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70  p>=TK_GT && pExp
8320: 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a  r->op<=TK_GE );.
8330: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
8340: 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47  ((pExpr->op-TK_G
8350: 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d  T)^2)+TK_GT;.  }
8360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c  .}../*.** Transl
8370: 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f  ate from TK_xx o
8380: 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78  perator to WO_xx
8390: 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61   bitmask..*/.sta
83a0: 74 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72  tic u16 operator
83b0: 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20  Mask(int op){.  
83c0: 75 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28  u16 c;.  assert(
83d0: 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29   allowedOp(op) )
83e0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  ;.  if( op==TK_I
83f0: 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f  N ){.    c = WO_
8400: 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  IN;.  }else if( 
8410: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
8420: 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55  .    c = WO_ISNU
8430: 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
8440: 20 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c   assert( (WO_EQ<
8450: 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30  <(op-TK_EQ)) < 0
8460: 78 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d  x7fff );.    c =
8470: 20 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f   (u16)(WO_EQ<<(o
8480: 70 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20  p-TK_EQ));.  }. 
8490: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
84a0: 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f  ISNULL || c==WO_
84b0: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65  ISNULL );.  asse
84c0: 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c  rt( op!=TK_IN ||
84d0: 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61   c==WO_IN );.  a
84e0: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51  ssert( op!=TK_EQ
84f0: 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a   || c==WO_EQ );.
8500: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
8510: 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20  _LT || c==WO_LT 
8520: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
8530: 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_LE || c==WO_
8540: 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LE );.  assert( 
8550: 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d  op!=TK_GT || c==
8560: 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72  WO_GT );.  asser
8570: 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20  t( op!=TK_GE || 
8580: 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65  c==WO_GE );.  re
8590: 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn c;.}../*.**
85a0: 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   Advance to the 
85b0: 6e 65 78 74 20 57 68 65 72 65 54 65 72 6d 20 74  next WhereTerm t
85c0: 68 61 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f  hat matches acco
85d0: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69  rding to the cri
85e0: 74 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69  teria.** establi
85f0: 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 70 53  shed when the pS
8600: 63 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69  can object was i
8610: 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68  nitialized by wh
8620: 65 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a  ereScanInit()..*
8630: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
8640: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
8650: 72 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72  re matching Wher
8660: 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69  eTerms..*/.stati
8670: 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65  c WhereTerm *whe
8680: 72 65 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65  reScanNext(Where
8690: 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20  Scan *pScan){.  
86a0: 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
86b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
86c0: 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66  or on the LHS of
86d0: 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69   the term */.  i
86e0: 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  nt iColumn;     
86f0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d      /* The colum
8700: 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20  n on the LHS of 
8710: 74 68 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f  the term.  -1 fo
8720: 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20  r IPK */.  Expr 
8730: 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
8740: 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e  /* An expression
8750: 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f   being tested */
8760: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
8770: 70 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74  pWC;    /* Short
8780: 68 61 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e  hand for pScan->
8790: 70 57 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  pWC */.  WhereTe
87a0: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a  rm *pTerm;    /*
87b0: 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20   The term being 
87c0: 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  tested */.  int 
87d0: 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20  k = pScan->k;   
87e0: 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61   /* Where to sta
87f0: 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a  rt scanning */..
8800: 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e    while( pScan->
8810: 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e  iEquiv<=pScan->n
8820: 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75  Equiv ){.    iCu
8830: 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69  r = pScan->aEqui
8840: 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d  v[pScan->iEquiv-
8850: 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20  2];.    iColumn 
8860: 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  = pScan->aEquiv[
8870: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d  pScan->iEquiv-1]
8880: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 57  ;.    while( (pW
8890: 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29 21  C = pScan->pWC)!
88a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
88b0: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b 20  pTerm=pWC->a+k; 
88c0: 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 2b  k<pWC->nTerm; k+
88d0: 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
88e0: 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
88f0: 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
8900: 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66   && pTerm->u.lef
8910: 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e  tColumn==iColumn
8920: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
8930: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
8940: 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21  tor & WO_EQUIV)!
8950: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
8960: 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41   pScan->nEquiv<A
8970: 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e  rraySize(pScan->
8980: 61 45 71 75 69 76 29 0a 20 20 20 20 20 20 20 20  aEquiv).        
8990: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
89a0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
89b0: 20 20 20 20 70 58 20 3d 20 73 71 6c 69 74 65 33      pX = sqlite3
89c0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
89d0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
89e0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
89f0: 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f     assert( pX->o
8a00: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
8a10: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
8a20: 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45  j=0; j<pScan->nE
8a30: 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20  quiv; j+=2){.   
8a40: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
8a50: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d  Scan->aEquiv[j]=
8a60: 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20  =pX->iTable.    
8a70: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 53             && pS
8a80: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d  can->aEquiv[j+1]
8a90: 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  ==pX->iColumn ){
8aa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8ab0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8ac0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8ad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8ae0: 20 20 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e      if( j==pScan
8af0: 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20  ->nEquiv ){.    
8b00: 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d            pScan-
8b10: 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58 2d  >aEquiv[j] = pX-
8b20: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
8b30: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45         pScan->aE
8b40: 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e  quiv[j+1] = pX->
8b50: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
8b60: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45         pScan->nE
8b70: 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20  quiv += 2;.     
8b80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8b90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
8ba0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
8bb0: 61 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70  ator & pScan->op
8bc0: 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  Mask)!=0 ){.    
8bd0: 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66          /* Verif
8be0: 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 61  y the affinity a
8bf0: 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nd collating seq
8c00: 75 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20  uence match */. 
8c10: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
8c20: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20  Scan->zCollName 
8c30: 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  && (pTerm->eOper
8c40: 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
8c50: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8c60: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
8c70: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
8c80: 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73      Parse *pPars
8c90: 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d  e = pWC->pWInfo-
8ca0: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
8cb0: 20 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72         pX = pTer
8cc0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
8cd0: 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
8ce0: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
8cf0: 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69  yOk(pX, pScan->i
8d00: 64 78 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20  dxaff) ){.      
8d10: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
8d20: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
8d30: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
8d40: 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65    assert(pX->pLe
8d50: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ft);.           
8d60: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
8d70: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
8d80: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20  ollSeq(pParse,. 
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8dc0: 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e   pX->pLeft, pX->
8dd0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
8de0: 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
8df0: 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50  ==0 ) pColl = pP
8e00: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
8e10: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
8e20: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
8e30: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
8e40: 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c  me, pScan->zColl
8e50: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
8e60: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
8e70: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
8e80: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
8e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
8ea0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
8eb0: 6f 72 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20  or & WO_EQ)!=0. 
8ec0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
8ed0: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
8ee0: 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d  r->pRight)->op==
8ef0: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
8f00: 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54         && pX->iT
8f10: 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71  able==pScan->aEq
8f20: 75 69 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20  uiv[0].         
8f30: 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75      && pX->iColu
8f40: 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69  mn==pScan->aEqui
8f50: 76 5b 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20  v[1].           
8f60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8f70: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8f80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8f90: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d        pScan->k =
8fa0: 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20   k+1;.          
8fb0: 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a    return pTerm;.
8fc0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8fd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8fe0: 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d      pScan->pWC =
8ff0: 20 70 53 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75   pScan->pWC->pOu
9000: 74 65 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30  ter;.      k = 0
9010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61  ;.    }.    pSca
9020: 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e  n->pWC = pScan->
9030: 70 4f 72 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d  pOrigWC;.    k =
9040: 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69   0;.    pScan->i
9050: 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a  Equiv += 2;.  }.
9060: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
9070: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
9080: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73  a WHERE clause s
9090: 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20  canner object.  
90a0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
90b0: 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   to the.** first
90c0: 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20   match.  Return 
90d0: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
90e0: 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a  e no matches..**
90f0: 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20  .** The scanner 
9100: 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e  will be searchin
9110: 67 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  g the WHERE clau
9120: 73 65 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c  se pWC.  It will
9130: 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72   look.** for ter
9140: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ms of the form "
9150: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77  X <op> <expr>" w
9160: 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e  here X is column
9170: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
9180: 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54 68 65 20  e.** iCur.  The 
9190: 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65  <op> must be one
91a0: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
91b0: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 6f  s described by o
91c0: 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pMask..**.** If 
91d0: 74 68 65 20 73 65 61 72 63 68 20 69 73 20 66 6f  the search is fo
91e0: 72 20 58 20 61 6e 64 20 74 68 65 20 57 48 45 52  r X and the WHER
91f0: 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
9200: 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  s terms of the.*
9210: 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20  * form X=Y then 
9220: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
9230: 68 74 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74  ht also return t
9240: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
9250: 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70  .** "Y <op> <exp
9260: 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  r>".  The number
9270: 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72   of levels of tr
9280: 61 6e 73 69 74 69 76 69 74 79 20 69 73 20 6c 69  ansitivity is li
9290: 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73  mited,.** but is
92a0: 20 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c   enough to handl
92b0: 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20  e most commonly 
92c0: 6f 63 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74  occurring SQL st
92d0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
92e0: 49 66 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20  If X is not the 
92f0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
9300: 4b 45 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20  KEY then X must 
9310: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
9320: 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78  th.** index pIdx
9330: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
9340: 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e  eTerm *whereScan
9350: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53 63 61  Init(.  WhereSca
9360: 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20  n *pScan,       
9370: 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63 61 6e  /* The WhereScan
9380: 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e   object being in
9390: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57  itialized */.  W
93a0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
93b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
93c0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
93d0: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e   scanned */.  in
93e0: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
93f0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
9400: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
9410: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
9420: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
9430: 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  mn to scan for *
9440: 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20  /.  u32 opMask, 
9450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9460: 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63  perator(s) to sc
9470: 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  an for */.  Inde
9480: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
9490: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
94a0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
94b0: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a  his index */.){.
94c0: 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d    int j;..  /* m
94d0: 65 6d 73 65 74 28 70 53 63 61 6e 2c 20 30 2c 20  emset(pScan, 0, 
94e0: 73 69 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b  sizeof(*pScan));
94f0: 20 2a 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72   */.  pScan->pOr
9500: 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53  igWC = pWC;.  pS
9510: 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a  can->pWC = pWC;.
9520: 20 20 69 66 28 20 70 49 64 78 20 26 26 20 69 43    if( pIdx && iC
9530: 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
9540: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20  pScan->idxaff = 
9550: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
9560: 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  ol[iColumn].affi
9570: 6e 69 74 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  nity;.    for(j=
9580: 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  0; pIdx->aiColum
9590: 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a  n[j]!=iColumn; j
95a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4e  ++){.      if( N
95b0: 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 43  EVER(j>=pIdx->nC
95c0: 6f 6c 75 6d 6e 29 20 29 20 72 65 74 75 72 6e 20  olumn) ) return 
95d0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63  0;.    }.    pSc
95e0: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20  an->zCollName = 
95f0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b  pIdx->azColl[j];
9600: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53  .  }else{.    pS
9610: 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b  can->idxaff = 0;
9620: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  .    pScan->zCol
9630: 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  lName = 0;.  }. 
9640: 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d   pScan->opMask =
9650: 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e   opMask;.  pScan
9660: 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e  ->k = 0;.  pScan
9670: 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d 20 69 43  ->aEquiv[0] = iC
9680: 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71  ur;.  pScan->aEq
9690: 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e  uiv[1] = iColumn
96a0: 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69  ;.  pScan->nEqui
96b0: 76 20 3d 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e  v = 2;.  pScan->
96c0: 69 45 71 75 69 76 20 3d 20 32 3b 0a 20 20 72 65  iEquiv = 2;.  re
96d0: 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65  turn whereScanNe
96e0: 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a  xt(pScan);.}../*
96f0: 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61  .** Search for a
9700: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
9710: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
9720: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
9730: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a   <op> <expr>".**
9740: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 72 65   where X is a re
9750: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69  ference to the i
9760: 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  Column of table 
9770: 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73  iCur and <op> is
9780: 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57   one of.** the W
9790: 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f  O_xx operator co
97a0: 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62 79  des specified by
97b0: 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65   the op paramete
97c0: 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  r..** Return a p
97d0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65  ointer to the te
97e0: 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  rm.  Return 0 if
97f0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
9800: 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74 75 72  * The term retur
9810: 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59 3d 3c  ned might by Y=<
9820: 65 78 70 72 3e 20 69 66 20 74 68 65 72 65 20 69  expr> if there i
9830: 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72  s another constr
9840: 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57  aint in.** the W
9850: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
9860: 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20   specifies that 
9870: 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68 20 63  X=Y.  Any such c
9880: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
9890: 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64  be.** identified
98a0: 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55 49 56   by the WO_EQUIV
98b0: 20 62 69 74 20 69 6e 20 74 68 65 20 70 54 65 72   bit in the pTer
98c0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66 69 65  m->eOperator fie
98d0: 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45 71 75  ld.  The.** aEqu
98e0: 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64 73  iv[] array holds
98f0: 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65   X and all its e
9900: 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69 74 68  quivalents, with
9910: 20 65 61 63 68 20 53 51 4c 20 76 61 72 69 61 62   each SQL variab
9920: 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20  le.** taking up 
9930: 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61 45 71  two slots in aEq
9940: 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69 72 73  uiv[].  The firs
9950: 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20 74 68  t slot is for th
9960: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a  e cursor number.
9970: 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  ** and the secon
9980: 64 20 69 73 20 66 6f 72 20 74 68 65 20 63 6f 6c  d is for the col
9990: 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  umn number.  The
99a0: 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74 73 20  re are 22 slots 
99b0: 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73  in aEquiv[].** s
99c0: 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  o that means we 
99d0: 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70  can look for X p
99e0: 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f 74 68  lus up to 10 oth
99f0: 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61  er equivalent va
9a00: 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61  lues..** Hence a
9a10: 20 73 65 61 72 63 68 20 66 6f 72 20 58 20 77 69   search for X wi
9a20: 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e  ll return <expr>
9a30: 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41 31 3d   if X=A1 and A1=
9a40: 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20  A2 and A2=A3.** 
9a50: 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41  and ... and A9=A
9a60: 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72  10 and A10=<expr
9a70: 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  >..**.** If ther
9a80: 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74  e are multiple t
9a90: 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
9aa0: 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
9ab0: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
9ac0: 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79  pr>".** then try
9ad0: 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74   for the one wit
9ae0: 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65  h no dependencie
9af0: 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e  s on <expr> - in
9b00: 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77 68 65   other words whe
9b10: 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20  re.** <expr> is 
9b20: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
9b30: 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69  ssion of some ki
9b40: 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e  nd.  Only return
9b50: 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74   entries of.** t
9b60: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
9b70: 59 22 20 77 68 65 72 65 20 59 20 69 73 20 61 20  Y" where Y is a 
9b80: 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65  column in anothe
9b90: 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65  r table if no te
9ba0: 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f  rms of.** the fo
9bb0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73  rm "X <op> <cons
9bc0: 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20  t-expr>" exist. 
9bd0: 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69    If no terms wi
9be0: 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48  th a constant RH
9bf0: 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20  S.** exist, try 
9c00: 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d  to return a term
9c10: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75   that does not u
9c20: 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a  se WO_EQUIV..*/.
9c30: 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72 6d  static WhereTerm
9c40: 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68   *findTerm(.  Wh
9c50: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
9c60: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
9c70: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65   clause to be se
9c80: 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20  arched */.  int 
9c90: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
9ca0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
9cb0: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69  er of LHS */.  i
9cc0: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
9cd0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
9ce0: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
9cf0: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
9d00: 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d  dy,     /* RHS m
9d10: 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20  ust not overlap 
9d20: 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a  with this mask *
9d30: 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20  /.  u32 op,     
9d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
9d50: 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65  k of WO_xx value
9d60: 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65  s describing ope
9d70: 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78  rator */.  Index
9d80: 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
9d90: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
9da0: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
9db0: 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e   index, if not N
9dc0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ULL */.){.  Wher
9dd0: 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d  eTerm *pResult =
9de0: 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   0;.  WhereTerm 
9df0: 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20  *p;.  WhereScan 
9e00: 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65  scan;..  p = whe
9e10: 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
9e20: 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f  , pWC, iCur, iCo
9e30: 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b  lumn, op, pIdx);
9e40: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
9e50: 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
9e60: 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64  qRight & notRead
9e70: 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  y)==0 ){.      i
9e80: 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69 67 68  f( p->prereqRigh
9e90: 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70 65  t==0 && (p->eOpe
9ea0: 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20  rator&WO_EQ)!=0 
9eb0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
9ec0: 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n p;.      }.   
9ed0: 20 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d     if( pResult==
9ee0: 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b  0 ) pResult = p;
9ef0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77  .    }.    p = w
9f00: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63  hereScanNext(&sc
9f10: 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  an);.  }.  retur
9f20: 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a  n pResult;.}../*
9f30: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
9f40: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
9f50: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72  d exprAnalyze(Sr
9f60: 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61  cList*, WhereCla
9f70: 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  use*, int);../*.
9f80: 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c  ** Call exprAnal
9f90: 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  yze on all terms
9fa0: 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
9fb0: 73 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  se.  .*/.static 
9fc0: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
9fd0: 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  All(.  SrcList *
9fe0: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
9ff0: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
a000: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
a010: 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 20 20  use *pWC        
a020: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
a030: 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79  ause to be analy
a040: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  zed */.){.  int 
a050: 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  i;.  for(i=pWC->
a060: 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  nTerm-1; i>=0; i
a070: 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61  --){.    exprAna
a080: 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70  lyze(pTabList, p
a090: 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  WC, i);.  }.}..#
a0a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a0b0: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
a0c0: 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  TION./*.** Check
a0d0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67   to see if the g
a0e0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
a0f0: 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f  is a LIKE or GLO
a100: 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a  B operator that.
a110: 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69  ** can be optimi
a120: 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61  zed using inequa
a130: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
a140: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
a150: 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e  f it is.** so an
a160: 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  d false if not..
a170: 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66  **.** In order f
a180: 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  or the operator 
a190: 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c  to be optimizibl
a1a0: 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74 20  e, the RHS must 
a1b0: 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c  be a string.** l
a1c0: 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73  iteral that does
a1d0: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
a1e0: 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f  a wildcard.  .*/
a1f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69  .static int isLi
a200: 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73  keOrGlob(.  Pars
a210: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
a220: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
a230: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
a240: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
a250: 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
a260: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
a270: 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  ion */.  Expr **
a280: 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f  ppPrefix,  /* Po
a290: 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49  inter to TK_STRI
a2a0: 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  NG expression wi
a2b0: 74 68 20 70 61 74 74 65 72 6e 20 70 72 65 66 69  th pattern prefi
a2c0: 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43  x */.  int *pisC
a2d0: 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65  omplete, /* True
a2e0: 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c   if the only wil
a2f0: 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74 68  dcard is % in th
a300: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
a310: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61   */.  int *pnoCa
a320: 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  se      /* True 
a330: 69 66 20 75 70 70 65 72 63 61 73 65 20 69 73 20  if uppercase is 
a340: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f  equivalent to lo
a350: 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20  wercase */.){.  
a360: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
a370: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  0;         /* St
a380: 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c  ring on RHS of L
a390: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
a3a0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
a3b0: 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20  *pLeft;      /* 
a3c0: 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73  Right and left s
a3d0: 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72  ize of LIKE oper
a3e0: 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ator */.  ExprLi
a3f0: 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  st *pList;      
a400: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
a410: 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20  operands to the 
a420: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
a430: 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20  .  int c;       
a440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a450: 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20 69   One character i
a460: 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63  n z[] */.  int c
a470: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
a480: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a490: 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20  of non-wildcard 
a4a0: 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72  prefix character
a4b0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33  s */.  char wc[3
a4c0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
a4d0: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68    /* Wildcard ch
a4e0: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71  aracters */.  sq
a4f0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a500: 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
a510: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
a520: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
a530: 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20  ue *pVal = 0;.  
a540: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
a550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
a560: 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a  code of pRight *
a570: 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  /..  if( !sqlite
a580: 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28  3IsLikeFunction(
a590: 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61  db, pExpr, pnoCa
a5a0: 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72  se, wc) ){.    r
a5b0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66  eturn 0;.  }.#if
a5c0: 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49  def SQLITE_EBCDI
a5d0: 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65  C.  if( *pnoCase
a5e0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
a5f0: 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45  dif.  pList = pE
a600: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
a610: 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61  pLeft = pList->a
a620: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [1].pExpr;.  if(
a630: 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43   pLeft->op!=TK_C
a640: 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c  OLUMN .   || sql
a650: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
a660: 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f  (pLeft)!=SQLITE_
a670: 41 46 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20  AFF_TEXT .   || 
a680: 49 73 56 69 72 74 75 61 6c 28 70 4c 65 66 74 2d  IsVirtual(pLeft-
a690: 3e 70 54 61 62 29 0a 20 20 29 7b 0a 20 20 20 20  >pTab).  ){.    
a6a0: 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d  /* IMP: R-02065-
a6b0: 34 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68  49465 The left-h
a6c0: 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
a6d0: 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65  LIKE or GLOB ope
a6e0: 72 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a  rator must.    *
a6f0: 2a 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  * be the name of
a700: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
a710: 6d 6e 20 77 69 74 68 20 54 45 58 54 20 61 66 66  mn with TEXT aff
a720: 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65  inity. */.    re
a730: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73  turn 0;.  }.  as
a740: 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f  sert( pLeft->iCo
a750: 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a  lumn!=(-1) ); /*
a760: 20 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76   Because IPK nev
a770: 65 72 20 68 61 73 20 41 46 46 5f 54 45 58 54 20  er has AFF_TEXT 
a780: 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 70  */..  pRight = p
a790: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
a7a0: 3b 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d  ;.  op = pRight-
a7b0: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
a7c0: 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20  K_REGISTER ){.  
a7d0: 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f    op = pRight->o
a7e0: 70 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70  p2;.  }.  if( op
a7f0: 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b  ==TK_VARIABLE ){
a800: 0a 20 20 20 20 56 64 62 65 20 2a 70 52 65 70 72  .    Vdbe *pRepr
a810: 65 70 61 72 65 20 3d 20 70 50 61 72 73 65 2d 3e  epare = pParse->
a820: 70 52 65 70 72 65 70 61 72 65 3b 0a 20 20 20 20  pReprepare;.    
a830: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69 67 68  int iCol = pRigh
a840: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
a850: 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  pVal = sqlite3Vd
a860: 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28  beGetBoundValue(
a870: 70 52 65 70 72 65 70 61 72 65 2c 20 69 43 6f 6c  pReprepare, iCol
a880: 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  , SQLITE_AFF_NON
a890: 45 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c  E);.    if( pVal
a8a0: 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   && sqlite3_valu
a8b0: 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53 51  e_type(pVal)==SQ
a8c0: 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20  LITE_TEXT ){.   
a8d0: 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29 73     z = (char *)s
a8e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
a8f0: 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  t(pVal);.    }. 
a900: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
a910: 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d  tVarmask(pParse-
a920: 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b 0a 20  >pVdbe, iCol);. 
a930: 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
a940: 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42  t->op==TK_VARIAB
a950: 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70  LE || pRight->op
a960: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  ==TK_REGISTER );
a970: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
a980: 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20  =TK_STRING ){.  
a990: 20 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e    z = pRight->u.
a9a0: 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66  zToken;.  }.  if
a9b0: 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d  ( z ){.    cnt =
a9c0: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   0;.    while( (
a9d0: 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20  c=z[cnt])!=0 && 
a9e0: 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77  c!=wc[0] && c!=w
a9f0: 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d  c[1] && c!=wc[2]
aa00: 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b   ){.      cnt++;
aa10: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
aa20: 6e 74 21 3d 30 20 26 26 20 32 35 35 21 3d 28 75  nt!=0 && 255!=(u
aa30: 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20  8)z[cnt-1] ){.  
aa40: 20 20 20 20 45 78 70 72 20 2a 70 50 72 65 66 69      Expr *pPrefi
aa50: 78 3b 0a 20 20 20 20 20 20 2a 70 69 73 43 6f 6d  x;.      *pisCom
aa60: 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d  plete = c==wc[0]
aa70: 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b   && z[cnt+1]==0;
aa80: 0a 20 20 20 20 20 20 70 50 72 65 66 69 78 20 3d  .      pPrefix =
aa90: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
aaa0: 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a   TK_STRING, z);.
aab0: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 66 69        if( pPrefi
aac0: 78 20 29 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a  x ) pPrefix->u.z
aad0: 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a  Token[cnt] = 0;.
aae0: 20 20 20 20 20 20 2a 70 70 50 72 65 66 69 78 20        *ppPrefix 
aaf0: 3d 20 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20  = pPrefix;.     
ab00: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49   if( op==TK_VARI
ab10: 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ABLE ){.        
ab20: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
ab30: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20 20 20  ->pVdbe;.       
ab40: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
ab50: 61 72 6d 61 73 6b 28 76 2c 20 70 52 69 67 68 74  armask(v, pRight
ab60: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
ab70: 20 20 20 20 69 66 28 20 2a 70 69 73 43 6f 6d 70      if( *pisComp
ab80: 6c 65 74 65 20 26 26 20 70 52 69 67 68 74 2d 3e  lete && pRight->
ab90: 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20  u.zToken[1] ){. 
aba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
abb0: 68 65 20 72 68 73 20 6f 66 20 74 68 65 20 4c 49  he rhs of the LI
abc0: 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  KE expression is
abd0: 20 61 20 76 61 72 69 61 62 6c 65 2c 20 61 6e 64   a variable, and
abe0: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20   the current.   
abf0: 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
ac00: 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  of the variable 
ac10: 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73 20 6e  means there is n
ac20: 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f 6b 65  o need to invoke
ac30: 20 74 68 65 20 4c 49 4b 45 0a 20 20 20 20 20 20   the LIKE.      
ac40: 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c      ** function,
ac50: 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61 72 69   then no OP_Vari
ac60: 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 61 64 64  able will be add
ac70: 65 64 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61  ed to the progra
ac80: 6d 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  m..          ** 
ac90: 54 68 69 73 20 63 61 75 73 65 73 20 70 72 6f 62  This causes prob
aca0: 6c 65 6d 73 20 66 6f 72 20 74 68 65 20 73 71 6c  lems for the sql
acb0: 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
acc0: 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20 20 20  ter_name().     
acd0: 20 20 20 20 20 2a 2a 20 41 50 49 2e 20 54 6f 20       ** API. To 
ace0: 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68 65 6d 2c  workaround them,
acf0: 20 61 64 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f   add a dummy OP_
ad00: 56 61 72 69 61 62 6c 65 20 68 65 72 65 2e 0a 20  Variable here.. 
ad10: 20 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20           */ .   
ad20: 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
ad30: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
ad40: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
ad50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ad60: 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
ad70: 65 2c 20 70 52 69 67 68 74 2c 20 72 31 29 3b 0a  e, pRight, r1);.
ad80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ad90: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
ada0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
adb0: 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 30 29  entAddr(v)-1, 0)
adc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
add0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
ade0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
adf0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ae00: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ae10: 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20    z = 0;.    }. 
ae20: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c   }..  sqlite3Val
ae30: 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20  ueFree(pVal);.  
ae40: 72 65 74 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d  return (z!=0);.}
ae50: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ae60: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
ae70: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69  MIZATION */...#i
ae80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ae90: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
aea0: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
aeb0: 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65  e if the given e
aec0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
aed0: 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20  the form.**.**  
aee0: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41         column MA
aef0: 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49  TCH expr.**.** I
af00: 66 20 69 74 20 69 73 20 74 68 65 6e 20 72 65 74  f it is then ret
af10: 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 6e 6f  urn TRUE.  If no
af20: 74 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e  t, return FALSE.
af30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
af40: 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a  sMatchOfColumn(.
af50: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
af60: 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20     /* Test this 
af70: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
af80: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
af90: 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  st;..  if( pExpr
afa0: 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op!=TK_FUNCTIO
afb0: 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
afc0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
afd0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70  ite3StrICmp(pExp
afe0: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74  r->u.zToken,"mat
aff0: 63 68 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ch")!=0 ){.    r
b000: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
b010: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
b020: 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69  pList;.  if( pLi
b030: 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a  st->nExpr!=2 ){.
b040: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
b050: 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61  }.  if( pList->a
b060: 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d  [1].pExpr->op !=
b070: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20   TK_COLUMN ){.  
b080: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
b090: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
b0a0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
b0b0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
b0c0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68   */../*.** If th
b0d0: 65 20 70 42 61 73 65 20 65 78 70 72 65 73 73 69  e pBase expressi
b0e0: 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e  on originated in
b0f0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
b100: 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20   clause of.** a 
b110: 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73  join, then trans
b120: 66 65 72 20 74 68 65 20 61 70 70 72 6f 70 72 69  fer the appropri
b130: 61 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65  ate markings ove
b140: 72 20 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f  r to derived..*/
b150: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 61  .static void tra
b160: 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67  nsferJoinMarking
b170: 73 28 45 78 70 72 20 2a 70 44 65 72 69 76 65 64  s(Expr *pDerived
b180: 2c 20 45 78 70 72 20 2a 70 42 61 73 65 29 7b 0a  , Expr *pBase){.
b190: 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c 61 67    pDerived->flag
b1a0: 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61 67  s |= pBase->flag
b1b0: 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b  s & EP_FromJoin;
b1c0: 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 69 52 69  .  pDerived->iRi
b1d0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70  ghtJoinTable = p
b1e0: 42 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Base->iRightJoin
b1f0: 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21 64  Table;.}..#if !d
b200: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
b210: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
b220: 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ON) && !defined(
b230: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
b240: 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  UERY)./*.** Anal
b250: 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20  yze a term that 
b260: 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20  consists of two 
b270: 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65  or more OR-conne
b280: 63 74 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73  cted.** subterms
b290: 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20  .  So in:.**.** 
b2a0: 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20 20 28      ... WHERE  (
b2b0: 61 3d 35 29 20 41 4e 44 20 28 62 3d 37 20 4f 52  a=5) AND (b=7 OR
b2c0: 20 63 3d 39 20 4f 52 20 64 3d 31 33 29 20 41 4e   c=9 OR d=13) AN
b2d0: 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20  D (d=13).**     
b2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2f0: 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e       ^^^^^^^^^^^
b300: 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20  ^^^^^^^^^.**.** 
b310: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61  This routine ana
b320: 6c 79 7a 65 73 20 74 65 72 6d 73 20 73 75 63 68  lyzes terms such
b330: 20 61 73 20 74 68 65 20 6d 69 64 64 6c 65 20 74   as the middle t
b340: 65 72 6d 20 69 6e 20 74 68 65 20 61 62 6f 76 65  erm in the above
b350: 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57   example..** A W
b360: 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63  hereOrTerm objec
b370: 74 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e  t is computed an
b380: 64 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  d attached to th
b390: 65 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20  e term under.** 
b3a0: 61 6e 61 6c 79 73 69 73 2c 20 72 65 67 61 72 64  analysis, regard
b3b0: 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63  less of the outc
b3c0: 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e 61 6c 79  ome of the analy
b3d0: 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a  sis.  Hence:.**.
b3e0: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
b3f0: 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d 20 20 54  .wtFlags   |=  T
b400: 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20  ERM_ORINFO.**   
b410: 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f    WhereTerm.u.pO
b420: 72 49 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e 61  rInfo  =  a dyna
b430: 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
b440: 64 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62  d WhereOrTerm ob
b450: 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ject.**.** The t
b460: 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  erm being analyz
b470: 65 64 20 6d 75 73 74 20 68 61 76 65 20 74 77 6f  ed must have two
b480: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63   or more of OR-c
b490: 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65 72 6d  onnected subterm
b4a0: 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73  s..** A single s
b4b0: 75 62 74 65 72 6d 20 6d 69 67 68 74 20 62 65 20  ubterm might be 
b4c0: 61 20 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e  a set of AND-con
b4d0: 6e 65 63 74 65 64 20 73 75 62 2d 73 75 62 74 65  nected sub-subte
b4e0: 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73  rms..** Examples
b4f0: 20 6f 66 20 74 65 72 6d 73 20 75 6e 64 65 72 20   of terms under 
b500: 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20  analysis:.**.** 
b510: 20 20 20 20 28 41 29 20 20 20 20 20 74 31 2e 78      (A)     t1.x
b520: 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32  =t2.y OR t1.x=t2
b530: 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52  .z OR t1.y=15 OR
b540: 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20   t1.z=t3.a+5.** 
b550: 20 20 20 20 28 42 29 20 20 20 20 20 78 3d 65 78      (B)     x=ex
b560: 70 72 31 20 4f 52 20 65 78 70 72 32 3d 78 20 4f  pr1 OR expr2=x O
b570: 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20  R x=expr3.**    
b580: 20 28 43 29 20 20 20 20 20 74 31 2e 78 3d 74 32   (C)     t1.x=t2
b590: 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a  .y OR (t1.x=t2.z
b5a0: 20 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a   AND t1.y=15).**
b5b0: 20 20 20 20 20 28 44 29 20 20 20 20 20 78 3d 65       (D)     x=e
b5c0: 78 70 72 31 20 4f 52 20 28 79 3e 31 31 20 41 4e  xpr1 OR (y>11 AN
b5d0: 44 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b  D y<22 AND z LIK
b5e0: 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20  E '*hello*').** 
b5f0: 20 20 20 20 28 45 29 20 20 20 20 20 28 70 2e 61      (E)     (p.a
b600: 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44  =1 AND q.b=2 AND
b610: 20 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d   r.c=3) OR (p.x=
b620: 34 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20  4 AND q.y=5 AND 
b630: 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53  r.z=6).**.** CAS
b640: 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  E 1:.**.** If al
b650: 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 6f  l subterms are o
b660: 66 20 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65  f the form T.C=e
b670: 78 70 72 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e  xpr for some sin
b680: 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20  gle column of C 
b690: 61 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  and.** a single 
b6a0: 74 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f 77  table T (as show
b6b0: 6e 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20 61  n in example B a
b6c0: 62 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61 74  bove) then creat
b6d0: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a  e a new virtual.
b6e0: 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  ** term that is 
b6f0: 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49 4e  an equivalent IN
b700: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e   expression.  In
b710: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
b720: 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69   the term.** bei
b730: 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a  ng analyzed is:.
b740: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20 65  **.**      x = e
b750: 78 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20  xpr1  OR  expr2 
b760: 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70  = x  OR  x = exp
b770: 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72  r3.**.** then cr
b780: 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75  eate a new virtu
b790: 61 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68 69  al term like thi
b7a0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20  s:.**.**      x 
b7b0: 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c  IN (expr1,expr2,
b7c0: 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53  expr3).**.** CAS
b7d0: 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  E 2:.**.** If al
b7e0: 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 69  l subterms are i
b7f0: 6e 64 65 78 61 62 6c 65 20 62 79 20 61 20 73 69  ndexable by a si
b800: 6e 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74 68  ngle table T, th
b810: 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20  en set.**.**    
b820: 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72   WhereTerm.eOper
b830: 61 74 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  ator            
b840: 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20    =  WO_OR.**   
b850: 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f    WhereTerm.u.pO
b860: 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
b870: 20 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f 72    |=  the cursor
b880: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c   number for tabl
b890: 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74  e T.**.** A subt
b8a0: 65 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62 6c  erm is "indexabl
b8b0: 65 22 20 69 66 20 69 74 20 69 73 20 6f 66 20 74  e" if it is of t
b8c0: 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20  he form.** "T.C 
b8d0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65  <op> <expr>" whe
b8e0: 72 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c 75  re C is any colu
b8f0: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61 6e  mn of table T an
b900: 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e  d .** <op> is on
b910: 65 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22  e of "=", "<", "
b920: 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20  <=", ">", ">=", 
b930: 22 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49  "IS NULL", or "I
b940: 4e 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  N"..** A subterm
b950: 20 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62   is also indexab
b960: 6c 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 41  le if it is an A
b970: 4e 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ND of two or mor
b980: 65 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d 73  e.** subsubterms
b990: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   at least one of
b9a0: 20 77 68 69 63 68 20 69 73 20 69 6e 64 65 78 61   which is indexa
b9b0: 62 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65 20  ble.  Indexable 
b9c0: 41 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73  AND .** subterms
b9d0: 20 68 61 76 65 20 74 68 65 69 72 20 65 4f 70 65   have their eOpe
b9e0: 72 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f  rator set to WO_
b9f0: 41 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61 76  AND and they hav
ba00: 65 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20  e.** u.pAndInfo 
ba10: 73 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63  set to a dynamic
ba20: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57  ally allocated W
ba30: 68 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65  hereAndTerm obje
ba40: 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61  ct..**.** From a
ba50: 6e 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66 20  nother point of 
ba60: 76 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c 65  view, "indexable
ba70: 22 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  " means that the
ba80: 20 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a   subterm could.*
ba90: 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65  * potentially be
baa0: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
bab0: 64 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f 70  dex if an approp
bac0: 72 69 61 74 65 20 69 6e 64 65 78 20 65 78 69 73  riate index exis
bad0: 74 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c  ts..** This anal
bae0: 79 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ysis does not co
baf0: 6e 73 69 64 65 72 20 77 68 65 74 68 65 72 20 6f  nsider whether o
bb00: 72 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78 20  r not the index 
bb10: 65 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20  exists; that.** 
bb20: 69 73 20 64 65 63 69 64 65 64 20 65 6c 73 65 77  is decided elsew
bb30: 68 65 72 65 2e 20 20 54 68 69 73 20 61 6e 61 6c  here.  This anal
bb40: 79 73 69 73 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20  ysis only looks 
bb50: 61 74 20 77 68 65 74 68 65 72 20 73 75 62 74 65  at whether subte
bb60: 72 6d 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61  rms.** appropria
bb70: 74 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20  te for indexing 
bb80: 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  exist..**.** All
bb90: 20 65 78 61 6d 70 6c 65 73 20 41 20 74 68 72 6f   examples A thro
bba0: 75 67 68 20 45 20 61 62 6f 76 65 20 73 61 74 69  ugh E above sati
bbb0: 73 66 79 20 63 61 73 65 20 32 2e 20 20 42 75 74  sfy case 2.  But
bbc0: 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c   if a term.** al
bbd0: 73 6f 20 73 74 61 74 69 73 66 69 65 73 20 63 61  so statisfies ca
bbe0: 73 65 20 31 20 28 73 75 63 68 20 61 73 20 42 29  se 1 (such as B)
bbf0: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
bc00: 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c  e optimizer will
bc10: 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66 65  .** always prefe
bc20: 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e 20  r case 1, so in 
bc30: 74 68 61 74 20 63 61 73 65 20 77 65 20 70 72 65  that case we pre
bc40: 74 65 6e 64 20 74 68 61 74 20 63 61 73 65 20 32  tend that case 2
bc50: 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73   is not.** satis
bc60: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d  fied..**.** It m
bc70: 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
bc80: 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 74   that multiple t
bc90: 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78 61  ables are indexa
bca0: 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ble.  For exampl
bcb0: 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65 20  e,.** (E) above 
bcc0: 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20  is indexable on 
bcd0: 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64  tables P, Q, and
bce0: 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20   R..**.** Terms 
bcf0: 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73  that satisfy cas
bd00: 65 20 32 20 61 72 65 20 63 61 6e 64 69 64 61 74  e 2 are candidat
bd10: 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79  es for lookup by
bd20: 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61   using.** separa
bd30: 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66 69  te indices to fi
bd40: 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65 61  nd rowids for ea
bd50: 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20 63  ch subterm and c
bd60: 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20  omposing.** the 
bd70: 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77  union of all row
bd80: 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77 53  ids using a RowS
bd90: 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  et object.  This
bda0: 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74   is similar.** t
bdb0: 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63 65  o "bitmap indice
bdc0: 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74 61  s" in other data
bdd0: 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a  base engines..**
bde0: 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a  .** OTHERWISE:.*
bdf0: 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20  *.** If neither 
be00: 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73 65 20  case 1 nor case 
be10: 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65  2 apply, then le
be20: 61 76 65 20 74 68 65 20 65 4f 70 65 72 61 74 6f  ave the eOperato
be30: 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f  r set to.** zero
be40: 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69 73 20  .  This term is 
be50: 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20 73  not useful for s
be60: 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  earch..*/.static
be70: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
be80: 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c 69  eOrTerm(.  SrcLi
be90: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
bea0: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
beb0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
bec0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
bed0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63 6f         /* the co
bee0: 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61  mplete WHERE cla
bef0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
bf00: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
bf10: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
bf20: 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65  he OR-term to be
bf30: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
bf40: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
bf50: 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
bf60: 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45  o;        /* WHE
bf70: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
bf80: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
bf90: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
bfa0: 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
bfb0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ;         /* Par
bfc0: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
bfd0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
bfe0: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
bff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
c000: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
c010: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
c020: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
c030: 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20  idxTerm];    /* 
c040: 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  The term to be a
c050: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70  nalyzed */.  Exp
c060: 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
c070: 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20 20  ->pExpr;        
c080: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
c090: 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74 65  ession of the te
c0a0: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  rm */.  int i;  
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0d0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
c0e0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
c0f0: 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20 20  e *pOrWc;       
c100: 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70 54  /* Breakup of pT
c110: 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  erm into subterm
c120: 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  s */.  WhereTerm
c130: 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20 20   *pOrTerm;      
c140: 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20 77   /* A Sub-term w
c150: 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63 20  ithin the pOrWc 
c160: 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66 6f  */.  WhereOrInfo
c170: 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f   *pOrInfo;     /
c180: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  * Additional inf
c190: 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69 61  ormation associa
c1a0: 74 65 64 20 77 69 74 68 20 70 54 65 72 6d 20 2a  ted with pTerm *
c1b0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e 67  /.  Bitmask chng
c1c0: 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a  ToIN;         /*
c1d0: 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67   Tables that mig
c1e0: 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ht satisfy case 
c1f0: 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  1 */.  Bitmask i
c200: 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20  ndexable;       
c210: 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20   /* Tables that 
c220: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20 73  are indexable, s
c230: 61 74 69 73 66 79 69 6e 67 20 63 61 73 65 20 32  atisfying case 2
c240: 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42   */..  /*.  ** B
c250: 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61 75  reak the OR clau
c260: 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70 61  se into its sepa
c270: 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20 20  rate subterms.  
c280: 54 68 65 20 73 75 62 74 65 72 6d 73 20 61 72 65  The subterms are
c290: 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  .  ** stored in 
c2a0: 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  a WhereClause st
c2b0: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69  ructure containi
c2c0: 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20 57 68  ng within the Wh
c2d0: 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f  ereOrInfo.  ** o
c2e0: 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 61 74  bject that is at
c2f0: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f 72  tached to the or
c300: 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65  iginal OR clause
c310: 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73   term..  */.  as
c320: 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74  sert( (pTerm->wt
c330: 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44 59  Flags & (TERM_DY
c340: 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46  NAMIC|TERM_ORINF
c350: 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29  O|TERM_ANDINFO))
c360: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
c370: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f   pExpr->op==TK_O
c380: 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e  R );.  pTerm->u.
c390: 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66  pOrInfo = pOrInf
c3a0: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
c3b0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
c3c0: 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20  of(*pOrInfo));. 
c3d0: 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20   if( pOrInfo==0 
c3e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65 72  ) return;.  pTer
c3f0: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
c400: 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72  RM_ORINFO;.  pOr
c410: 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77  Wc = &pOrInfo->w
c420: 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  c;.  whereClause
c430: 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57 49 6e  Init(pOrWc, pWIn
c440: 66 6f 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69  fo);.  whereSpli
c450: 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c 20  t(pOrWc, pExpr, 
c460: 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e  TK_OR);.  exprAn
c470: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70  alyzeAll(pSrc, p
c480: 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64 62 2d  OrWc);.  if( db-
c490: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
c4a0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
c4b0: 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d  ( pOrWc->nTerm>=
c4c0: 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  2 );..  /*.  ** 
c4d0: 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65 74 20  Compute the set 
c4e0: 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d  of tables that m
c4f0: 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73  ight satisfy cas
c500: 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a  es 1 or 2..  */.
c510: 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28    indexable = ~(
c520: 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e  Bitmask)0;.  chn
c530: 67 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73  gToIN = ~(Bitmas
c540: 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72  k)0;.  for(i=pOr
c550: 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72  Wc->nTerm-1, pOr
c560: 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69  Term=pOrWc->a; i
c570: 3e 3d 30 20 26 26 20 69 6e 64 65 78 61 62 6c 65  >=0 && indexable
c580: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
c590: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4f 72 54  ){.    if( (pOrT
c5a0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
c5b0: 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29   WO_SINGLE)==0 )
c5c0: 7b 0a 20 20 20 20 20 20 57 68 65 72 65 41 6e 64  {.      WhereAnd
c5d0: 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a  Info *pAndInfo;.
c5e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
c5f0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
c600: 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c  & (TERM_ANDINFO|
c610: 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30  TERM_ORINFO))==0
c620: 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f   );.      chngTo
c630: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41  IN = 0;.      pA
c640: 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  ndInfo = sqlite3
c650: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
c660: 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f  sizeof(*pAndInfo
c670: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  ));.      if( pA
c680: 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  ndInfo ){.      
c690: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
c6a0: 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57  AndWC;.        W
c6b0: 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65  hereTerm *pAndTe
c6c0: 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rm;.        int 
c6d0: 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  j;.        Bitma
c6e0: 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  sk b = 0;.      
c6f0: 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e    pOrTerm->u.pAn
c700: 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f  dInfo = pAndInfo
c710: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
c720: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
c730: 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20  RM_ANDINFO;.    
c740: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70      pOrTerm->eOp
c750: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b  erator = WO_AND;
c760: 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20  .        pAndWC 
c770: 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  = &pAndInfo->wc;
c780: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c  .        whereCl
c790: 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c  auseInit(pAndWC,
c7a0: 20 70 57 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20   pWC->pWInfo);. 
c7b0: 20 20 20 20 20 20 20 77 68 65 72 65 53 70 6c 69         whereSpli
c7c0: 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 72  t(pAndWC, pOrTer
c7d0: 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44  m->pExpr, TK_AND
c7e0: 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41  );.        exprA
c7f0: 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20  nalyzeAll(pSrc, 
c800: 70 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20 20  pAndWC);.       
c810: 20 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20   pAndWC->pOuter 
c820: 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 74  = pWC;.        t
c830: 65 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c  estcase( db->mal
c840: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
c850: 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61       if( !db->ma
c860: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
c870: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c          for(j=0,
c880: 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43   pAndTerm=pAndWC
c890: 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e  ->a; j<pAndWC->n
c8a0: 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54  Term; j++, pAndT
c8b0: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
c8c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 41 6e 64      assert( pAnd
c8d0: 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Term->pExpr );. 
c8e0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
c8f0: 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72  llowedOp(pAndTer
c900: 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b  m->pExpr->op) ){
c910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
c920: 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49   |= getMask(&pWI
c930: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
c940: 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  AndTerm->leftCur
c950: 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sor);.          
c960: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
c970: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c980: 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62    indexable &= b
c990: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
c9a0: 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
c9b0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
c9c0: 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20 20 20  COPIED ){.      
c9d0: 2f 2a 20 53 6b 69 70 20 74 68 69 73 20 74 65 72  /* Skip this ter
c9e0: 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72  m for now.  We r
c9f0: 65 76 69 73 69 74 20 69 74 20 77 68 65 6e 20 77  evisit it when w
ca00: 65 20 70 72 6f 63 65 73 73 20 74 68 65 0a 20 20  e process the.  
ca10: 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e      ** correspon
ca20: 64 69 6e 67 20 54 45 52 4d 5f 56 49 52 54 55 41  ding TERM_VIRTUA
ca30: 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65  L term */.    }e
ca40: 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  lse{.      Bitma
ca50: 73 6b 20 62 3b 0a 20 20 20 20 20 20 62 20 3d 20  sk b;.      b = 
ca60: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
ca70: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65  >sMaskSet, pOrTe
ca80: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b  rm->leftCursor);
ca90: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
caa0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
cab0: 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20 20  RM_VIRTUAL ){.  
cac0: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
cad0: 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f 72 57 63  *pOther = &pOrWc
cae0: 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61  ->a[pOrTerm->iPa
caf0: 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20 62  rent];.        b
cb00: 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49   |= getMask(&pWI
cb10: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
cb20: 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f  Other->leftCurso
cb30: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
cb40: 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62    indexable &= b
cb50: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f 72  ;.      if( (pOr
cb60: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
cb70: 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20  & WO_EQ)==0 ){. 
cb80: 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20         chngToIN 
cb90: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
cba0: 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f  {.        chngTo
cbb0: 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d  IN &= b;.      }
cbc0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
cbd0: 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  .  ** Record the
cbe0: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
cbf0: 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65  hat satisfy case
cc00: 20 32 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67   2.  The set mig
cc10: 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79  ht be.  ** empty
cc20: 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f  ..  */.  pOrInfo
cc30: 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e  ->indexable = in
cc40: 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d  dexable;.  pTerm
cc50: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e  ->eOperator = in
cc60: 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a  dexable==0 ? 0 :
cc70: 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20   WO_OR;..  /*.  
cc80: 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64  ** chngToIN hold
cc90: 73 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65  s a set of table
cca0: 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73  s that *might* s
ccb0: 61 74 69 73 66 79 20 63 61 73 65 20 31 2e 20 20  atisfy case 1.  
ccc0: 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65  But.  ** we have
ccd0: 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69   to do some addi
cce0: 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20  tional checking 
ccf0: 74 6f 20 73 65 65 20 69 66 20 63 61 73 65 20 31  to see if case 1
cd00: 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20   really.  ** is 
cd10: 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a  satisfied..  **.
cd20: 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69    ** chngToIN wi
cd30: 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72 20 30  ll hold either 0
cd40: 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73 2e 20  , 1, or 2 bits. 
cd50: 20 54 68 65 20 30 2d 62 69 74 20 63 61 73 65 20   The 0-bit case 
cd60: 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
cd70: 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 73  there is no poss
cd80: 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61 6e 73  ibility of trans
cd90: 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52 20 63  forming the OR c
cda0: 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20  lause into an.  
cdb0: 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 62  ** IN operator b
cdc0: 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f  ecause one or mo
cdd0: 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  re terms in the 
cde0: 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  OR clause contai
cdf0: 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67  n.  ** something
ce00: 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f   other than == o
ce10: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  n a column in th
ce20: 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20  e single table. 
ce30: 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20   The 1-bit.  ** 
ce40: 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61 74 20  case means that 
ce50: 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  every term of th
ce60: 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73 20 6f  e OR clause is o
ce70: 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20  f the form.  ** 
ce80: 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78  "table.column=ex
ce90: 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e  pr" for some sin
cea0: 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  gle table.  The 
ceb0: 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69 73 20  one bit that is 
cec0: 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f  set.  ** will co
ced0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20  rrespond to the 
cee0: 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57  common table.  W
cef0: 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
cf00: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20  check to make.  
cf10: 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61 6d 65  ** sure the same
cf20: 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20   column is used 
cf30: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54  on all terms.  T
cf40: 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 69 73  he 2-bit case is
cf50: 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61   when.  ** the a
cf60: 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f 66 20  ll terms are of 
cf70: 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 31  the form "table1
cf80: 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63  .column=table2.c
cf90: 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a  olumn".  It.  **
cfa0: 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69 62   might be possib
cfb0: 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e  le to form an IN
cfc0: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 65   operator with e
cfd0: 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c  ither table1.col
cfe0: 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c  umn.  ** or tabl
cff0: 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  e2.column as the
d000: 20 4c 48 53 20 69 66 20 65 69 74 68 65 72 20 69   LHS if either i
d010: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72  s common to ever
d020: 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74  y term of.  ** t
d030: 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20  he OR clause..  
d040: 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
d050: 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  t terms of the f
d060: 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d  orm "table.colum
d070: 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32  n1=table.column2
d080: 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  " (the.  ** same
d090: 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73   table on both s
d0a0: 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d 29 20  izes of the ==) 
d0b0: 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69  cannot be optimi
d0c0: 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  zed..  */.  if( 
d0d0: 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20  chngToIN ){.    
d0e0: 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  int okToChngToIN
d0f0: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75   = 0;     /* Tru
d100: 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73  e if the convers
d110: 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61 6c  ion to IN is val
d120: 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  id */.    int iC
d130: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20  olumn = -1;     
d140: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e      /* Column in
d150: 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e  dex on lhs of IN
d160: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
d170: 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20 2d   int iCursor = -
d180: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  1;         /* Ta
d190: 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f  ble cursor commo
d1a0: 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a  n to all terms *
d1b0: 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b  /.    int j = 0;
d1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1d0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
d1e0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63  */..    /* Searc
d1f0: 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61 6e  h for a table an
d200: 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70  d column that ap
d210: 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64  pears on one sid
d220: 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  e or the.    ** 
d230: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d 20  other of the == 
d240: 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65 72  operator in ever
d250: 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61 74  y subterm.  That
d260: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
d270: 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65  n.    ** will be
d280: 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43 75   recorded in iCu
d290: 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e  rsor and iColumn
d2a0: 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74 20 6e  .  There might n
d2b0: 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a  ot be any.    **
d2c0: 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64 20   such table and 
d2d0: 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54  column.  Set okT
d2e0: 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20  oChngToIN if an 
d2f0: 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 62 6c  appropriate tabl
d300: 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c  e.    ** and col
d310: 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75 74  umn is found but
d320: 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54   leave okToChngT
d330: 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  oIN false if not
d340: 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20   found..    */. 
d350: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20     for(j=0; j<2 
d360: 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  && !okToChngToIN
d370: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f  ; j++){.      pO
d380: 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61  rTerm = pOrWc->a
d390: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f  ;.      for(i=pO
d3a0: 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e  rWc->nTerm-1; i>
d3b0: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  =0; i--, pOrTerm
d3c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
d3d0: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
d3e0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
d3f0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  );.        pOrTe
d400: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e  rm->wtFlags &= ~
d410: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20  TERM_OR_OK;.    
d420: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
d430: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
d440: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
d450: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
d460: 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64 20   2-bit case and 
d470: 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73 65  we are on the se
d480: 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 61  cond iteration a
d490: 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
d4a0: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20  current term is 
d4b0: 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 69  from the first i
d4c0: 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b  teration.  So sk
d4d0: 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f  ip this term. */
d4e0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
d4f0: 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20  t( j==1 );.     
d500: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
d510: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d520: 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20 26   if( (chngToIN &
d530: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
d540: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54  ->sMaskSet, pOrT
d550: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
d560: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
d570: 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 6d    /* This term m
d580: 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f  ust be of the fo
d590: 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68  rm t1.a==t2.b wh
d5a0: 65 72 65 20 74 32 20 69 73 20 69 6e 20 74 68 65  ere t2 is in the
d5b0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68  .          ** ch
d5c0: 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20 74  ngToIN set but t
d5d0: 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73 20  1 is not.  This 
d5e0: 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69 74  term will be eit
d5f0: 68 65 72 20 70 72 65 63 65 65 64 65 64 0a 20 20  her preceeded.  
d600: 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f          ** or fo
d610: 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76 65  llwed by an inve
d620: 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62 3d  rted copy (t2.b=
d630: 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74 68  =t1.a).  Skip th
d640: 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20 20  is term .       
d650: 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69 74     ** and use it
d660: 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a  s inversion. */.
d670: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
d680: 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  se( pOrTerm->wtF
d690: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
d6a0: 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ED );.          
d6b0: 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72  testcase( pOrTer
d6c0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
d6d0: 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
d6e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
d6f0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
d700: 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54  & (TERM_COPIED|T
d710: 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a  ERM_VIRTUAL) );.
d720: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
d730: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
d740: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
d750: 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  pOrTerm->u.leftC
d760: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69  olumn;.        i
d770: 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d  Cursor = pOrTerm
d780: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20  ->leftCursor;.  
d790: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d7a0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
d7b0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <0 ){.        /*
d7c0: 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74 61   No candidate ta
d7d0: 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66  ble+column was f
d7e0: 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e 20  ound.  This can 
d7f0: 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20 20  only occur.     
d800: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63     ** on the sec
d810: 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f  ond iteration */
d820: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d830: 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20   j==1 );.       
d840: 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72   assert( IsPower
d850: 4f 66 54 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20  OfTwo(chngToIN) 
d860: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
d870: 74 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74  t( chngToIN==get
d880: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
d890: 61 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72 29  askSet, iCursor)
d8a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
d8b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
d8c0: 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31 20   testcase( j==1 
d8d0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  );..      /* We 
d8e0: 68 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61 6e  have found a can
d8f0: 64 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e 64  didate table and
d900: 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20   column.  Check 
d910: 74 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a 20  to see if that. 
d920: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e       ** table an
d930: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d  d column is comm
d940: 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  on to every term
d950: 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73   in the OR claus
d960: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43  e */.      okToC
d970: 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20  hngToIN = 1;.   
d980: 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26     for(; i>=0 &&
d990: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69   okToChngToIN; i
d9a0: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
d9b0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d9c0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
d9d0: 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
d9e0: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
d9f0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  m->leftCursor!=i
da00: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
da10: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
da20: 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52  lags &= ~TERM_OR
da30: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _OK;.        }el
da40: 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
da50: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43  u.leftColumn!=iC
da60: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
da70: 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20     okToChngToIN 
da80: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
da90: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
daa0: 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69  t affLeft, affRi
dab0: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  ght;.          /
dac0: 2a 20 49 66 20 74 68 65 20 72 69 67 68 74 2d 68  * If the right-h
dad0: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f  and side is also
dae0: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
daf0: 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a 20  the affinities. 
db00: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 62           ** of b
db10: 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65  oth right and le
db20: 66 74 20 73 69 64 65 73 20 6d 75 73 74 20 62 65  ft sides must be
db30: 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79   such that no ty
db40: 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  pe.          ** 
db50: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20  conversions are 
db60: 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  required on the 
db70: 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20  right.  (Ticket 
db80: 23 32 32 34 39 29 0a 20 20 20 20 20 20 20 20 20  #2249).         
db90: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 66   */.          af
dba0: 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  fRight = sqlite3
dbb0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72  ExprAffinity(pOr
dbc0: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
dbd0: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
dbe0: 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  affLeft = 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 4c  rTerm->pExpr->pL
dc10: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eft);.          
dc20: 69 66 28 20 61 66 66 52 69 67 68 74 21 3d 30 20  if( affRight!=0 
dc30: 26 26 20 61 66 66 52 69 67 68 74 21 3d 61 66 66  && affRight!=aff
dc40: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
dc50: 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e      okToChngToIN
dc60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
dc70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
dc80: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c     pOrTerm->wtFl
dc90: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f  ags |= TERM_OR_O
dca0: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
dcb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
dcc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
dcd0: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b  t this point, ok
dce0: 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74 72  ToChngToIN is tr
dcf0: 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20 70  ue if original p
dd00: 54 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a 20  Term satisfies. 
dd10: 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20 49     ** case 1.  I
dd20: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f 6e  n that case, con
dd30: 73 74 72 75 63 74 20 61 20 6e 65 77 20 76 69 72  struct a new vir
dd40: 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20 69  tual term that i
dd50: 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d 20  s .    ** pTerm 
dd60: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
dd70: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n IN operator.. 
dd80: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b     */.    if( ok
dd90: 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20  ToChngToIN ){.  
dda0: 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20      Expr *pDup; 
ddb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
ddc0: 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69 63  transient duplic
ddd0: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  ate expression *
dde0: 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
ddf0: 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f   *pList = 0;   /
de00: 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74 68 65  * The RHS of the
de10: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
de20: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
de30: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  t = 0;       /* 
de40: 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  The LHS of the I
de50: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
de60: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20      Expr *pNew; 
de70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
de80: 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70  e complete IN op
de90: 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20  erator */..     
dea0: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
deb0: 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70  erm-1, pOrTerm=p
dec0: 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69  OrWc->a; i>=0; i
ded0: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
dee0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72          if( (pOr
def0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
df00: 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29  TERM_OR_OK)==0 )
df10: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
df20: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
df30: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
df40: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
df50: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
df60: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
df70: 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 20  ursor );.       
df80: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
df90: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d  ->u.leftColumn==
dfa0: 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  iColumn );.     
dfb0: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
dfc0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 72  3ExprDup(db, pOr
dfd0: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
dfe0: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
dff0: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
e000: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
e010: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
e020: 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20  List, pDup);.   
e030: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72       pLeft = pOr
e040: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  Term->pExpr->pLe
e050: 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ft;.      }.    
e060: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21    assert( pLeft!
e070: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70  =0 );.      pDup
e080: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
e090: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b  p(db, pLeft, 0);
e0a0: 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
e0b0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
e0c0: 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20  e, TK_IN, pDup, 
e0d0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
e0e0: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
e0f0: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
e100: 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69       transferJoi
e110: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20  nMarkings(pNew, 
e120: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
e130: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
e140: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
e150: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
e160: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
e170: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
e180: 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20         idxNew = 
e190: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
e1a0: 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52  t(pWC, pNew, TER
e1b0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
e1c0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
e1d0: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
e1e0: 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  w==0 );.        
e1f0: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
e200: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a  , pWC, idxNew);.
e210: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
e220: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
e230: 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61  ;.        pWC->a
e240: 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74  [idxNew].iParent
e250: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
e260: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
e270: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  d = 1;.      }el
e280: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
e290: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
e2a0: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
e2b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72      }.      pTer
e2c0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
e2d0: 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65  O_NOOP;  /* case
e2e0: 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32   1 trumps case 2
e2f0: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   */.    }.  }.}.
e300: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
e310: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
e320: 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54  ZATION && !SQLIT
e330: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
e340: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e  */../*.** The in
e350: 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
e360: 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54  ine is an WhereT
e370: 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69  erm structure wi
e380: 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22  th only the.** "
e390: 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c  pExpr" field fil
e3a0: 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62  led in.  The job
e3b0: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
e3c0: 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74   is to analyze t
e3d0: 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73  he.** subexpress
e3e0: 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ion and populate
e3f0: 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66   all the other f
e400: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65  ields of the Whe
e410: 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74  reTerm.** struct
e420: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
e430: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
e440: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78  of the form "<ex
e450: 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67  pr> <op> X" it g
e460: 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20  ets commuted.** 
e470: 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  to the standard 
e480: 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20  form of "X <op> 
e490: 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49  <expr>"..**.** I
e4a0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e4b0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
e4c0: 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65  "X <op> Y" where
e4d0: 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72   both X and Y ar
e4e0: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  e.** columns, th
e4f0: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
e500: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e  expression is un
e510: 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65  changed and a ne
e520: 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72  w virtual.** ter
e530: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59  m of the form "Y
e540: 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65   <op> X" is adde
e550: 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  d to the WHERE c
e560: 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61  lause and.** ana
e570: 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79  lyzed separately
e580: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  .  The original 
e590: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
e5a0: 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a  ith TERM_COPIED.
e5b0: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74  ** and the new t
e5c0: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
e5d0: 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20  th TERM_DYNAMIC 
e5e0: 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45  (because it's pE
e5f0: 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  xpr.** needs to 
e600: 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68  be freed with th
e610: 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61  e WhereClause) a
e620: 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20  nd TERM_VIRTUAL 
e630: 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69  (because it.** i
e640: 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70  s a commuted cop
e650: 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72  y of a prior ter
e660: 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61  m.)  The origina
e670: 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c  l term has nChil
e680: 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  d=1.** and the c
e690: 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e  opy has idxParen
e6a0: 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  t set to the ind
e6b0: 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ex of the origin
e6c0: 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74  al term..*/.stat
e6d0: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
e6e0: 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  yze(.  SrcList *
e6f0: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
e700: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
e710: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
e720: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
e730: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
e740: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
e750: 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20  idxTerm         
e760: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
e770: 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65  f the term to be
e780: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
e790: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
e7a0: 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
e7b0: 6f 3b 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75  o; /* WHERE clau
e7c0: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f  se processing co
e7d0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
e7e0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
e7f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e800: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
e810: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alyzed */.  Wher
e820: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
e830: 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
e840: 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64  Set of table ind
e850: 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78  ex masks */.  Ex
e860: 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20  pr *pExpr;      
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e880: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
e890: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
e8a0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
e8b0: 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20  reqLeft;        
e8c0: 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75        /* Prerequ
e8d0: 65 73 69 74 65 73 20 6f 66 20 74 68 65 20 70 45  esites of the pE
e8e0: 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20  xpr->pLeft */.  
e8f0: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c  Bitmask prereqAl
e900: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
e910: 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65   /* Prerequesite
e920: 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20  s of pExpr */.  
e930: 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67  Bitmask extraRig
e940: 68 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ht = 0;         
e950: 20 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64   /* Extra depend
e960: 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a  encies on LEFT J
e970: 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  OIN */.  Expr *p
e980: 53 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20  Str1 = 0;       
e990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53            /* RHS
e9a0: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70   of LIKE/GLOB op
e9b0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
e9c0: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20  isComplete = 0; 
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e9e0: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
e9f0: 20 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63   ends with wildc
ea00: 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ard */.  int noC
ea10: 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ase = 0;        
ea20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b            /* LIK
ea30: 45 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69  E/GLOB distingui
ea40: 73 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69  shes case */.  i
ea50: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
ea60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea70: 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65  /* Top-level ope
ea80: 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f  rator.  pExpr->o
ea90: 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  p */.  Parse *pP
eaa0: 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
eab0: 50 61 72 73 65 3b 20 20 2f 2a 20 50 61 72 73 69  Parse;  /* Parsi
eac0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
ead0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
eae0: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
eaf0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
eb00: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66  nection */..  if
eb10: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
eb20: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
eb30: 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20  ;.  }.  pTerm = 
eb40: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
eb50: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26  ;.  pMaskSet = &
eb60: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
eb70: 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72  ;.  pExpr = pTer
eb80: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  m->pExpr;.  asse
eb90: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
eba0: 4b 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f  K_AS && pExpr->o
ebb0: 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p!=TK_COLLATE );
ebc0: 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20  .  prereqLeft = 
ebd0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
ebe0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
ebf0: 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70  pLeft);.  op = p
ec00: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
ec10: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20  op==TK_IN ){.   
ec20: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
ec30: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
ec40: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
ec50: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
ec60: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
ec70: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
ec80: 52 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65  Right = exprSele
ec90: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
eca0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e  skSet, pExpr->x.
ecb0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
ecc0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  lse{.      pTerm
ecd0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
ece0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
ecf0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
ed00: 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
ed10: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
ed20: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
ed30: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  .    pTerm->prer
ed40: 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d  eqRight = 0;.  }
ed50: 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d  else{.    pTerm-
ed60: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
ed70: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
ed80: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
ed90: 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72  Right);.  }.  pr
eda0: 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61  ereqAll = exprTa
edb0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
edc0: 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  t, pExpr);.  if(
edd0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
ede0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
edf0: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d  oin) ){.    Bitm
ee00: 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28  ask x = getMask(
ee10: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
ee20: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
ee30: 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c  );.    prereqAll
ee40: 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61   |= x;.    extra
ee50: 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a  Right = x-1;  /*
ee60: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
ee70: 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64   may not be used
ee80: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20   with an index. 
ee90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eea0: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74        ** on left
eeb0: 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
eec0: 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23   JOIN.  Ticket #
eed0: 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54  3015 */.  }.  pT
eee0: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
eef0: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54   prereqAll;.  pT
ef00: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
ef10: 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69  = -1;.  pTerm->i
ef20: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70  Parent = -1;.  p
ef30: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
ef40: 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77  = 0;.  if( allow
ef50: 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20 20  edOp(op) ){.    
ef60: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71  Expr *pLeft = sq
ef70: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
ef80: 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  late(pExpr->pLef
ef90: 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  t);.    Expr *pR
efa0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
efb0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
efc0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
efd0: 20 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28    u16 opMask = (
efe0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
eff0: 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29  ht & prereqLeft)
f000: 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57  ==0 ? WO_ALL : W
f010: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 69 66 28  O_EQUIV;.    if(
f020: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pLeft->op==TK_C
f030: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70  OLUMN ){.      p
f040: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
f050: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
f060: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75  ;.      pTerm->u
f070: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
f080: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
f090: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
f0a0: 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d  ator = operatorM
f0b0: 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b  ask(op) & opMask
f0c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f0d0: 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74  pRight && pRight
f0e0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
f0f0: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
f100: 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  rm *pNew;.      
f110: 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20  Expr *pDup;.    
f120: 20 20 75 31 36 20 65 45 78 74 72 61 4f 70 20 3d    u16 eExtraOp =
f130: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 78   0;        /* Ex
f140: 74 72 61 20 62 69 74 73 20 66 6f 72 20 70 4e 65  tra bits for pNe
f150: 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a  w->eOperator */.
f160: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
f170: 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29  >leftCursor>=0 )
f180: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64  {.        int id
f190: 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44  xNew;.        pD
f1a0: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
f1b0: 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
f1c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
f1d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f1e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
f1f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
f200: 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  b, pDup);.      
f210: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
f220: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64      }.        id
f230: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
f240: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44  seInsert(pWC, pD
f250: 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  up, TERM_VIRTUAL
f260: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
f270: 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e          if( idxN
f280: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
f290: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26          pNew = &
f2a0: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
f2b0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50          pNew->iP
f2c0: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
f2d0: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
f2e0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
f2f0: 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ];.        pTerm
f300: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
f310: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
f320: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
f330: 49 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IED;.        if(
f340: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
f350: 51 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45  Q.         && !E
f360: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
f370: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
f380: 6e 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  n).         && O
f390: 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
f3a0: 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 54 72  ed(db, SQLITE_Tr
f3b0: 61 6e 73 69 74 69 76 65 29 0a 20 20 20 20 20 20  ansitive).      
f3c0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
f3d0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
f3e0: 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20  |= WO_EQUIV;.   
f3f0: 20 20 20 20 20 20 20 65 45 78 74 72 61 4f 70 20         eExtraOp 
f400: 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  = WO_EQUIV;.    
f410: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
f420: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  e{.        pDup 
f430: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
f440: 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20   pNew = pTerm;. 
f450: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
f460: 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c  rCommute(pParse,
f470: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c   pDup);.      pL
f480: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
f490: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 75  rSkipCollate(pDu
f4a0: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  p->pLeft);.     
f4b0: 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f   pNew->leftCurso
f4c0: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
f4d0: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  e;.      pNew->u
f4e0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
f4f0: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
f500: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
f510: 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72  rereqLeft | extr
f520: 61 52 69 67 68 74 29 20 21 3d 20 70 72 65 72 65  aRight) != prere
f530: 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70  qLeft );.      p
f540: 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74  New->prereqRight
f550: 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20   = prereqLeft | 
f560: 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20  extraRight;.    
f570: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c    pNew->prereqAl
f580: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
f590: 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72       pNew->eOper
f5a0: 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f 72  ator = (operator
f5b0: 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b  Mask(pDup->op) +
f5c0: 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70 4d   eExtraOp) & opM
f5d0: 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ask;.    }.  }..
f5e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f5f0: 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49  MIT_BETWEEN_OPTI
f600: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66  MIZATION.  /* If
f610: 20 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42   a term is the B
f620: 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c  ETWEEN operator,
f630: 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20   create two new 
f640: 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20  virtual terms.  
f650: 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74  ** that define t
f660: 68 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68  he range that th
f670: 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d  e BETWEEN implem
f680: 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  ents.  For examp
f690: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
f6a0: 20 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 41     a BETWEEN b A
f6b0: 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69  ND c.  **.  ** i
f6c0: 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  s converted into
f6d0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
f6e0: 20 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e   (a BETWEEN b AN
f6f0: 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20  D c) AND (a>=b) 
f700: 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a  AND (a<=c).  **.
f710: 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77    ** The two new
f720: 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64   terms are added
f730: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
f740: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
f750: 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68   object..  ** Th
f760: 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  e new terms are 
f770: 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72  "dynamic" and ar
f780: 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68  e children of th
f790: 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45  e original BETWE
f7a0: 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54  EN.  ** term.  T
f7b0: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69  hat means that i
f7c0: 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 65  f the BETWEEN te
f7d0: 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65  rm is coded, the
f7e0: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20   children are.  
f7f0: 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c  ** skipped.  Or,
f800: 20 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e   if the children
f810: 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62   are satisfied b
f820: 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20  y an index, the 
f830: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45  original.  ** BE
f840: 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b  TWEEN term is sk
f850: 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
f860: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
f870: 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20  ==TK_BETWEEN && 
f880: 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  pWC->op==TK_AND 
f890: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
f8a0: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
f8b0: 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74  x.pList;.    int
f8c0: 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   i;.    static c
f8d0: 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20  onst u8 ops[] = 
f8e0: 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a  {TK_GE, TK_LE};.
f8f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
f900: 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
f910: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
f920: 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ==2 );.    for(i
f930: 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
f940: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
f950: 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  xpr;.      int i
f960: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65  dxNew;.      pNe
f970: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  wExpr = sqlite3P
f980: 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73  Expr(pParse, ops
f990: 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  [i], .          
f9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
f9c0: 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  p(db, pExpr->pLe
f9d0: 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20  ft, 0),.        
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fa00: 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  Dup(db, pList->a
fa10: 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30  [i].pExpr, 0), 0
fa20: 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20  );.      idxNew 
fa30: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
fa40: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
fa50: 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  r, TERM_VIRTUAL|
fa60: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
fa70: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
fa80: 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
fa90: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
faa0: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29  rc, pWC, idxNew)
fab0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
fac0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
fad0: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
fae0: 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d  dxNew].iParent =
faf0: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   idxTerm;.    }.
fb00: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
fb10: 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 2;.  }.#endi
fb20: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
fb30: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
fb40: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64  ATION */..#if !d
fb50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
fb60: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
fb70: 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ON) && !defined(
fb80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
fb90: 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79  UERY).  /* Analy
fba0: 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 69  ze a term that i
fbb0: 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77  s composed of tw
fbc0: 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72  o or more subter
fbd0: 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a  ms connected by.
fbe0: 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61    ** an OR opera
fbf0: 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  tor..  */.  else
fc00: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
fc10: 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73  TK_OR ){.    ass
fc20: 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b  ert( pWC->op==TK
fc30: 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72  _AND );.    expr
fc40: 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53  AnalyzeOrTerm(pS
fc50: 72 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d  rc, pWC, idxTerm
fc60: 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  );.    pTerm = &
fc70: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
fc80: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
fc90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
fca0: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
fcb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fcc0: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
fcd0: 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f  TION.  /* Add co
fce0: 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64  nstraints to red
fcf0: 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73  uce the search s
fd00: 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f  pace on a LIKE o
fd10: 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72  r GLOB.  ** oper
fd20: 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ator..  **.  ** 
fd30: 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f  A like pattern o
fd40: 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49  f the form "x LI
fd50: 4b 45 20 27 61 62 63 25 27 22 20 69 73 20 63 68  KE 'abc%'" is ch
fd60: 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74  anged into const
fd70: 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a  raints.  **.  **
fd80: 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62            x>='ab
fd90: 63 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41  c' AND x<'abd' A
fda0: 4e 44 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27  ND x LIKE 'abc%'
fdb0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c  .  **.  ** The l
fdc0: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66  ast character of
fdd0: 20 74 68 65 20 70 72 65 66 69 78 20 22 61 62 63   the prefix "abc
fde0: 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  " is incremented
fdf0: 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a   to form the.  *
fe00: 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  * termination co
fe10: 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20  ndition "abd".. 
fe20: 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f   */.  if( pWC->o
fe30: 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26  p==TK_AND .   &&
fe40: 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50   isLikeOrGlob(pP
fe50: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 70 53  arse, pExpr, &pS
fe60: 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65  tr1, &isComplete
fe70: 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a  , &noCase).  ){.
fe80: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b      Expr *pLeft;
fe90: 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66         /* LHS of
fea0: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
feb0: 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  tor */.    Expr 
fec0: 2a 70 53 74 72 32 3b 20 20 20 20 20 20 20 2f 2a  *pStr2;       /*
fed0: 20 43 6f 70 79 20 6f 66 20 70 53 74 72 31 20 2d   Copy of pStr1 -
fee0: 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f   RHS of LIKE/GLO
fef0: 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  B operator */.  
ff00: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
ff10: 31 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  1;.    Expr *pNe
ff20: 77 45 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20  wExpr2;.    int 
ff30: 69 64 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74  idxNew1;.    int
ff40: 20 69 64 78 4e 65 77 32 3b 0a 20 20 20 20 54 6f   idxNew2;.    To
ff50: 6b 65 6e 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65  ken sCollSeqName
ff60: 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f  ;  /* Name of co
ff70: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
ff80: 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d   */..    pLeft =
ff90: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
ffa0: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
ffb0: 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65 33   pStr2 = sqlite3
ffc0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 72  ExprDup(db, pStr
ffd0: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21  1, 0);.    if( !
ffe0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
fff0: 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c 20   ){.      u8 c, 
10000 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61  *pC;       /* La
10010 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66  st character bef
10020 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77 69  ore the first wi
10030 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20 20 20  ldcard */.      
10040 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74 72 32  pC = (u8*)&pStr2
10050 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74  ->u.zToken[sqlit
10060 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74 72 32  e3Strlen30(pStr2
10070 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a  ->u.zToken)-1];.
10080 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20        c = *pC;. 
10090 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20       if( noCase 
100a0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
100b0 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e  e point is to in
100c0 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61 73 74  crement the last
100d0 20 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72   character befor
100e0 65 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  e the first.    
100f0 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e      ** wildcard.
10100 20 20 42 75 74 20 69 66 20 77 65 20 69 6e 63 72    But if we incr
10110 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61 74 20  ement '@', that 
10120 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69 6e 74  will push it int
10130 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
10140 20 61 6c 70 68 61 62 65 74 69 63 20 72 61 6e 67   alphabetic rang
10150 65 20 77 68 65 72 65 20 63 61 73 65 20 63 6f 6e  e where case con
10160 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65  versions will me
10170 73 73 20 75 70 20 74 68 65 20 0a 20 20 20 20 20  ss up the .     
10180 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79     ** inequality
10190 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68 69 73  .  To avoid this
101a0 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f 20 61  , make sure to a
101b0 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75 6c 6c  lso run the full
101c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45  .        ** LIKE
101d0 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64 61 74   on all candidat
101e0 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79  e expressions by
101f0 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 69 73   clearing the is
10200 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a 20 20  Complete flag.  
10210 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
10220 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20 29 20   if( c=='A'-1 ) 
10230 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 0a  isComplete = 0;.
10240 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
10250 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  te3UpperToLower[
10260 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c];.      }.    
10270 20 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20    *pC = c + 1;. 
10280 20 20 20 7d 0a 20 20 20 20 73 43 6f 6c 6c 53 65     }.    sCollSe
10290 71 4e 61 6d 65 2e 7a 20 3d 20 6e 6f 43 61 73 65  qName.z = noCase
102a0 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a 20 22 42   ? "NOCASE" : "B
102b0 49 4e 41 52 59 22 3b 0a 20 20 20 20 73 43 6f 6c  INARY";.    sCol
102c0 6c 53 65 71 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a  lSeqName.n = 6;.
102d0 20 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20      pNewExpr1 = 
102e0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
102f0 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  b, pLeft, 0);.  
10300 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71    pNewExpr1 = sq
10310 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
10320 65 2c 20 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20  e, TK_GE, .     
10330 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
10340 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e  rAddCollateToken
10350 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72  (pParse,pNewExpr
10360 31 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29  1,&sCollSeqName)
10370 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74  ,.           pSt
10380 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e  r1, 0);.    idxN
10390 65 77 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73  ew1 = whereClaus
103a0 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
103b0 77 45 78 70 72 31 2c 20 54 45 52 4d 5f 56 49 52  wExpr1, TERM_VIR
103c0 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
103d0 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  C);.    testcase
103e0 28 20 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a  ( idxNew1==0 );.
103f0 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
10400 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
10410 77 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70  w1);.    pNewExp
10420 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
10430 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30  Dup(db, pLeft, 0
10440 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32  );.    pNewExpr2
10450 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
10460 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20  pParse, TK_LT,. 
10470 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10480 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54  3ExprAddCollateT
10490 6f 6b 65 6e 28 70 50 61 72 73 65 2c 70 4e 65 77  oken(pParse,pNew
104a0 45 78 70 72 32 2c 26 73 43 6f 6c 6c 53 65 71 4e  Expr2,&sCollSeqN
104b0 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ame),.          
104c0 20 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20   pStr2, 0);.    
104d0 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43  idxNew2 = whereC
104e0 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
104f0 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d   pNewExpr2, TERM
10500 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
10510 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74  NAMIC);.    test
10520 63 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30  case( idxNew2==0
10530 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c   );.    exprAnal
10540 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
10550 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65  dxNew2);.    pTe
10560 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
10570 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69  Term];.    if( i
10580 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20  sComplete ){.   
10590 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77     pWC->a[idxNew
105a0 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  1].iParent = idx
105b0 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d  Term;.      pWC-
105c0 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72  >a[idxNew2].iPar
105d0 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
105e0 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
105f0 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  ld = 2;.    }.  
10600 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
10610 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
10620 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
10630 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10640 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
10650 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54   /* Add a WO_MAT
10660 43 48 20 61 75 78 69 6c 69 61 72 79 20 74 65 72  CH auxiliary ter
10670 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61  m to the constra
10680 69 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a 20  int set if the. 
10690 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72   ** current expr
106a0 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
106b0 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d   form:  column M
106c0 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20  ATCH expr..  ** 
106d0 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
106e0 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
106f0 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f  xBestIndex metho
10700 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75  ds of.  ** virtu
10710 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20  al tables.  The 
10720 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f 70 74  native query opt
10730 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20  imizer does not 
10740 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20  attempt.  ** to 
10750 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68  do anything with
10760 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73   MATCH functions
10770 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d  ..  */.  if( isM
10780 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78  atchOfColumn(pEx
10790 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  pr) ){.    int i
107a0 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20  dxNew;.    Expr 
107b0 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b  *pRight, *pLeft;
107c0 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
107d0 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69  pNewTerm;.    Bi
107e0 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75  tmask prereqColu
107f0 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a  mn, prereqExpr;.
10800 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45  .    pRight = pE
10810 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
10820 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c  0].pExpr;.    pL
10830 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  eft = pExpr->x.p
10840 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
10850 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78 70 72  ;.    prereqExpr
10860 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
10870 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67  e(pMaskSet, pRig
10880 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43  ht);.    prereqC
10890 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c  olumn = exprTabl
108a0 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
108b0 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28   pLeft);.    if(
108c0 20 28 70 72 65 72 65 71 45 78 70 72 20 26 20 70   (prereqExpr & p
108d0 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20  rereqColumn)==0 
108e0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
108f0 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70  NewExpr;.      p
10900 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
10910 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
10920 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20  K_MATCH, .      
10930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10940 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74          0, sqlit
10950 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 52  e3ExprDup(db, pR
10960 69 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20  ight, 0), 0);.  
10970 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
10980 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
10990 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45  WC, pNewExpr, TE
109a0 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
109b0 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
109c0 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
109d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
109e0 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  wTerm = &pWC->a[
109f0 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70  idxNew];.      p
10a00 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  NewTerm->prereqR
10a10 69 67 68 74 20 3d 20 70 72 65 72 65 71 45 78 70  ight = prereqExp
10a20 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  r;.      pNewTer
10a30 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
10a40 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
10a50 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75       pNewTerm->u
10a60 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
10a70 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
10a80 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f      pNewTerm->eO
10a90 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54  perator = WO_MAT
10aa0 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  CH;.      pNewTe
10ab0 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64  rm->iParent = id
10ac0 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65  xTerm;.      pTe
10ad0 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
10ae0 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65  Term];.      pTe
10af0 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
10b00 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
10b10 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
10b20 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  IED;.      pNewT
10b30 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
10b40 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
10b50 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  l;.    }.  }.#en
10b60 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
10b70 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
10b80 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
10b90 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20  E_ENABLE_STAT3. 
10ba0 20 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f   /* When sqlite_
10bb0 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20  stat3 histogram 
10bc0 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c  data is availabl
10bd0 65 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66  e an operator of
10be0 20 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22   the.  ** form "
10bf0 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63  x IS NOT NULL" c
10c00 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20  an sometimes be 
10c10 65 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65  evaluated more e
10c20 66 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20  fficiently.  ** 
10c30 61 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78  as "x>NULL" if x
10c40 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
10c50 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20  ER PRIMARY KEY. 
10c60 20 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a   So construct a.
10c70 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72    ** virtual ter
10c80 6d 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a  m of that form..
10c90 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
10ca0 68 61 74 20 74 68 65 20 76 69 72 74 75 61 6c 20  hat the virtual 
10cb0 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67  term must be tag
10cc0 67 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e  ged with TERM_VN
10cd0 55 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ULL.  This.  ** 
10ce0 54 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77  TERM_VNULL tag w
10cf0 69 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68 65  ill suppress the
10d00 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20   not-null check 
10d10 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
10d20 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f  .  ** of the loo
10d30 70 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65 20  p.  Without the 
10d40 54 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c  TERM_VNULL flag,
10d50 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68   the not-null ch
10d60 65 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  eck at.  ** the 
10d70 73 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f  start of the loo
10d80 70 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61  p will prevent a
10d90 6e 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  ny results from 
10da0 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a  being returned..
10db0 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72    */.  if( pExpr
10dc0 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op==TK_NOTNULL
10dd0 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  .   && pExpr->pL
10de0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
10df0 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e  MN.   && pExpr->
10e00 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pLeft->iColumn>=
10e10 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61  0.   && Optimiza
10e20 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
10e30 53 51 4c 49 54 45 5f 53 74 61 74 33 29 0a 20 20  SQLITE_Stat3).  
10e40 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  ){.    Expr *pNe
10e50 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  wExpr;.    Expr 
10e60 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
10e70 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69  pLeft;.    int i
10e80 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65  dxNew;.    Where
10e90 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
10ea0 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20  .    pNewExpr = 
10eb0 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
10ec0 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20  rse, TK_GT,.    
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ee0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
10ef0 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
10f00 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
10f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70    sqlite3PExpr(p
10f30 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20  Parse, TK_NULL, 
10f40 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20  0, 0, 0), 0);.. 
10f50 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
10f60 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
10f70 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20  C, pNewExpr,.   
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f90 20 20 20 20 20 20 20 20 20 20 20 54 45 52 4d 5f             TERM_
10fa0 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
10fb0 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29  AMIC|TERM_VNULL)
10fc0 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65 77  ;.    if( idxNew
10fd0 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   ){.      pNewTe
10fe0 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
10ff0 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  New];.      pNew
11000 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
11010 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  t = 0;.      pNe
11020 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  wTerm->leftCurso
11030 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
11040 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  e;.      pNewTer
11050 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  m->u.leftColumn 
11060 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
11070 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
11080 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
11090 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  _GT;.      pNewT
110a0 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  erm->iParent = i
110b0 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
110c0 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
110d0 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54  xTerm];.      pT
110e0 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
110f0 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
11100 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
11110 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77  PIED;.      pNew
11120 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
11130 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  = pTerm->prereqA
11140 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ll;.    }.  }.#e
11150 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
11160 4e 41 42 4c 45 5f 53 54 41 54 20 2a 2f 0a 0a 20  NABLE_STAT */.. 
11170 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20 63   /* Prevent ON c
11180 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 61  lause terms of a
11190 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20   LEFT JOIN from 
111a0 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64 72  being used to dr
111b0 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ive.  ** an inde
111c0 78 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20  x for tables to 
111d0 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
111e0 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65  join..  */.  pTe
111f0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
11200 7c 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a 7d  |= extraRight;.}
11210 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
11220 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 70  ction searches p
11230 4c 69 73 74 20 66 6f 72 20 61 20 65 6e 74 72 79  List for a entry
11240 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
11250 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
11260 0a 2a 2a 20 6f 66 20 69 6e 64 65 78 20 70 49 64  .** of index pId
11270 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68  x..**.** If such
11280 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
11290 73 20 66 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64  s found, its ind
112a0 65 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d  ex in pList->a[]
112b0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
112c0 0a 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73 69 6f  .** no expressio
112d0 6e 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69  n is found, -1 i
112e0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
112f0 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e  tatic int findIn
11300 64 65 78 43 6f 6c 28 0a 20 20 50 61 72 73 65 20  dexCol(.  Parse 
11310 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
11320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
11330 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
11340 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
11350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11360 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69  /* Expression li
11370 73 74 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  st to search */.
11380 20 20 69 6e 74 20 69 42 61 73 65 2c 20 20 20 20    int iBase,    
11390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113a0 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20    /* Cursor for 
113b0 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  table associated
113c0 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20   with pIdx */.  
113d0 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113f0 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61 74 63  /* Index to matc
11400 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20  h column of */. 
11410 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20   int iCol       
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11430 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e   /* Column of in
11440 64 65 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a  dex to match */.
11450 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  ){.  int i;.  co
11460 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
11470 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  = pIdx->azColl[i
11480 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Col];..  for(i=0
11490 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
114a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
114b0 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70   *p = sqlite3Exp
114c0 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69  rSkipCollate(pLi
114d0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
114e0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
114f0 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26  TK_COLUMN.     &
11500 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  & p->iColumn==pI
11510 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f  dx->aiColumn[iCo
11520 6c 5d 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 54  l].     && p->iT
11530 61 62 6c 65 3d 3d 69 42 61 73 65 0a 20 20 20 20  able==iBase.    
11540 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
11550 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
11560 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
11570 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  rse, pList->a[i]
11580 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  .pExpr);.      i
11590 66 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29  f( ALWAYS(pColl)
115a0 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
115b0 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
115c0 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  me, zColl) ){.  
115d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a        return i;.
115e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
115f0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  }..  return -1;.
11600 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11610 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  true if the DIST
11620 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d  INCT expression-
11630 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
11640 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
11650 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e  t.** is redundan
11660 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49  t..**.** A DISTI
11670 4e 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75  NCT list is redu
11680 6e 64 61 6e 74 20 69 66 20 74 68 65 20 64 61 74  ndant if the dat
11690 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 73  abase contains s
116a0 6f 6d 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a  ome subset of.**
116b0 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72   columns that ar
116c0 65 20 75 6e 69 71 75 65 20 61 6e 64 20 6e 6f 6e  e unique and non
116d0 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  -null..*/.static
116e0 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52   int isDistinctR
116f0 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73  edundant(.  Pars
11700 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11710 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11720 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
11730 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
11740 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
11750 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
11760 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
11770 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
11780 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
11790 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
117a0 73 74 69 6e 63 74 20 20 20 20 20 20 20 2f 2a 20  stinct       /* 
117b0 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74  The result set t
117c0 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
117d0 44 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20  DISTINCT */.){. 
117e0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
117f0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
11800 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
11810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
11820 20 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20    int iBase;..  
11830 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d  /* If there is m
11840 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62  ore than one tab
11850 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74  le or sub-select
11860 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
11870 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  use of.  ** this
11880 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20   query, then it 
11890 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
118a0 69 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61  ible to show tha
118b0 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a  t the DISTINCT .
118c0 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72    ** clause is r
118d0 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69  edundant. */.  i
118e0 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
118f0 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
11900 0a 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c  .  iBase = pTabL
11910 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
11920 72 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62  r;.  pTab = pTab
11930 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  List->a[0].pTab;
11940 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66  ..  /* If any of
11950 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
11960 20 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d   is an IPK colum
11970 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65  n on table iBase
11980 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20  , then return . 
11990 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20   ** true. Note: 
119a0 54 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d  The (p->iTable==
119b0 69 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74  iBase) part of t
119c0 68 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20  his test may be 
119d0 66 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a  false if the.  *
119e0 2a 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  * current SELECT
119f0 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
11a00 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f   sub-query..  */
11a10 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44  .  for(i=0; i<pD
11a20 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20  istinct->nExpr; 
11a30 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
11a40 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
11a50 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74  kipCollate(pDist
11a60 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  inct->a[i].pExpr
11a70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  );.    if( p->op
11a80 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
11a90 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20  ->iTable==iBase 
11aa0 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  && p->iColumn<0 
11ab0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
11ac0 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
11ad0 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  gh all indices o
11ae0 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65  n the table, che
11af0 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65  cking each to se
11b00 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20  e if it makes.  
11b10 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  ** the DISTINCT 
11b20 71 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64  qualifier redund
11b30 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20  ant. It does so 
11b40 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  if:.  **.  **   
11b50 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  1. The index is 
11b60 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61  itself UNIQUE, a
11b70 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32  nd.  **.  **   2
11b80 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c  . All of the col
11b90 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
11ba0 78 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72  x are either par
11bb0 74 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e  t of the pDistin
11bc0 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73  ct.  **      lis
11bd0 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57  t, or else the W
11be0 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
11bf0 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ains a term of t
11c00 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c  he form "col=X",
11c10 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65  .  **      where
11c20 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74   X is a constant
11c30 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c   value. The coll
11c40 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
11c50 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20  of the.  **     
11c60 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20   comparison and 
11c70 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72  select-list expr
11c80 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74  essions must mat
11c90 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20  ch those of the 
11ca0 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
11cb0 20 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f     3. All of tho
11cc0 73 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  se index columns
11cd0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57   for which the W
11ce0 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73  HERE clause does
11cf0 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63   not.  **      c
11d00 6f 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22  ontain a "col=X"
11d10 20 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63   term are subjec
11d20 74 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20  t to a NOT NULL 
11d30 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f  constraint..  */
11d40 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
11d50 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
11d60 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
11d70 29 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  ){.    if( pIdx-
11d80 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e  >onError==OE_Non
11d90 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
11da0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
11db0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
11dc0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
11dd0 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
11de0 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  n[i];.      if( 
11df0 30 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57 43 2c  0==findTerm(pWC,
11e00 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28   iBase, iCol, ~(
11e10 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51  Bitmask)0, WO_EQ
11e20 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20  , pIdx) ){.     
11e30 20 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 20 3d     int iIdxCol =
11e40 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50   findIndexCol(pP
11e50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c  arse, pDistinct,
11e60 20 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29   iBase, pIdx, i)
11e70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 49  ;.        if( iI
11e80 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61 62 2d  dxCol<0 || pTab-
11e90 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f  >aCol[pIdx->aiCo
11ea0 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c  lumn[i]].notNull
11eb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11ec0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
11ed0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
11ee0 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78 2d      if( i==pIdx-
11ef0 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
11f00 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20    /* This index 
11f10 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65  implies that the
11f20 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
11f30 69 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e 74  ier is redundant
11f40 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
11f50 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n 1;.    }.  }..
11f60 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
11f70 2a 20 0a 2a 2a 20 46 69 6e 64 20 28 61 6e 20 61  * .** Find (an a
11f80 70 70 72 6f 78 69 6d 61 74 65 29 20 73 75 6d 20  pproximate) sum 
11f90 6f 66 20 74 77 6f 20 57 68 65 72 65 43 6f 73 74  of two WhereCost
11fa0 73 2e 20 20 54 68 69 73 20 63 6f 6d 70 75 74 61  s.  This computa
11fb0 74 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 61  tion is.** not a
11fc0 20 73 69 6d 70 6c 65 20 22 2b 22 20 6f 70 65 72   simple "+" oper
11fd0 61 74 6f 72 20 62 65 63 61 75 73 65 20 57 68 65  ator because Whe
11fe0 72 65 43 6f 73 74 20 69 73 20 73 74 6f 72 65 64  reCost is stored
11ff0 20 61 73 20 61 20 6c 6f 67 61 72 69 74 68 6d 69   as a logarithmi
12000 63 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 20 0a  c.** value..** .
12010 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 43  */.static WhereC
12020 6f 73 74 20 77 68 65 72 65 43 6f 73 74 41 64 64  ost whereCostAdd
12030 28 57 68 65 72 65 43 6f 73 74 20 61 2c 20 57 68  (WhereCost a, Wh
12040 65 72 65 43 6f 73 74 20 62 29 7b 0a 20 20 73 74  ereCost b){.  st
12050 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
12060 6e 65 64 20 63 68 61 72 20 78 5b 5d 20 3d 20 7b  ned char x[] = {
12070 0a 20 20 20 20 20 31 30 2c 20 31 30 2c 20 20 20  .     10, 10,   
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12090 20 20 20 20 20 20 2f 2a 20 30 2c 31 20 2a 2f 0a        /* 0,1 */.
120a0 20 20 20 20 20 20 39 2c 20 39 2c 20 20 20 20 20        9, 9,     
120b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120c0 20 20 20 20 20 2f 2a 20 32 2c 33 20 2a 2f 0a 20       /* 2,3 */. 
120d0 20 20 20 20 20 38 2c 20 38 2c 20 20 20 20 20 20       8, 8,      
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120f0 20 20 20 20 2f 2a 20 34 2c 35 20 2a 2f 0a 20 20      /* 4,5 */.  
12100 20 20 20 20 37 2c 20 37 2c 20 37 2c 20 20 20 20      7, 7, 7,    
12110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12120 20 20 20 2f 2a 20 36 2c 37 2c 38 20 2a 2f 0a 20     /* 6,7,8 */. 
12130 20 20 20 20 20 36 2c 20 36 2c 20 36 2c 20 20 20       6, 6, 6,   
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12150 20 20 20 20 2f 2a 20 39 2c 31 30 2c 31 31 20 2a      /* 9,10,11 *
12160 2f 0a 20 20 20 20 20 20 35 2c 20 35 2c 20 35 2c  /.      5, 5, 5,
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12180 20 20 20 20 20 20 20 2f 2a 20 31 32 2d 31 34 20         /* 12-14 
12190 2a 2f 0a 20 20 20 20 20 20 34 2c 20 34 2c 20 34  */.      4, 4, 4
121a0 2c 20 34 2c 20 20 20 20 20 20 20 20 20 20 20 20  , 4,            
121b0 20 20 20 20 20 20 20 20 2f 2a 20 31 35 2d 31 38          /* 15-18
121c0 20 2a 2f 0a 20 20 20 20 20 20 33 2c 20 33 2c 20   */.      3, 3, 
121d0 33 2c 20 33 2c 20 33 2c 20 33 2c 20 20 20 20 20  3, 3, 3, 3,     
121e0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 39 2d 32           /* 19-2
121f0 34 20 2a 2f 0a 20 20 20 20 20 20 32 2c 20 32 2c  4 */.      2, 2,
12200 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20   2, 2, 2, 2, 2, 
12210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 35 2d            /* 25-
12220 33 31 20 2a 2f 0a 20 20 7d 3b 0a 20 20 69 66 28  31 */.  };.  if(
12230 20 61 3e 3d 62 20 29 7b 0a 20 20 20 20 69 66 28   a>=b ){.    if(
12240 20 61 3e 62 2b 34 39 20 29 20 72 65 74 75 72 6e   a>b+49 ) return
12250 20 61 3b 0a 20 20 20 20 69 66 28 20 61 3e 62 2b   a;.    if( a>b+
12260 33 31 20 29 20 72 65 74 75 72 6e 20 61 2b 31 3b  31 ) return a+1;
12270 0a 20 20 20 20 72 65 74 75 72 6e 20 61 2b 78 5b  .    return a+x[
12280 61 2d 62 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  a-b];.  }else{. 
12290 20 20 20 69 66 28 20 62 3e 61 2b 34 39 20 29 20     if( b>a+49 ) 
122a0 72 65 74 75 72 6e 20 62 3b 0a 20 20 20 20 69 66  return b;.    if
122b0 28 20 62 3e 61 2b 33 31 20 29 20 72 65 74 75 72  ( b>a+31 ) retur
122c0 6e 20 62 2b 31 3b 0a 20 20 20 20 72 65 74 75 72  n b+1;.    retur
122d0 6e 20 62 2b 78 5b 62 2d 61 5d 3b 0a 20 20 7d 0a  n b+x[b-a];.  }.
122e0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
122f0 20 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 74 6f   an integer into
12300 20 61 20 57 68 65 72 65 43 6f 73 74 2e 20 20 49   a WhereCost.  I
12310 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 63  n other words, c
12320 6f 6d 70 75 74 65 20 61 0a 2a 2a 20 67 6f 6f 64  ompute a.** good
12330 20 61 70 70 72 6f 78 69 6d 61 74 61 74 69 6f 6e   approximatation
12340 20 66 6f 72 20 31 30 2a 6c 6f 67 32 28 78 29 2e   for 10*log2(x).
12350 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65  .*/.static Where
12360 43 6f 73 74 20 77 68 65 72 65 43 6f 73 74 28 74  Cost whereCost(t
12370 52 6f 77 63 6e 74 20 78 29 7b 0a 20 20 73 74 61  Rowcnt x){.  sta
12380 74 69 63 20 57 68 65 72 65 43 6f 73 74 20 61 5b  tic WhereCost a[
12390 5d 20 3d 20 7b 20 30 2c 20 32 2c 20 33 2c 20 35  ] = { 0, 2, 3, 5
123a0 2c 20 36 2c 20 37 2c 20 38 2c 20 39 20 7d 3b 0a  , 6, 7, 8, 9 };.
123b0 20 20 57 68 65 72 65 43 6f 73 74 20 79 20 3d 20    WhereCost y = 
123c0 34 30 3b 0a 20 20 69 66 28 20 78 3c 38 20 29 7b  40;.  if( x<8 ){
123d0 0a 20 20 20 20 69 66 28 20 78 3c 32 20 29 20 72  .    if( x<2 ) r
123e0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69  eturn 0;.    whi
123f0 6c 65 28 20 78 3c 38 20 29 7b 20 20 79 20 2d 3d  le( x<8 ){  y -=
12400 20 31 30 3b 20 78 20 3c 3c 3d 20 31 3b 20 7d 0a   10; x <<= 1; }.
12410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
12420 6c 65 28 20 78 3e 32 35 35 20 29 7b 20 79 20 2b  le( x>255 ){ y +
12430 3d 20 34 30 3b 20 78 20 3e 3e 3d 20 34 3b 20 7d  = 40; x >>= 4; }
12440 0a 20 20 20 20 77 68 69 6c 65 28 20 78 3e 31 35  .    while( x>15
12450 20 29 7b 20 20 79 20 2b 3d 20 31 30 3b 20 78 20   ){  y += 10; x 
12460 3e 3e 3d 20 31 3b 20 7d 0a 20 20 7d 0a 20 20 72  >>= 1; }.  }.  r
12470 65 74 75 72 6e 20 61 5b 78 26 37 5d 20 2b 20 79  eturn a[x&7] + y
12480 20 2d 20 31 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65   - 10;.}..#ifnde
12490 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
124a0 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
124b0 20 43 6f 6e 76 65 72 74 20 61 20 64 6f 75 62 6c   Convert a doubl
124c0 65 20 28 61 73 20 72 65 63 65 69 76 65 64 20 66  e (as received f
124d0 72 6f 6d 20 78 42 65 73 74 49 6e 64 65 78 20 6f  rom xBestIndex o
124e0 66 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  f a virtual tabl
124f0 65 29 0a 2a 2a 20 69 6e 74 6f 20 61 20 57 68 65  e).** into a Whe
12500 72 65 43 6f 73 74 2e 20 20 49 6e 20 6f 74 68 65  reCost.  In othe
12510 72 20 77 6f 72 64 73 2c 20 63 6f 6d 70 75 74 65  r words, compute
12520 20 61 6e 20 61 70 70 72 6f 78 69 6d 61 74 69 6f   an approximatio
12530 6e 20 66 6f 72 0a 2a 2a 20 31 30 2a 6c 6f 67 32  n for.** 10*log2
12540 28 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  (x)..*/.static W
12550 68 65 72 65 43 6f 73 74 20 77 68 65 72 65 43 6f  hereCost whereCo
12560 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 64 6f 75  stFromDouble(dou
12570 62 6c 65 20 78 29 7b 0a 20 20 75 36 34 20 61 3b  ble x){.  u64 a;
12580 0a 20 20 57 68 65 72 65 43 6f 73 74 20 65 3b 0a  .  WhereCost e;.
12590 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
125a0 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66  (x)==8 && sizeof
125b0 28 61 29 3d 3d 38 20 29 3b 0a 20 20 69 66 28 20  (a)==8 );.  if( 
125c0 78 3c 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  x<=1 ) return 0;
125d0 0a 20 20 69 66 28 20 78 3c 3d 32 30 30 30 30 30  .  if( x<=200000
125e0 30 30 30 30 20 29 20 72 65 74 75 72 6e 20 77 68  0000 ) return wh
125f0 65 72 65 43 6f 73 74 28 28 74 52 6f 77 63 6e 74  ereCost((tRowcnt
12600 29 78 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61  )x);.  memcpy(&a
12610 2c 20 26 78 2c 20 38 29 3b 0a 20 20 65 20 3d 20  , &x, 8);.  e = 
12620 28 61 3e 3e 35 32 29 20 2d 20 31 30 32 32 3b 0a  (a>>52) - 1022;.
12630 20 20 72 65 74 75 72 6e 20 65 2a 31 30 3b 0a 7d    return e*10;.}
12640 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12650 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
12660 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 73  BLE */../*.** Es
12670 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72  timate the logar
12680 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75  ithm of the inpu
12690 74 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20  t value to base 
126a0 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  2..*/.static Whe
126b0 72 65 43 6f 73 74 20 65 73 74 4c 6f 67 28 57 68  reCost estLog(Wh
126c0 65 72 65 43 6f 73 74 20 4e 29 7b 0a 20 20 57 68  ereCost N){.  Wh
126d0 65 72 65 43 6f 73 74 20 78 20 3d 20 77 68 65 72  ereCost x = wher
126e0 65 43 6f 73 74 28 4e 29 3b 0a 20 20 72 65 74 75  eCost(N);.  retu
126f0 72 6e 20 78 3e 33 33 20 3f 20 78 20 2d 20 33 33  rn x>33 ? x - 33
12700 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   : 0;.}../*.** T
12710 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  wo routines for 
12720 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e  printing the con
12730 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74  tent of an sqlit
12740 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a  e3_index_info.**
12750 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65   structure.  Use
12760 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
12770 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
12780 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a  .  If neither.**
12790 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20   SQLITE_TEST or 
127a0 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65  SQLITE_DEBUG are
127b0 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74   defined, then t
127c0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a  hese routines.**
127d0 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a   are no-ops..*/.
127e0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
127f0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
12800 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
12810 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  d(WHERETRACE_ENA
12820 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f 69  BLED).static voi
12830 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  d TRACE_IDX_INPU
12840 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
12850 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
12860 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
12870 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
12880 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
12890 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
128a0 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
128b0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
128c0 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25  ("  constraint[%
128d0 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69  d]: col=%d termi
128e0 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c  d=%d op=%d usabl
128f0 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ed=%d\n",.      
12900 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
12910 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f  onstraint[i].iCo
12920 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
12930 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
12940 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20  TermOffset,.    
12950 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
12960 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20  t[i].op,.       
12970 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
12980 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20  ].usable);.  }. 
12990 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
129a0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
129b0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
129c0 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79  rintf("  orderby
129d0 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73  [%d]: col=%d des
129e0 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
129f0 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  i,.       p->aOr
12a00 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
12a10 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
12a20 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20  erBy[i].desc);. 
12a30 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
12a40 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
12a50 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
12a60 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
12a70 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
12a80 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
12a90 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
12aa0 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
12ab0 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
12ac0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
12ad0 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61  ("  usage[%d]: a
12ae0 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25  rgvIdx=%d omit=%
12af0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
12b00 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
12b10 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
12b20 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20  gvIndex,.       
12b30 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
12b40 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20  age[i].omit);.  
12b50 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
12b60 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d  Printf("  idxNum
12b70 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75  =%d\n", p->idxNu
12b80 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  m);.  sqlite3Deb
12b90 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53  ugPrintf("  idxS
12ba0 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78  tr=%s\n", p->idx
12bb0 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Str);.  sqlite3D
12bc0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72  ebugPrintf("  or
12bd0 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64  derByConsumed=%d
12be0 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43  \n", p->orderByC
12bf0 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69  onsumed);.  sqli
12c00 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
12c10 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d    estimatedCost=
12c20 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61  %g\n", p->estima
12c30 74 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73  tedCost);.}.#els
12c40 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f  e.#define TRACE_
12c50 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64  IDX_INPUTS(A).#d
12c60 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f  efine TRACE_IDX_
12c70 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69  OUTPUTS(A).#endi
12c80 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
12c90 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
12ca0 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74  _INDEX./*.** Ret
12cb0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
12cc0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
12cd0 6d 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61 20  m pTerm is of a 
12ce0 66 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a  form where it.**
12cf0 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 77   could be used w
12d00 69 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ith an index to 
12d10 61 63 63 65 73 73 20 70 53 72 63 2c 20 61 73 73  access pSrc, ass
12d20 75 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72  uming an appropr
12d30 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78  iate.** index ex
12d40 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  isted..*/.static
12d50 20 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69 76   int termCanDriv
12d60 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 54  eIndex(.  WhereT
12d70 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20  erm *pTerm,     
12d80 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52           /* WHER
12d90 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  E clause term to
12da0 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75   check */.  stru
12db0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
12dc0 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61  *pSrc,     /* Ta
12dd0 62 6c 65 20 77 65 20 61 72 65 20 74 72 79 69 6e  ble we are tryin
12de0 67 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20  g to access */. 
12df0 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
12e00 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
12e10 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75 74  /* Tables in out
12e20 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20  er loops of the 
12e30 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  join */.){.  cha
12e40 72 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54 65  r aff;.  if( pTe
12e50 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rm->leftCursor!=
12e60 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
12e70 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
12e80 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
12e90 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20  r & WO_EQ)==0 ) 
12ea0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
12eb0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
12ec0 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21  ght & notReady)!
12ed0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
12ee0 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65   if( pTerm->u.le
12ef0 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  ftColumn<0 ) ret
12f00 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70  urn 0;.  aff = p
12f10 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  Src->pTab->aCol[
12f20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
12f30 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  umn].affinity;. 
12f40 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64   if( !sqlite3Ind
12f50 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65  exAffinityOk(pTe
12f60 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20  rm->pExpr, aff) 
12f70 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
12f80 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
12f90 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
12fa0 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
12fb0 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e  _INDEX./*.** Gen
12fc0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f  erate code to co
12fd0 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65  nstruct the Inde
12fe0 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20  x object for an 
12ff0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a  automatic index.
13000 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70  ** and to set up
13010 20 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20   the WhereLevel 
13020 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f  object pLevel so
13030 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 67   that the code g
13040 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65  enerator.** make
13050 73 20 75 73 65 20 6f 66 20 74 68 65 20 61 75 74  s use of the aut
13060 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f  omatic index..*/
13070 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e  .static void con
13080 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49  structAutomaticI
13090 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
130a0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
130b0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
130c0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
130d0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
130e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
130f0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
13100 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
13110 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
13120 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
13130 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20  use term to get 
13140 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a  the next index *
13150 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
13160 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
13170 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
13180 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
13190 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57  available */.  W
131a0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
131b0 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  l          /* Wr
131c0 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65  ite new index he
131d0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
131e0 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
131f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
13200 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
13210 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  he constructed i
13220 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54  ndex */.  WhereT
13230 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
13240 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
13250 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
13260 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
13270 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e  WhereTerm *pWCEn
13280 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  d;          /* E
13290 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a  nd of pWC->a[] *
132a0 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
132b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132c0 2f 2a 20 42 79 74 65 20 6f 66 20 6d 65 6d 6f 72  /* Byte of memor
132d0 79 20 6e 65 65 64 65 64 20 66 6f 72 20 70 49 64  y needed for pId
132e0 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  x */.  Index *pI
132f0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
13300 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73     /* Object des
13310 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e  cribing the tran
13320 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20  sient index */. 
13330 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
13340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13350 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
13360 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
13370 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
13380 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20  ddrInit;        
13390 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
133a0 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c  s of the initial
133b0 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a  ization bypass j
133c0 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ump */.  Table *
133d0 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  pTable;         
133e0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
133f0 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
13400 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
13410 65 79 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyinfo;         
13420 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74   /* Key informat
13430 69 6f 6e 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ion for the inde
13440 78 20 2a 2f 20 20 20 0a 20 20 69 6e 74 20 61 64  x */   .  int ad
13450 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
13460 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
13470 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c  the index fill l
13480 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  oop */.  int reg
13490 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
134a0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
134b0 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65   holding an inde
134c0 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  x record */.  in
134d0 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
134e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
134f0 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  umn counter */. 
13500 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
13510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13520 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
13530 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20    int mxBitCol; 
13540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13550 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20   Maximum column 
13560 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  in pSrc->colUsed
13570 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
13580 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
13590 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
135a0 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20  equence to on a 
135b0 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72  column */.  Wher
135c0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
135d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
135e0 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
135f0 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b  Bitmask idxCols;
13600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
13610 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73  itmap of columns
13620 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69   used for indexi
13630 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ng */.  Bitmask 
13640 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20  extraCols;      
13650 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
13660 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
13670 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74  mns */.  u8 sent
13680 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20  Warning = 0;    
13690 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
136a0 61 20 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62  a warnning has b
136b0 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 0a 20  een issued */.. 
136c0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
136d0 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74  e to skip over t
136e0 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  he creation and 
136f0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
13700 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  f the.  ** trans
13710 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e  ient index on 2n
13720 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
13730 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74   iterations of t
13740 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20  he loop. */.  v 
13750 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
13760 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
13770 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20  );.  addrInit = 
13780 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
13790 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 43  pParse);..  /* C
137a0 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
137b0 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
137c0 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f  will be added to
137d0 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
137e0 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63  and used to matc
137f0 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  h WHERE clause c
13800 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
13810 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 70  nColumn = 0;.  p
13820 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
13830 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26  ab;.  pWCEnd = &
13840 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
13850 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  m];.  pLoop = pL
13860 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
13870 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
13880 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
13890 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
138a0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
138b0 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
138c0 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
138d0 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
138e0 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
138f0 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
13900 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
13910 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
13920 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53  MS ? MASKBIT(BMS
13930 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43  -1) : MASKBIT(iC
13940 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ol);.      testc
13950 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29  ase( iCol==BMS )
13960 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13970 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ( iCol==BMS-1 );
13980 0a 20 20 20 20 20 20 69 66 28 20 21 73 65 6e 74  .      if( !sent
13990 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20 20  Warning ){.     
139a0 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
139b0 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55  QLITE_WARNING_AU
139c0 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20 20  TOINDEX,.       
139d0 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63 20       "automatic 
139e0 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29 22  index on %s(%s)"
139f0 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c  , pTable->zName,
13a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61  .            pTa
13a10 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  ble->aCol[iCol].
13a20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
13a30 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31 3b  sentWarning = 1;
13a40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
13a50 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
13a60 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
13a70 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
13a80 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64  Resize(pParse->d
13a90 62 2c 20 70 4c 6f 6f 70 2c 20 6e 43 6f 6c 75 6d  b, pLoop, nColum
13aa0 6e 2b 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  n+1) ) return;. 
13ab0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c         pLoop->aL
13ac0 54 65 72 6d 5b 6e 43 6f 6c 75 6d 6e 2b 2b 5d 20  Term[nColumn++] 
13ad0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
13ae0 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
13af0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
13b00 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
13b10 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c  Column>0 );.  pL
13b20 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
13b30 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d   = pLoop->nLTerm
13b40 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 4c   = nColumn;.  pL
13b50 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
13b60 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c  HERE_COLUMN_EQ |
13b70 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
13b80 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 0a  | WHERE_INDEXED.
13b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ba0 20 20 20 20 20 7c 20 57 48 45 52 45 5f 41 55 54       | WHERE_AUT
13bb0 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43  O_INDEX;..  /* C
13bc0 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
13bd0 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
13be0 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
13bf0 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f  create a.  ** co
13c00 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41  vering index.  A
13c10 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78   "covering index
13c20 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  " is an index th
13c30 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  at contains all.
13c40 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61    ** columns tha
13c50 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  t are needed by 
13c60 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68  the query.  With
13c70 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
13c80 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  x, the.  ** orig
13c90 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72  inal table never
13ca0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63   needs to be acc
13cb0 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69  essed.  Automati
13cc0 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20  c indices must. 
13cd0 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e   ** be a coverin
13ce0 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  g index because 
13cf0 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e  the index will n
13d00 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66  ot be updated if
13d10 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
13d20 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73  al table changes
13d30 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61   and the index a
13d40 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20  nd table cannot 
13d50 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a  both be used.  *
13d60 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74  * if they go out
13d70 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20   of sync..  */. 
13d80 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72   extraCols = pSr
13d90 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69  c->colUsed & (~i
13da0 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54  dxCols | MASKBIT
13db0 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69  (BMS-1));.  mxBi
13dc0 74 43 6f 6c 20 3d 20 28 70 54 61 62 6c 65 2d 3e  tCol = (pTable->
13dd0 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29 20 3f  nCol >= BMS-1) ?
13de0 20 42 4d 53 2d 31 20 3a 20 70 54 61 62 6c 65 2d   BMS-1 : pTable-
13df0 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73 74 63 61 73  >nCol;.  testcas
13e00 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d  e( pTable->nCol=
13e10 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74  =BMS-1 );.  test
13e20 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43  case( pTable->nC
13e30 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66  ol==BMS-2 );.  f
13e40 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43  or(i=0; i<mxBitC
13e50 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
13e60 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41  ( extraCols & MA
13e70 53 4b 42 49 54 28 69 29 20 29 20 6e 43 6f 6c 75  SKBIT(i) ) nColu
13e80 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  mn++;.  }.  if( 
13e90 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
13ea0 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29  MASKBIT(BMS-1) )
13eb0 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 2b 3d  {.    nColumn +=
13ec0 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20   pTable->nCol - 
13ed0 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 70  BMS + 1;.  }.  p
13ee0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
13ef0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
13f00 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   | WHERE_IDX_ONL
13f10 59 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75  Y;..  /* Constru
13f20 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
13f30 65 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20  ect to describe 
13f40 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20  this index */.  
13f50 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 49  nByte = sizeof(I
13f60 6e 64 65 78 29 3b 0a 20 20 6e 42 79 74 65 20 2b  ndex);.  nByte +
13f70 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66  = nColumn*sizeof
13f80 28 69 6e 74 29 3b 20 20 20 20 20 2f 2a 20 49 6e  (int);     /* In
13f90 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 2a 2f 0a  dex.aiColumn */.
13fa0 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75    nByte += nColu
13fb0 6d 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  mn*sizeof(char*)
13fc0 3b 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43  ;   /* Index.azC
13fd0 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b  oll */.  nByte +
13fe0 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  = nColumn;      
13ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
14000 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a  dex.aSortOrder *
14010 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74  /.  pIdx = sqlit
14020 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
14030 50 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74 65  Parse->db, nByte
14040 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30  );.  if( pIdx==0
14050 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f   ) return;.  pLo
14060 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
14070 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64  ex = pIdx;.  pId
14080 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61  x->azColl = (cha
14090 72 2a 2a 29 26 70 49 64 78 5b 31 5d 3b 0a 20 20  r**)&pIdx[1];.  
140a0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  pIdx->aiColumn =
140b0 20 28 69 6e 74 2a 29 26 70 49 64 78 2d 3e 61 7a   (int*)&pIdx->az
140c0 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20  Coll[nColumn];. 
140d0 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
140e0 72 20 3d 20 28 75 38 2a 29 26 70 49 64 78 2d 3e  r = (u8*)&pIdx->
140f0 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e  aiColumn[nColumn
14100 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  ];.  pIdx->zName
14110 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b   = "auto-index";
14120 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  .  pIdx->nColumn
14130 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 49   = nColumn;.  pI
14140 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  dx->pTable = pTa
14150 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  ble;.  n = 0;.  
14160 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
14170 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
14180 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
14190 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
141a0 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
141b0 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
141c0 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
141d0 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
141e0 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
141f0 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
14200 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
14210 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53  MS ? MASKBIT(BMS
14220 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43  -1) : MASKBIT(iC
14230 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ol);.      testc
14240 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31  ase( iCol==BMS-1
14250 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14260 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b  se( iCol==BMS );
14270 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43  .      if( (idxC
14280 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20  ols & cMask)==0 
14290 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
142a0 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
142b0 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43  pr;.        idxC
142c0 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20  ols |= cMask;.  
142d0 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
142e0 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d  lumn[n] = pTerm-
142f0 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
14300 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
14310 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
14320 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
14330 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58  e, pX->pLeft, pX
14340 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
14350 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
14360 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70 43 6f 6c  n] = ALWAYS(pCol
14370 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  l) ? pColl->zNam
14380 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  e : "BINARY";.  
14390 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
143a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
143b0 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d 70  ssert( (u32)n==p
143c0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
143d0 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61  q );..  /* Add a
143e0 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
143f0 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65  s needed to make
14400 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
14410 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61  ndex into.  ** a
14420 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
14430 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
14440 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  mxBitCol; i++){.
14450 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c      if( extraCol
14460 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29  s & MASKBIT(i) )
14470 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69  {.      pIdx->ai
14480 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20  Column[n] = i;. 
14490 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
144a0 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b  l[n] = "BINARY";
144b0 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
144c0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  }.  }.  if( pSrc
144d0 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b  ->colUsed & MASK
144e0 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20  BIT(BMS-1) ){.  
144f0 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69    for(i=BMS-1; i
14500 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69  <pTable->nCol; i
14510 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ++){.      pIdx-
14520 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69  >aiColumn[n] = i
14530 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a  ;.      pIdx->az
14540 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52  Coll[n] = "BINAR
14550 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  Y";.      n++;. 
14560 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
14570 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b  t( n==nColumn );
14580 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
14590 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
145a0 78 20 2a 2f 0a 20 20 70 4b 65 79 69 6e 66 6f 20  x */.  pKeyinfo 
145b0 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
145c0 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
145d0 64 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dx);.  assert( p
145e0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d  Level->iIdxCur>=
145f0 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 69  0 );.  pLevel->i
14600 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d  IdxCur = pParse-
14610 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74  >nTab++;.  sqlit
14620 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
14630 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78  OP_OpenAutoindex
14640 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
14650 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c  r, nColumn+1, 0,
14660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14670 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
14680 69 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  info, P4_KEYINFO
14690 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 56 64 62  _HANDOFF);.  Vdb
146a0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f  eComment((v, "fo
146b0 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  r %s", pTable->z
146c0 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69  Name));..  /* Fi
146d0 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ll the automatic
146e0 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74   index with cont
146f0 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70  ent */.  addrTop
14700 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14710 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
14720 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  d, pLevel->iTabC
14730 75 72 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64  ur);.  regRecord
14740 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
14750 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
14760 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
14770 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20  ndexKey(pParse, 
14780 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  pIdx, pLevel->iT
14790 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64  abCur, regRecord
147a0 2c 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 1, 0);.  sqlit
147b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
147c0 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c  OP_IdxInsert, pL
147d0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72  evel->iIdxCur, r
147e0 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
147f0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
14800 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
14810 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c  EKRESULT);.  sql
14820 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14830 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65  , OP_Next, pLeve
14840 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64 72  l->iTabCur, addr
14850 54 6f 70 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  Top+1);.  sqlite
14860 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
14870 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
14880 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20  US_AUTOINDEX);. 
14890 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
148a0 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29  Here(v, addrTop)
148b0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
148c0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
148d0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
148e0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
148f0 77 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68  when skipping th
14900 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
14910 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
14920 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
14930 72 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  rInit);.}.#endif
14940 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
14950 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
14960 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
14970 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
14980 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ABLE./*.** Alloc
14990 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ate and populate
149a0 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
149b0 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
149c0 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
149d0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
149e0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
149f0 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61  eventually relea
14a00 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  se the structure
14a10 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74  .** by passing t
14a20 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
14a30 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
14a40 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f  tion to sqlite3_
14a50 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
14a60 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  c sqlite3_index_
14a70 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e  info *allocateIn
14a80 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65  dexInfo(.  Parse
14a90 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65 72   *pParse,.  Wher
14aa0 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20  eClause *pWC,.  
14ab0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
14ac0 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78 70  tem *pSrc,.  Exp
14ad0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 0a  rList *pOrderBy.
14ae0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
14af0 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74   int nTerm;.  st
14b00 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
14b10 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
14b20 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
14b30 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
14b40 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64  orderby *pIdxOrd
14b50 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73  erBy;.  struct s
14b60 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
14b70 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70  straint_usage *p
14b80 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65  Usage;.  WhereTe
14b90 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
14ba0 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c   nOrderBy;.  sql
14bb0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
14bc0 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a  *pIdxInfo;..  /*
14bd0 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
14be0 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48  r of possible WH
14bf0 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
14c00 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67  raints referring
14c10 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69  .  ** to this vi
14c20 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
14c30 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20   for(i=nTerm=0, 
14c40 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
14c50 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
14c60 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
14c70 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
14c80 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
14c90 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
14ca0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49 73  ;.    assert( Is
14cb0 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d  PowerOfTwo(pTerm
14cc0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57  ->eOperator & ~W
14cd0 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20  O_EQUIV) );.    
14ce0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
14cf0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
14d00 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IN );.    testca
14d10 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
14d20 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
14d30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72   );.    if( pTer
14d40 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
14d50 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e  WO_ISNULL) ) con
14d60 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
14d70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
14d80 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e  TERM_VNULL ) con
14d90 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d  tinue;.    nTerm
14da0 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ++;.  }..  /* If
14db0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
14dc0 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  ause contains on
14dd0 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ly columns in th
14de0 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20  e current .  ** 
14df0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
14e00 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  en allocate spac
14e10 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72  e for the aOrder
14e20 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20  By part of.  ** 
14e30 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
14e40 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
14e50 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42  ..  */.  nOrderB
14e60 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72  y = 0;.  if( pOr
14e70 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74  derBy ){.    int
14e80 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e   n = pOrderBy->n
14e90 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Expr;.    for(i=
14ea0 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
14eb0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
14ec0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
14ed0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
14ee0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
14ef0 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d  COLUMN || pExpr-
14f00 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69  >iTable!=pSrc->i
14f10 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a  Cursor ) break;.
14f20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
14f30 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65  =n){.      nOrde
14f40 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20  rBy = n;.    }. 
14f50 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
14f60 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  e the sqlite3_in
14f70 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
14f80 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e  re.  */.  pIdxIn
14f90 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
14fa0 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
14fb0 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64  >db, sizeof(*pId
14fc0 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20  xInfo).         
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fe0 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64    + (sizeof(*pId
14ff0 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28  xCons) + sizeof(
15000 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a  *pUsage))*nTerm.
15010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15020 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a             + siz
15030 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79  eof(*pIdxOrderBy
15040 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  )*nOrderBy );.  
15050 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
15060 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
15070 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
15080 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b  out of memory");
15090 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
150a0 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
150b0 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ize the structur
150c0 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  e.  The sqlite3_
150d0 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
150e0 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20  ture contains.  
150f0 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
15100 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
15110 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
15120 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
15130 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e  rom.  ** changin
15140 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65  g them.  We have
15150 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b   to do some funk
15160 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64  y casting in ord
15170 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69  er to.  ** initi
15180 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c  alize those fiel
15190 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43  ds..  */.  pIdxC
151a0 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71  ons = (struct sq
151b0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
151c0 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66  traint*)&pIdxInf
151d0 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65  o[1];.  pIdxOrde
151e0 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71  rBy = (struct sq
151f0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
15200 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e  rby*)&pIdxCons[n
15210 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20  Term];.  pUsage 
15220 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
15230 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
15240 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f  nt_usage*)&pIdxO
15250 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d  rderBy[nOrderBy]
15260 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
15270 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
15280 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69  t = nTerm;.  *(i
15290 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
152a0 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
152b0 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
152c0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
152d0 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
152e0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
152f0 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a   = pIdxCons;.  *
15300 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
15310 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29  index_orderby**)
15320 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65  &pIdxInfo->aOrde
15330 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42  rBy = pIdxOrderB
15340 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
15350 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
15360 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26  traint_usage**)&
15370 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
15380 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20  raintUsage =.   
15390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153d0 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69  pUsage;..  for(i
153e0 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  =j=0, pTerm=pWC-
153f0 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
15400 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
15410 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20  .    u8 op;.    
15420 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
15430 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
15440 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
15450 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49  e;.    assert( I
15460 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72  sPowerOfTwo(pTer
15470 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
15480 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20  WO_EQUIV) );.   
15490 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
154a0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
154b0 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
154c0 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
154d0 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
154e0 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  L );.    if( pTe
154f0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
15500 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f  (WO_ISNULL) ) co
15510 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
15520 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
15530 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
15540 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78  ntinue;.    pIdx
15550 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20  Cons[j].iColumn 
15560 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
15570 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43  olumn;.    pIdxC
15580 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[j].iTermOffs
15590 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d  et = i;.    op =
155a0 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65   (u8)pTerm->eOpe
155b0 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a  rator & WO_ALL;.
155c0 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49      if( op==WO_I
155d0 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a  N ) op = WO_EQ;.
155e0 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
155f0 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20  op = op;.    /* 
15600 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69 67  The direct assig
15610 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65  nment in the pre
15620 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f  vious line is po
15630 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61  ssible only beca
15640 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57  use.    ** the W
15650 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e  O_ and SQLITE_IN
15660 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20  DEX_CONSTRAINT_ 
15670 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69  codes are identi
15680 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  cal.  The.    **
15690 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
156a0 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66  ts verify this f
156b0 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  act. */.    asse
156c0 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54  rt( WO_EQ==SQLIT
156d0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
156e0 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73  NT_EQ );.    ass
156f0 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49  ert( WO_LT==SQLI
15700 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
15710 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73  INT_LT );.    as
15720 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c  sert( WO_LE==SQL
15730 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
15740 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61  AINT_LE );.    a
15750 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51  ssert( WO_GT==SQ
15760 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
15770 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20  RAINT_GT );.    
15780 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53  assert( WO_GE==S
15790 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
157a0 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20  TRAINT_GE );.   
157b0 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43   assert( WO_MATC
157c0 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  H==SQLITE_INDEX_
157d0 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48  CONSTRAINT_MATCH
157e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
157f0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
15800 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c   & (WO_IN|WO_EQ|
15810 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
15820 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48  T|WO_GE|WO_MATCH
15830 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20  ) );.    j++;.  
15840 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
15850 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
15860 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
15870 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
15880 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f  pExpr;.    pIdxO
15890 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
158a0 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
158b0 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  mn;.    pIdxOrde
158c0 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f  rBy[i].desc = pO
158d0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
158e0 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72  tOrder;.  }..  r
158f0 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a  eturn pIdxInfo;.
15900 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62  }../*.** The tab
15910 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65  le object refere
15920 6e 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68  nce passed as th
15930 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
15940 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
15950 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65  on.** must repre
15960 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74  sent a virtual t
15970 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
15980 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ion invokes the 
15990 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20  xBestIndex().** 
159a0 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
159b0 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68  rtual table with
159c0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
159d0 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74  ex_info object t
159e0 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20  hat.** comes in 
159f0 61 73 20 74 68 65 20 33 72 64 20 61 72 67 75 6d  as the 3rd argum
15a00 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
15a10 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
15a20 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
15a30 70 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61  pParse is popula
15a40 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ted with an erro
15a50 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a  r message and a.
15a60 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
15a70 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
15a80 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
15a90 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
15aa0 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f  output.** part o
15ab0 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  f the sqlite3_in
15ac0 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
15ad0 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c  re is left popul
15ae0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ated..**.** Whet
15af0 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72  her or not an er
15b00 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ror is returned,
15b10 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
15b20 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
15b30 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
15b40 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d  entually free p-
15b50 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65  >idxStr if p->ne
15b60 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69  edToFreeIdxStr i
15b70 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74  ndicates.** that
15b80 20 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65   this is require
15b90 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
15ba0 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50   vtabBestIndex(P
15bb0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
15bc0 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74  ble *pTab, sqlit
15bd0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
15be0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  ){.  sqlite3_vta
15bf0 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74  b *pVtab = sqlit
15c00 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72  e3GetVTable(pPar
15c10 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70  se->db, pTab)->p
15c20 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vtab;.  int i;. 
15c30 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43   int rc;..  TRAC
15c40 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b  E_IDX_INPUTS(p);
15c50 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70  .  rc = pVtab->p
15c60 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64  Module->xBestInd
15c70 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20  ex(pVtab, p);.  
15c80 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
15c90 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  S(p);..  if( rc!
15ca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15cb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15cc0 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
15cd0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
15ce0 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
15cf0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74    }else if( !pVt
15d00 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20  ab->zErrMsg ){. 
15d10 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
15d20 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
15d30 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
15d40 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (rc));.    }else
15d50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
15d60 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15d70 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72  "%s", pVtab->zEr
15d80 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rMsg);.    }.  }
15d90 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
15da0 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
15db0 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  .  pVtab->zErrMs
15dc0 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  g = 0;..  for(i=
15dd0 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
15de0 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  int; i++){.    i
15df0 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69  f( !p->aConstrai
15e00 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20  nt[i].usable && 
15e10 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
15e20 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
15e30 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
15e40 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15e50 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
15e60 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49  table %s: xBestI
15e70 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e  ndex returned an
15e80 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20   invalid plan", 
15e90 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
15ea0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
15eb0 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a  n pParse->nErr;.
15ec0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
15ed0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
15ee0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a  _VIRTUALTABLE) *
15ef0 2f 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  /...#ifdef SQLIT
15f00 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f  E_ENABLE_STAT3./
15f10 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
15f20 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20  e location of a 
15f30 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20 61  particular key a
15f40 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e  mong all keys in
15f50 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53   an.** index.  S
15f60 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
15f70 20 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f 6c   in aStat as fol
15f80 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61  lows:.**.**    a
15f90 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73 74  Stat[0]      Est
15fa0 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  . number of rows
15fb0 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61 6c 0a   less than pVal.
15fc0 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 20  **    aStat[1]  
15fd0 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20      Est. number 
15fe0 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74 6f  of rows equal to
15ff0 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75   pVal.**.** Retu
16000 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
16010 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  success..*/.stat
16020 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53  ic int whereKeyS
16030 74 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70  tats(.  Parse *p
16040 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
16050 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
16060 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
16070 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
16080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
16090 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72  ndex to consider
160a0 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20   domain of */.  
160b0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
160c0 56 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 56  Val,        /* V
160d0 61 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64 65 72  alue to consider
160e0 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55   */.  int roundU
160f0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
16100 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66    /* Round up if
16110 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f   true.  Round do
16120 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20  wn if false */. 
16130 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20   tRowcnt *aStat 
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16150 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74 74  OUT: stats writt
16160 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  en here */.){.  
16170 74 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 49 6e 64  tRowcnt n;.  Ind
16180 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c  exSample *aSampl
16190 65 3b 0a 20 20 69 6e 74 20 69 2c 20 65 54 79 70  e;.  int i, eTyp
161a0 65 3b 0a 20 20 69 6e 74 20 69 73 45 71 20 3d 20  e;.  int isEq = 
161b0 30 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 64 6f  0;.  i64 v;.  do
161c0 75 62 6c 65 20 72 2c 20 72 53 3b 0a 0a 20 20 61  uble r, rS;..  a
161d0 73 73 65 72 74 28 20 72 6f 75 6e 64 55 70 3d 3d  ssert( roundUp==
161e0 30 20 7c 7c 20 72 6f 75 6e 64 55 70 3d 3d 31 20  0 || roundUp==1 
161f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
16200 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  x->nSample>0 );.
16210 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 29 20    if( pVal==0 ) 
16220 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
16230 52 4f 52 3b 0a 20 20 6e 20 3d 20 70 49 64 78 2d  ROR;.  n = pIdx-
16240 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20  >aiRowEst[0];.  
16250 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e  aSample = pIdx->
16260 61 53 61 6d 70 6c 65 3b 0a 20 20 65 54 79 70 65  aSample;.  eType
16270 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
16280 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a 20 20  _type(pVal);..  
16290 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  if( eType==SQLIT
162a0 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  E_INTEGER ){.   
162b0 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   v = sqlite3_val
162c0 75 65 5f 69 6e 74 36 34 28 70 56 61 6c 29 3b 0a  ue_int64(pVal);.
162d0 20 20 20 20 72 20 3d 20 28 69 36 34 29 76 3b 0a      r = (i64)v;.
162e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
162f0 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b  Idx->nSample; i+
16300 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
16310 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d  ample[i].eType==
16320 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f  SQLITE_NULL ) co
16330 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
16340 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  ( aSample[i].eTy
16350 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  pe>=SQLITE_TEXT 
16360 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
16370 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  f( aSample[i].eT
16380 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  ype==SQLITE_INTE
16390 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 69  GER ){.        i
163a0 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e  f( aSample[i].u.
163b0 69 3e 3d 76 20 29 7b 0a 20 20 20 20 20 20 20 20  i>=v ){.        
163c0 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65    isEq = aSample
163d0 5b 69 5d 2e 75 2e 69 3d 3d 76 3b 0a 20 20 20 20  [i].u.i==v;.    
163e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
163f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
16400 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
16410 72 74 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  rt( aSample[i].e
16420 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f  Type==SQLITE_FLO
16430 41 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AT );.        if
16440 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72  ( aSample[i].u.r
16450 3e 3d 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=r ){.         
16460 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b   isEq = aSample[
16470 69 5d 2e 75 2e 72 3d 3d 72 3b 0a 20 20 20 20 20  i].u.r==r;.     
16480 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16490 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
164a0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
164b0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c  eType==SQLITE_FL
164c0 4f 41 54 20 29 7b 0a 20 20 20 20 72 20 3d 20 73  OAT ){.    r = s
164d0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
164e0 62 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 66  ble(pVal);.    f
164f0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
16500 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20  nSample; i++){. 
16510 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65       if( aSample
16520 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54  [i].eType==SQLIT
16530 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  E_NULL ) continu
16540 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61  e;.      if( aSa
16550 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53  mple[i].eType>=S
16560 51 4c 49 54 45 5f 54 45 58 54 20 29 20 62 72 65  QLITE_TEXT ) bre
16570 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53  ak;.      if( aS
16580 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d  ample[i].eType==
16590 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a  SQLITE_FLOAT ){.
165a0 20 20 20 20 20 20 20 20 72 53 20 3d 20 61 53 61          rS = aSa
165b0 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3b 0a 20 20 20  mple[i].u.r;.   
165c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
165d0 20 20 72 53 20 3d 20 61 53 61 6d 70 6c 65 5b 69    rS = aSample[i
165e0 5d 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a 20  ].u.i;.      }. 
165f0 20 20 20 20 20 69 66 28 20 72 53 3e 3d 72 20 29       if( rS>=r )
16600 7b 0a 20 20 20 20 20 20 20 20 69 73 45 71 20 3d  {.        isEq =
16610 20 72 53 3d 3d 72 3b 0a 20 20 20 20 20 20 20 20   rS==r;.        
16620 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
16630 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
16640 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e   eType==SQLITE_N
16650 55 4c 4c 20 29 7b 0a 20 20 20 20 69 20 3d 20 30  ULL ){.    i = 0
16660 3b 0a 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c  ;.    if( aSampl
16670 65 5b 30 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49  e[0].eType==SQLI
16680 54 45 5f 4e 55 4c 4c 20 29 20 69 73 45 71 20 3d  TE_NULL ) isEq =
16690 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
166a0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
166b0 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20 65  SQLITE_TEXT || e
166c0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  Type==SQLITE_BLO
166d0 42 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  B );.    for(i=0
166e0 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ; i<pIdx->nSampl
166f0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; i++){.      i
16700 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  f( aSample[i].eT
16710 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype==SQLITE_TEXT
16720 20 7c 7c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65   || aSample[i].e
16730 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  Type==SQLITE_BLO
16740 42 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  B ){.        bre
16750 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
16760 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 49 64 78  }.    if( i<pIdx
16770 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 20 20 20 20  ->nSample ){    
16780 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33    .      sqlite3
16790 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
167a0 62 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  b;.      CollSeq
167b0 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 63   *pColl;.      c
167c0 6f 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20 20 20  onst u8 *z;.    
167d0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
167e0 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20  ITE_BLOB ){.    
167f0 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75      z = (const u
16800 38 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  8 *)sqlite3_valu
16810 65 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a 20 20  e_blob(pVal);.  
16820 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62        pColl = db
16830 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
16840 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
16850 6c 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  ll->enc==SQLITE_
16860 55 54 46 38 20 29 3b 0a 20 20 20 20 20 20 7d 65  UTF8 );.      }e
16870 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  lse{.        pCo
16880 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
16890 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 53  ollSeq(pParse, S
168a0 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 2a  QLITE_UTF8, 0, *
168b0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20  pIdx->azColl);. 
168c0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
168d0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
168e0 6e 63 65 20 77 61 73 20 75 6e 61 76 61 69 6c 61  nce was unavaila
168f0 62 6c 65 2c 20 77 65 20 73 68 6f 75 6c 64 20 68  ble, we should h
16900 61 76 65 20 66 61 69 6c 65 64 0a 20 20 20 20 20  ave failed.     
16910 20 20 20 2a 2a 20 6c 6f 6e 67 20 61 67 6f 20 61     ** long ago a
16920 6e 64 20 6e 65 76 65 72 20 72 65 61 63 68 65 64  nd never reached
16930 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 20 42 75   this point.  Bu
16940 74 20 77 65 27 6c 6c 20 63 68 65 63 6b 20 6a 75  t we'll check ju
16950 73 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  st to.        **
16960 20 62 65 20 64 6f 75 62 6c 79 20 73 75 72 65 2e   be doubly sure.
16970 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
16980 4e 45 56 45 52 28 70 43 6f 6c 6c 3d 3d 30 29 20  NEVER(pColl==0) 
16990 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
169a0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7a  ERROR;.        z
169b0 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a 29 73   = (const u8 *)s
169c0 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
169d0 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  pVal, pColl->enc
169e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
169f0 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  z ){.          r
16a00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
16a10 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  EM;.        }.  
16a20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 20        assert( z 
16a30 26 26 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  && pColl && pCol
16a40 6c 2d 3e 78 43 6d 70 20 29 3b 0a 20 20 20 20 20  l->xCmp );.     
16a50 20 7d 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c   }.      n = sql
16a60 69 74 65 33 56 61 6c 75 65 42 79 74 65 73 28 70  ite3ValueBytes(p
16a70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29  Val, pColl->enc)
16a80 3b 0a 20 20 0a 20 20 20 20 20 20 66 6f 72 28 3b  ;.  .      for(;
16a90 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   i<pIdx->nSample
16aa0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
16ab0 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69  int c;.        i
16ac0 6e 74 20 65 53 61 6d 70 6c 65 74 79 70 65 20 3d  nt eSampletype =
16ad0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
16ae0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  e;.        if( e
16af0 53 61 6d 70 6c 65 74 79 70 65 3c 65 54 79 70 65  Sampletype<eType
16b00 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
16b10 20 20 20 20 20 69 66 28 20 65 53 61 6d 70 6c 65       if( eSample
16b20 74 79 70 65 21 3d 65 54 79 70 65 20 29 20 62 72  type!=eType ) br
16b30 65 61 6b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  eak;.#ifndef SQL
16b40 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
16b50 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
16b60 2d 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54  ->enc!=SQLITE_UT
16b70 46 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  F8 ){.          
16b80 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20  int nSample;.   
16b90 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 61         char *zSa
16ba0 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 55 74  mple = sqlite3Ut
16bb0 66 38 74 6f 31 36 28 0a 20 20 20 20 20 20 20 20  f8to16(.        
16bc0 20 20 20 20 20 20 64 62 2c 20 70 43 6f 6c 6c 2d        db, pColl-
16bd0 3e 65 6e 63 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  >enc, aSample[i]
16be0 2e 75 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  .u.z, aSample[i]
16bf0 2e 6e 42 79 74 65 2c 20 26 6e 53 61 6d 70 6c 65  .nByte, &nSample
16c00 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
16c10 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 53 61          if( !zSa
16c20 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  mple ){.        
16c30 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
16c40 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
16c50 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
16c60 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
16c70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
16c80 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c         c = pColl
16c90 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
16ca0 73 65 72 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a 53  ser, nSample, zS
16cb0 61 6d 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20 20  ample, n, z);.  
16cc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
16cd0 62 46 72 65 65 28 64 62 2c 20 7a 53 61 6d 70 6c  bFree(db, zSampl
16ce0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
16cf0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  e.#endif.       
16d00 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d   {.          c =
16d10 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
16d20 6c 6c 2d 3e 70 55 73 65 72 2c 20 61 53 61 6d 70  ll->pUser, aSamp
16d30 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 61 53 61  le[i].nByte, aSa
16d40 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c 20  mple[i].u.z, n, 
16d50 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  z);.        }.  
16d60 20 20 20 20 20 20 69 66 28 20 63 3e 3d 30 20 29        if( c>=0 )
16d70 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
16d80 63 3d 3d 30 20 29 20 69 73 45 71 20 3d 20 31 3b  c==0 ) isEq = 1;
16d90 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
16da0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16db0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
16dc0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
16dd0 74 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73  t, aSample[i] is
16de0 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c   the first sampl
16df0 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
16e00 72 20 74 68 61 6e 0a 20 20 2a 2a 20 6f 72 20 65  r than.  ** or e
16e10 71 75 61 6c 20 74 6f 20 70 56 61 6c 2e 20 20 4f  qual to pVal.  O
16e20 72 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53  r if i==pIdx->nS
16e30 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 6c 6c 20  ample, then all 
16e40 73 61 6d 70 6c 65 73 20 61 72 65 20 6c 65 73 73  samples are less
16e50 0a 20 20 2a 2a 20 74 68 61 6e 20 70 56 61 6c 2e  .  ** than pVal.
16e60 20 20 49 66 20 61 53 61 6d 70 6c 65 5b 69 5d 3d    If aSample[i]=
16e70 3d 70 56 61 6c 2c 20 74 68 65 6e 20 69 73 45 71  =pVal, then isEq
16e80 3d 3d 31 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ==1..  */.  if( 
16e90 69 73 45 71 20 29 7b 0a 20 20 20 20 61 73 73 65  isEq ){.    asse
16ea0 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d  rt( i<pIdx->nSam
16eb0 70 6c 65 20 29 3b 0a 20 20 20 20 61 53 74 61 74  ple );.    aStat
16ec0 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  [0] = aSample[i]
16ed0 2e 6e 4c 74 3b 0a 20 20 20 20 61 53 74 61 74 5b  .nLt;.    aStat[
16ee0 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  1] = aSample[i].
16ef0 6e 45 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nEq;.  }else{.  
16f00 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72    tRowcnt iLower
16f10 2c 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b 0a  , iUpper, iGap;.
16f20 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a      if( i==0 ){.
16f30 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30        iLower = 0
16f40 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d  ;.      iUpper =
16f50 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 6e 4c 74 3b   aSample[0].nLt;
16f60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16f70 20 20 69 55 70 70 65 72 20 3d 20 69 3e 3d 70 49    iUpper = i>=pI
16f80 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e 20  dx->nSample ? n 
16f90 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74  : aSample[i].nLt
16fa0 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d  ;.      iLower =
16fb0 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 45   aSample[i-1].nE
16fc0 71 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d  q + aSample[i-1]
16fd0 2e 6e 4c 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  .nLt;.    }.    
16fe0 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d  aStat[1] = pIdx-
16ff0 3e 61 76 67 45 71 3b 0a 20 20 20 20 69 66 28 20  >avgEq;.    if( 
17000 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29  iLower>=iUpper )
17010 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 30  {.      iGap = 0
17020 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17030 20 20 20 69 47 61 70 20 3d 20 69 55 70 70 65 72     iGap = iUpper
17040 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d   - iLower;.    }
17050 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70  .    if( roundUp
17060 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d   ){.      iGap =
17070 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20   (iGap*2)/3;.   
17080 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
17090 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20  ap = iGap/3;.   
170a0 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20   }.    aStat[0] 
170b0 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b  = iLower + iGap;
170c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
170d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
170e0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
170f0 4c 45 5f 53 54 41 54 33 20 2a 2f 0a 0a 2f 2a 0a  LE_STAT3 */../*.
17100 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e  ** If expression
17110 20 70 45 78 70 72 20 72 65 70 72 65 73 65 6e 74   pExpr represent
17120 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
17130 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f  e, set *pp to po
17140 69 6e 74 20 74 6f 0a 2a 2a 20 61 6e 20 73 71 6c  int to.** an sql
17150 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
17160 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
17170 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2c 20  the same value, 
17180 77 69 74 68 20 61 66 66 69 6e 69 74 79 0a 2a 2a  with affinity.**
17190 20 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f 20   aff applied to 
171a0 69 74 2c 20 62 65 66 6f 72 65 20 72 65 74 75 72  it, before retur
171b0 6e 69 6e 67 2e 20 49 74 20 69 73 20 74 68 65 20  ning. It is the 
171c0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
171d0 66 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  f the .** caller
171e0 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72   to eventually r
171f0 65 6c 65 61 73 65 20 74 68 69 73 20 73 74 72 75  elease this stru
17200 63 74 75 72 65 20 62 79 20 70 61 73 73 69 6e 67  cture by passing
17210 20 69 74 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74   it to .** sqlit
17220 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a  e3ValueFree()..*
17230 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
17240 65 6e 74 20 70 61 72 73 65 20 69 73 20 61 20 72  ent parse is a r
17250 65 63 6f 6d 70 69 6c 65 20 28 73 71 6c 69 74 65  ecompile (sqlite
17260 33 52 65 70 72 65 70 61 72 65 28 29 29 20 61 6e  3Reprepare()) an
17270 64 20 70 45 78 70 72 0a 2a 2a 20 69 73 20 61 6e  d pExpr.** is an
17280 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 74 68   SQL variable th
17290 61 74 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73  at currently has
172a0 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
172b0 65 20 62 6f 75 6e 64 20 74 6f 20 69 74 2c 0a 2a  e bound to it,.*
172c0 2a 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  * create an sqli
172d0 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
172e0 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
172f0 68 69 73 20 76 61 6c 75 65 2c 20 61 67 61 69 6e  his value, again
17300 20 77 69 74 68 0a 2a 2a 20 61 66 66 69 6e 69 74   with.** affinit
17310 79 20 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f  y aff applied to
17320 20 69 74 2c 20 69 6e 73 74 65 61 64 2e 0a 2a 2a   it, instead..**
17330 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 6f  .** If neither o
17340 66 20 74 68 65 20 61 62 6f 76 65 20 61 70 70 6c  f the above appl
17350 79 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55  y, set *pp to NU
17360 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  LL..**.** If an 
17370 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
17380 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
17390 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  de. Otherwise, S
173a0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66  QLITE_OK..*/.#if
173b0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
173c0 45 5f 53 54 41 54 33 0a 73 74 61 74 69 63 20 69  E_STAT3.static i
173d0 6e 74 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72  nt valueFromExpr
173e0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
173f0 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  e, .  Expr *pExp
17400 72 2c 20 0a 20 20 75 38 20 61 66 66 2c 20 0a 20  r, .  u8 aff, . 
17410 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
17420 2a 70 70 0a 29 7b 0a 20 20 69 66 28 20 70 45 78  *pp.){.  if( pEx
17430 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  pr->op==TK_VARIA
17440 42 4c 45 0a 20 20 20 7c 7c 20 28 70 45 78 70 72  BLE.   || (pExpr
17450 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
17460 52 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 32 3d  R && pExpr->op2=
17470 3d 54 4b 5f 56 41 52 49 41 42 4c 45 29 0a 20 20  =TK_VARIABLE).  
17480 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 72 20  ){.    int iVar 
17490 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
174a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
174b0 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72  eSetVarmask(pPar
174c0 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61 72 29  se->pVdbe, iVar)
174d0 3b 0a 20 20 20 20 2a 70 70 20 3d 20 73 71 6c 69  ;.    *pp = sqli
174e0 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56  te3VdbeGetBoundV
174f0 61 6c 75 65 28 70 50 61 72 73 65 2d 3e 70 52 65  alue(pParse->pRe
17500 70 72 65 70 61 72 65 2c 20 69 56 61 72 2c 20 61  prepare, iVar, a
17510 66 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ff);.    return 
17520 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
17530 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
17540 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61  alueFromExpr(pPa
17550 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
17560 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 61 66 66  SQLITE_UTF8, aff
17570 2c 20 70 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  , pp);.}.#endif.
17580 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
17590 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
175a0 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  estimate the num
175b0 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
175c0 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64   will be visited
175d0 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20  .** by scanning 
175e0 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72  an index for a r
175f0 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20  ange of values. 
17600 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61  The range may ha
17610 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62  ve an upper.** b
17620 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f  ound, a lower bo
17630 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68  und, or both. Th
17640 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
17650 65 72 6d 73 20 74 68 61 74 20 73 65 74 20 74 68  erms that set th
17660 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c  e upper.** and l
17670 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20  ower bounds are 
17680 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20 70  represented by p
17690 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
176a0 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46   respectively. F
176b0 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61  or.** example, a
176c0 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64  ssuming that ind
176d0 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29  ex p is on t1(a)
176e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
176f0 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20  OM t1 WHERE a > 
17700 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a  ? AND a < ? ....
17710 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
17720 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20        |_____|   
17730 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20  |_____|.**      
17740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17750 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20   |         |.** 
17760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17770 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55      pLower    pU
17780 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69  pper.**.** If ei
17790 74 68 65 72 20 6f 66 20 74 68 65 20 75 70 70 65  ther of the uppe
177a0 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64  r or lower bound
177b0 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c   is not present,
177c0 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61   then NULL is pa
177d0 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65  ssed in.** place
177e0 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f   of the correspo
177f0 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e  nding WhereTerm.
17800 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 71 20 70  .**.** The nEq p
17810 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73  arameter is pass
17820 65 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  ed the index of 
17830 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
17840 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 0a   subject to the.
17850 2a 2a 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  ** range constra
17860 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c  int. Or, equival
17870 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65  ently, the numbe
17880 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20 63 6f  r of equality co
17890 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 6f 70 74  nstraints.** opt
178a0 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70 72  imized by the pr
178b0 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61  oposed index sca
178c0 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  n. For example, 
178d0 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70  assuming index p
178e0 20 69 73 0a 2a 2a 20 6f 6e 20 74 31 28 61 2c 20   is.** on t1(a, 
178f0 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20  b), and the SQL 
17900 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  query is:.**.** 
17910 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
17920 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20  ERE a = ? AND b 
17930 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e  > ? AND b < ? ..
17940 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
17950 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
17960 64 20 74 68 65 20 76 61 6c 75 65 20 31 20 28 61  d the value 1 (a
17970 73 20 74 68 65 20 72 61 6e 67 65 20 72 65 73 74  s the range rest
17980 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 0a 2a  ricted column,.*
17990 2a 20 62 2c 20 69 73 20 74 68 65 20 73 65 63 6f  * b, is the seco
179a0 6e 64 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  nd left-most col
179b0 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
179c0 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75  ). Or, if the qu
179d0 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery is:.**.**   
179e0 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
179f0 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20  E a > ? AND a < 
17a00 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ? ....**.** then
17a10 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65 20 70   nEq should be p
17a20 61 73 73 65 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 54  assed 0..**.** T
17a30 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
17a40 65 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  e is an integer 
17a50 64 69 76 69 73 6f 72 20 74 6f 20 72 65 64 75 63  divisor to reduc
17a60 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 0a  e the estimated.
17a70 2a 2a 20 73 65 61 72 63 68 20 73 70 61 63 65 2e  ** search space.
17a80 20 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75 65    A return value
17a90 20 6f 66 20 31 20 6d 65 61 6e 73 20 74 68 61 74   of 1 means that
17aa0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
17ab0 74 73 20 61 72 65 0a 2a 2a 20 6e 6f 20 68 65 6c  ts are.** no hel
17ac0 70 20 61 74 20 61 6c 6c 2e 20 20 41 20 72 65 74  p at all.  A ret
17ad0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 32 20 6d  urn value of 2 m
17ae0 65 61 6e 73 20 72 61 6e 67 65 20 63 6f 6e 73 74  eans range const
17af0 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20 65 78  raints are.** ex
17b00 70 65 63 74 65 64 20 74 6f 20 72 65 64 75 63 65  pected to reduce
17b10 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
17b20 65 20 62 79 20 68 61 6c 66 2e 20 20 41 6e 64 20  e by half.  And 
17b30 73 6f 20 66 6f 72 74 68 2e 2e 2e 0a 2a 2a 0a 2a  so forth....**.*
17b40 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65  * In the absence
17b50 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33   of sqlite_stat3
17b60 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 65   ANALYZE data, e
17b70 61 63 68 20 72 61 6e 67 65 20 69 6e 65 71 75 61  ach range inequa
17b80 6c 69 74 79 0a 2a 2a 20 72 65 64 75 63 65 73 20  lity.** reduces 
17b90 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
17ba0 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20   by a factor of 
17bb0 34 2e 20 20 48 65 6e 63 65 20 61 20 73 69 6e 67  4.  Hence a sing
17bc0 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 78  le constraint (x
17bd0 3e 3f 29 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  >?).** results i
17be0 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20 34 20  n a return of 4 
17bf0 61 6e 64 20 61 20 72 61 6e 67 65 20 63 6f 6e 73  and a range cons
17c00 74 72 61 69 6e 74 20 28 78 3e 3f 20 41 4e 44 20  traint (x>? AND 
17c10 78 3c 3f 29 20 72 65 73 75 6c 74 73 0a 2a 2a 20  x<?) results.** 
17c20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20 31  in a return of 1
17c30 36 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  6..*/.static int
17c40 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45   whereRangeScanE
17c50 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
17c60 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
17c70 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
17c80 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
17c90 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20  */.  Index *p,  
17ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17cb0 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 69 6e   index containin
17cc0 67 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70  g the range-comp
17cd0 61 72 65 64 20 63 6f 6c 75 6d 6e 3b 20 22 78 22  ared column; "x"
17ce0 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c 20 20   */.  int nEq,  
17cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
17d00 64 65 78 20 69 6e 74 6f 20 70 2d 3e 61 43 6f 6c  dex into p->aCol
17d10 5b 5d 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2d  [] of the range-
17d20 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e 20  compared column 
17d30 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
17d40 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77  pLower,   /* Low
17d50 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
17d60 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32  range. ex: "x>12
17d70 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  3" Might be NULL
17d80 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
17d90 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70  *pUpper,   /* Up
17da0 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  per bound on the
17db0 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34   range. ex: "x<4
17dc0 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  55" Might be NUL
17dd0 4c 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  L */.  WhereCost
17de0 20 2a 70 52 61 6e 67 65 44 69 76 20 2f 2a 20 4f   *pRangeDiv /* O
17df0 55 54 3a 20 52 65 64 75 63 65 20 73 65 61 72 63  UT: Reduce searc
17e00 68 20 73 70 61 63 65 20 62 79 20 74 68 69 73 20  h space by this 
17e10 64 69 76 69 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20  divisor */.){.  
17e20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17e30 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  OK;..#ifdef SQLI
17e40 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
17e50 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26  .  if( nEq==0 &&
17e60 20 70 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20 4f   p->nSample && O
17e70 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
17e80 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  ed(pParse->db, S
17e90 51 4c 49 54 45 5f 53 74 61 74 33 29 20 29 7b 0a  QLITE_Stat3) ){.
17ea0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
17eb0 65 20 2a 70 52 61 6e 67 65 56 61 6c 3b 0a 20 20  e *pRangeVal;.  
17ec0 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72    tRowcnt iLower
17ed0 20 3d 20 30 3b 0a 20 20 20 20 74 52 6f 77 63 6e   = 0;.    tRowcn
17ee0 74 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 61 69  t iUpper = p->ai
17ef0 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 74  RowEst[0];.    t
17f00 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20  Rowcnt a[2];.   
17f10 20 75 38 20 61 66 66 20 3d 20 70 2d 3e 70 54 61   u8 aff = p->pTa
17f20 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43  ble->aCol[p->aiC
17f30 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69  olumn[0]].affini
17f40 74 79 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 6f  ty;..    if( pLo
17f50 77 65 72 20 29 7b 0a 20 20 20 20 20 20 45 78 70  wer ){.      Exp
17f60 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65  r *pExpr = pLowe
17f70 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
17f80 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 76 61 6c  ;.      rc = val
17f90 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
17fa0 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26  e, pExpr, aff, &
17fb0 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20  pRangeVal);.    
17fc0 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 77 65    assert( (pLowe
17fd0 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
17fe0 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30  WO_GT|WO_GE))!=0
17ff0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   );.      if( rc
18000 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ==SQLITE_OK.    
18010 20 20 20 26 26 20 77 68 65 72 65 4b 65 79 53 74     && whereKeySt
18020 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
18030 52 61 6e 67 65 56 61 6c 2c 20 30 2c 20 61 29 3d  RangeVal, 0, a)=
18040 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
18050 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77   ){.        iLow
18060 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20  er = a[0];.     
18070 20 20 20 69 66 28 20 28 70 4c 6f 77 65 72 2d 3e     if( (pLower->
18080 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
18090 54 29 21 3d 30 20 29 20 69 4c 6f 77 65 72 20 2b  T)!=0 ) iLower +
180a0 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a  = a[1];.      }.
180b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
180c0 75 65 46 72 65 65 28 70 52 61 6e 67 65 56 61 6c  ueFree(pRangeVal
180d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
180e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
180f0 26 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  & pUpper ){.    
18100 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
18110 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70  pUpper->pExpr->p
18120 52 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20  Right;.      rc 
18130 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  = valueFromExpr(
18140 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61  pParse, pExpr, a
18150 66 66 2c 20 26 70 52 61 6e 67 65 56 61 6c 29 3b  ff, &pRangeVal);
18160 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
18170 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pUpper->eOperato
18180 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  r & (WO_LT|WO_LE
18190 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ))!=0 );.      i
181a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
181b0 0a 20 20 20 20 20 20 20 26 26 20 77 68 65 72 65  .       && where
181c0 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
181d0 20 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20 31   p, pRangeVal, 1
181e0 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  , a)==SQLITE_OK.
181f0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
18200 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 3b 0a   iUpper = a[0];.
18210 20 20 20 20 20 20 20 20 69 66 28 20 28 70 55 70          if( (pUp
18220 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  per->eOperator &
18230 20 57 4f 5f 4c 45 29 21 3d 30 20 29 20 69 55 70   WO_LE)!=0 ) iUp
18240 70 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20  per += a[1];.   
18250 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
18260 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 61 6e  e3ValueFree(pRan
18270 67 65 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  geVal);.    }.  
18280 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18290 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 57 68 65  _OK ){.      Whe
182a0 72 65 43 6f 73 74 20 69 42 61 73 65 20 3d 20 77  reCost iBase = w
182b0 68 65 72 65 43 6f 73 74 28 70 2d 3e 61 69 52 6f  hereCost(p->aiRo
182c0 77 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20  wEst[0]);.      
182d0 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65  if( iUpper>iLowe
182e0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 42 61  r ){.        iBa
182f0 73 65 20 2d 3d 20 77 68 65 72 65 43 6f 73 74 28  se -= whereCost(
18300 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29  iUpper - iLower)
18310 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18320 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 69 42 61  *pRangeDiv = iBa
18330 73 65 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  se;.      WHERET
18340 52 41 43 45 28 30 78 31 30 30 2c 20 28 22 72 61  RACE(0x100, ("ra
18350 6e 67 65 20 73 63 61 6e 20 72 65 67 69 6f 6e 73  nge scan regions
18360 3a 20 25 75 2e 2e 25 75 20 20 64 69 76 3d 25 64  : %u..%u  div=%d
18370 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
18380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
18390 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29  32)iLower, (u32)
183a0 69 55 70 70 65 72 2c 20 2a 70 52 61 6e 67 65 44  iUpper, *pRangeD
183b0 69 76 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  iv));.      retu
183c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
183d0 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
183e0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
183f0 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53  (pParse);.  UNUS
18400 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
18410 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
18420 54 45 52 28 6e 45 71 29 3b 0a 23 65 6e 64 69 66  TER(nEq);.#endif
18430 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65  .  assert( pLowe
18440 72 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 20  r || pUpper );. 
18450 20 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 30 3b   *pRangeDiv = 0;
18460 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 45  .  /* TUNING:  E
18470 61 63 68 20 69 6e 65 71 75 61 6c 69 74 79 20 63  ach inequality c
18480 6f 6e 73 74 72 61 69 6e 74 20 72 65 64 75 63 65  onstraint reduce
18490 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  s the search spa
184a0 63 65 20 34 2d 66 6f 6c 64 2e 0a 20 20 2a 2a 20  ce 4-fold..  ** 
184b0 41 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74  A BETWEEN operat
184c0 6f 72 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 72  or, therefore, r
184d0 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63  educes the searc
184e0 68 20 73 70 61 63 65 20 31 36 2d 66 6f 6c 64 20  h space 16-fold 
184f0 2a 2f 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20  */.  if( pLower 
18500 26 26 20 28 70 4c 6f 77 65 72 2d 3e 77 74 46 6c  && (pLower->wtFl
18510 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
18520 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 61  )==0 ){.    *pRa
18530 6e 67 65 44 69 76 20 2b 3d 20 32 30 3b 20 20 61  ngeDiv += 20;  a
18540 73 73 65 72 74 28 20 32 30 3d 3d 77 68 65 72 65  ssert( 20==where
18550 43 6f 73 74 28 34 29 20 29 3b 0a 20 20 7d 0a 20  Cost(4) );.  }. 
18560 20 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20   if( pUpper ){. 
18570 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20 2b 3d     *pRangeDiv +=
18580 20 32 30 3b 20 20 61 73 73 65 72 74 28 20 32 30   20;  assert( 20
18590 3d 3d 77 68 65 72 65 43 6f 73 74 28 34 29 20 29  ==whereCost(4) )
185a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
185b0 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
185c0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
185d0 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
185e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
185f0 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
18600 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
18610 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79  n.** an equality
18620 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41   constraint x=VA
18630 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68  LUE and where th
18640 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20  at VALUE occurs 
18650 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67  in.** the histog
18660 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20  ram data.  This 
18670 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20  only works when 
18680 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  x is the left-mo
18690 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20  st.** column of 
186a0 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c  an index and sql
186b0 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67  ite_stat3 histog
186c0 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69  ram data is avai
186d0 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61  lable.** for tha
186e0 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70  t index.  When p
186f0 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Expr==NULL that 
18700 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72  means the constr
18710 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53  aint is.** "x IS
18720 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f   NULL" instead o
18730 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a  f "x=VALUE"..**.
18740 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
18750 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
18760 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
18770 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18780 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
18790 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
187a0 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
187b0 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
187c0 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
187d0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
187e0 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
187f0 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
18800 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
18810 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
18820 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
18830 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
18840 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
18850 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
18860 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
18870 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
18880 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
18890 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
188a0 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
188b0 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
188c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
188d0 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
188e0 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
188f0 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
18900 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
18910 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
18920 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20  */.  Index *p,  
18930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18940 20 69 6e 64 65 78 20 77 68 6f 73 65 20 6c 65 66   index whose lef
18950 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73  t-most column is
18960 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72   pTerm */.  Expr
18970 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
18980 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66   /* Expression f
18990 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20  or VALUE in the 
189a0 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69  x=VALUE constrai
189b0 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  nt */.  tRowcnt 
189c0 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20  *pnRow       /* 
189d0 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
189e0 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
189f0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
18a00 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 68 73 20  te3_value *pRhs 
18a10 3d 20 30 3b 20 20 2f 2a 20 56 41 4c 55 45 20 6f  = 0;  /* VALUE o
18a20 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  n right-hand sid
18a30 65 20 6f 66 20 70 54 65 72 6d 20 2a 2f 0a 20 20  e of pTerm */.  
18a40 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20 20  u8 aff;         
18a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
18a60 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a  umn affinity */.
18a70 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
18a80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18a90 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
18aa0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
18ab0 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20  cnt a[2];       
18ac0 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74        /* Statist
18ad0 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ics */..  assert
18ae0 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20  ( p->aSample!=0 
18af0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
18b00 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61  nSample>0 );.  a
18b10 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e  ff = p->pTable->
18b20 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e  aCol[p->aiColumn
18b30 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  [0]].affinity;. 
18b40 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20   if( pExpr ){.  
18b50 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d    rc = valueFrom
18b60 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
18b70 70 72 2c 20 61 66 66 2c 20 26 70 52 68 73 29 3b  pr, aff, &pRhs);
18b80 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
18b90 74 6f 20 77 68 65 72 65 45 71 75 61 6c 53 63 61  to whereEqualSca
18ba0 6e 45 73 74 5f 63 61 6e 63 65 6c 3b 0a 20 20 7d  nEst_cancel;.  }
18bb0 65 6c 73 65 7b 0a 20 20 20 20 70 52 68 73 20 3d  else{.    pRhs =
18bc0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
18bd0 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
18be0 7d 0a 20 20 69 66 28 20 70 52 68 73 3d 3d 30 20  }.  if( pRhs==0 
18bf0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
18c00 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 72 63 20 3d  NOTFOUND;.  rc =
18c10 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
18c20 50 61 72 73 65 2c 20 70 2c 20 70 52 68 73 2c 20  Parse, p, pRhs, 
18c30 30 2c 20 61 29 3b 0a 20 20 69 66 28 20 72 63 3d  0, a);.  if( rc=
18c40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18c50 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
18c60 30 30 2c 28 22 65 71 75 61 6c 69 74 79 20 73 63  00,("equality sc
18c70 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e  an regions: %d\n
18c80 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a  ", (int)a[1]));.
18c90 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31      *pnRow = a[1
18ca0 5d 3b 0a 20 20 7d 0a 77 68 65 72 65 45 71 75 61  ];.  }.whereEqua
18cb0 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3a  lScanEst_cancel:
18cc0 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
18cd0 72 65 65 28 70 52 68 73 29 3b 0a 20 20 72 65 74  ree(pRhs);.  ret
18ce0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
18cf0 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
18d00 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29  TE_ENABLE_STAT3)
18d10 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
18d20 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
18d30 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
18d40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
18d50 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
18d60 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
18d70 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72  .** an IN constr
18d80 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 72  aint where the r
18d90 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
18da0 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
18db0 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f  r.** is a list o
18dc0 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70  f values.  Examp
18dd0 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  le:.**.**       
18de0 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32   WHERE x IN (1,2
18df0 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74  ,3,4).**.** Writ
18e00 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  e the estimated 
18e10 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a  row count into *
18e20 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  pnRow and return
18e30 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20   SQLITE_OK. .** 
18e40 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  If unable to mak
18e50 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c  e an estimate, l
18e60 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68  eave *pnRow unch
18e70 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e  anged and return
18e80 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  .** non-zero..**
18e90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18ea0 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20   can fail if it 
18eb0 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61  is unable to loa
18ec0 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  d a collating se
18ed0 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72  quence.** requir
18ee0 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f  ed for string co
18ef0 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20  mparison, or if 
18f00 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
18f10 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  te memory.** for
18f20 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f   a UTF conversio
18f30 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  n required for c
18f40 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20  omparison.  The 
18f50 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a  error is stored.
18f60 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  ** in the pParse
18f70 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
18f80 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 49  tatic int whereI
18f90 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  nScanEst(.  Pars
18fa0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
18fb0 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
18fc0 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
18fd0 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
18fe0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
18ff0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f  /* The index who
19000 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  se left-most col
19010 75 6d 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a  umn is pTerm */.
19020 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
19030 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61  t,     /* The va
19040 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20  lue list on the 
19050 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31  RHS of "x IN (v1
19060 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a  ,v2,v3,...)" */.
19070 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77    tRowcnt *pnRow
19080 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
19090 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20  the revised row 
190a0 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f  estimate here */
190b0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
190c0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a  QLITE_OK;     /*
190d0 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74   Subfunction ret
190e0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52  urn code */.  tR
190f0 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20 20  owcnt nEst;     
19100 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
19110 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69  of rows for a si
19120 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74  ngle term */.  t
19130 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d  Rowcnt nRowEst =
19140 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65 73   0;    /* New es
19150 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
19160 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a  mber of rows */.
19170 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
19180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
19190 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
191a0 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70  assert( p->aSamp
191b0 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  le!=0 );.  for(i
191c0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
191d0 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  K && i<pList->nE
191e0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  xpr; i++){.    n
191f0 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73  Est = p->aiRowEs
19200 74 5b 30 5d 3b 0a 20 20 20 20 72 63 20 3d 20 77  t[0];.    rc = w
19210 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
19220 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4c 69 73  (pParse, p, pLis
19230 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26  t->a[i].pExpr, &
19240 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45  nEst);.    nRowE
19250 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 7d 0a  st += nEst;.  }.
19260 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19270 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  _OK ){.    if( n
19280 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61 69 52 6f  RowEst > p->aiRo
19290 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f 77 45 73  wEst[0] ) nRowEs
192a0 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b  t = p->aiRowEst[
192b0 30 5d 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d  0];.    *pnRow =
192c0 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48   nRowEst;.    WH
192d0 45 52 45 54 52 41 43 45 28 30 78 31 30 30 2c 28  ERETRACE(0x100,(
192e0 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65  "IN row estimate
192f0 3a 20 65 73 74 3d 25 67 5c 6e 22 2c 20 6e 52 6f  : est=%g\n", nRo
19300 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 72 65  wEst));.  }.  re
19310 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
19320 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
19330 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
19340 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61  ) */../*.** Disa
19350 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68  ble a term in th
19360 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
19370 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20   Except, do not 
19380 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d  disable the term
19390 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f  .** if it contro
193a0 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  ls a LEFT OUTER 
193b0 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20  JOIN and it did 
193c0 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e  not originate in
193d0 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53   the ON.** or US
193e0 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ING clause of th
193f0 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43  at join..**.** C
19400 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d  onsider the term
19410 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68   t2.z='ok' in th
19420 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
19430 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  ies:.**.**   (1)
19440 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
19450 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
19460 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45  ON t1.a=t2.x WHE
19470 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20  RE t2.z='ok'.** 
19480 20 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20    (2)  SELECT * 
19490 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
194a0 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
194b0 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
194c0 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54  **   (3)  SELECT
194d0 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57   * FROM t1, t2 W
194e0 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41  HERE t1.a=t2.x A
194f0 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a  ND t2.z='ok'.**.
19500 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27  ** The t2.z='ok'
19510 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
19520 74 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75  the in (2) becau
19530 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73  se it originates
19540 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c  .** in the ON cl
19550 61 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20  ause.  The term 
19560 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  is disabled in (
19570 33 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73  3) because it is
19580 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20   not part.** of 
19590 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
195a0 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20  N.  In (1), the 
195b0 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61  term is not disa
195c0 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61  bled..**.** Disa
195d0 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75  bling a term cau
195e0 73 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f  ses that term to
195f0 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69   not be tested i
19600 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  n the inner loop
19610 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  .** of the join.
19620 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61    Disabling is a
19630 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
19640 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20   When terms are 
19650 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20  satisfied.** by 
19660 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73 61  indices, we disa
19670 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76  ble them to prev
19680 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65  ent redundant te
19690 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72  sts in the inner
196a0 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f  .** loop.  We wo
196b0 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72  uld get the corr
196c0 65 63 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e  ect results if n
196d0 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76 65 72  othing were ever
196e0 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75   disabled,.** bu
196f0 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75  t joins might ru
19700 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65  n a little slowe
19710 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69 73  r.  The trick is
19720 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d   to disable as m
19730 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e  uch.** as we can
19740 20 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69   without disabli
19750 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66  ng too much.  If
19760 20 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20   we disabled in 
19770 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a  (1), we'd get.**
19780 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65   the wrong answe
19790 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  r.  See ticket #
197a0 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  813..*/.static v
197b0 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28  oid disableTerm(
197c0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
197d0 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70  el, WhereTerm *p
197e0 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65  Term){.  if( pTe
197f0 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54 65  rm.      && (pTe
19800 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
19810 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20  RM_CODED)==0.   
19820 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69     && (pLevel->i
19830 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45  LeftJoin==0 || E
19840 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
19850 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
19860 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a  FromJoin)).  ){.
19870 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
19880 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
19890 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
198a0 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20  >iParent>=0 ){. 
198b0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
198c0 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d  pOther = &pTerm-
198d0 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69  >pWC->a[pTerm->i
198e0 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69  Parent];.      i
198f0 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43  f( (--pOther->nC
19900 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  hild)==0 ){.    
19910 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
19920 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b  pLevel, pOther);
19930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19940 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
19950 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79 20   an OP_Affinity 
19960 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79 20  opcode to apply 
19970 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  the column affin
19980 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66 0a  ity string zAff.
19990 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67 69  ** to the n regi
199a0 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
199b0 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41  t base. .**.** A
199c0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
199d0 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  n, SQLITE_AFF_NO
199e0 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68 69 63  NE entries (whic
199f0 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74  h are no-ops) at
19a00 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e   the.** beginnin
19a10 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66  g and end of zAf
19a20 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20 20  f are ignored.  
19a30 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  If all entries i
19a40 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53 51  n zAff are.** SQ
19a50 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74  LITE_AFF_NONE, t
19a60 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74 73  hen no code gets
19a70 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a   generated..**.*
19a80 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
19a90 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f 70  akes its own cop
19aa0 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68 61  y of zAff so tha
19ab0 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  t the caller is 
19ac0 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66  free.** to modif
19ad0 79 20 7a 41 66 66 20 61 66 74 65 72 20 74 68 69  y zAff after thi
19ae0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
19af0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
19b00 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e  d codeApplyAffin
19b10 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ity(Parse *pPars
19b20 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e 74  e, int base, int
19b30 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29 7b   n, char *zAff){
19b40 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
19b50 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
19b60 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20  ( zAff==0 ){.   
19b70 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
19b80 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
19b90 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d );.    return;
19ba0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 76  .  }.  assert( v
19bb0 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a  !=0 );..  /* Adj
19bc0 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20 74  ust base and n t
19bd0 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c 49  o skip over SQLI
19be0 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72  TE_AFF_NONE entr
19bf0 69 65 73 20 61 74 20 74 68 65 20 62 65 67 69 6e  ies at the begin
19c00 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e  ning.  ** and en
19c10 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69 74  d of the affinit
19c20 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20  y string..  */. 
19c30 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a   while( n>0 && z
19c40 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41  Aff[0]==SQLITE_A
19c50 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e  FF_NONE ){.    n
19c60 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a  --;.    base++;.
19c70 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a      zAff++;.  }.
19c80 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20    while( n>1 && 
19c90 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54  zAff[n-1]==SQLIT
19ca0 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
19cb0 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    n--;.  }..  /*
19cc0 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66 66   Code the OP_Aff
19cd0 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66 20  inity opcode if 
19ce0 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69 6e  there is anythin
19cf0 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f  g left to do. */
19d00 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
19d10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19d20 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op2(v, OP_Affini
19d30 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20  ty, base, n);.  
19d40 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
19d50 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66  ngeP4(v, -1, zAf
19d60 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  f, n);.    sqlit
19d70 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
19d80 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
19d90 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a  , base, n);.  }.
19da0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
19db0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69  te code for a si
19dc0 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65  ngle equality te
19dd0 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
19de0 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61  clause.  An equa
19df0 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e  lity.** term can
19e00 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78 70   be either X=exp
19e10 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e  r or X IN (...).
19e20 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65 20     pTerm is the 
19e30 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63  term to be .** c
19e40 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oded..**.** The 
19e50 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f  current value fo
19e60 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  r the constraint
19e70 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69   is left in regi
19e80 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a  ster iReg..**.**
19e90 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e   For a constrain
19ea0 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d  t of the form X=
19eb0 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65 73  expr, the expres
19ec0 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65  sion is evaluate
19ed0 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73  d and its.** res
19ee0 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74  ult is left on t
19ef0 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63  he stack.  For c
19f00 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68  onstraints of th
19f10 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e  e form X IN (...
19f20 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ).** this routin
19f30 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70  e sets up a loop
19f40 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61   that will itera
19f50 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75  te over all valu
19f60 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74  es of X..*/.stat
19f70 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61 6c  ic int codeEqual
19f80 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ityTerm(.  Parse
19f90 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
19fa0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
19fb0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
19fc0 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f  Term *pTerm,   /
19fd0 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68  * The term of th
19fe0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
19ff0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
1a000 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
1a010 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76 65 6c  el, /* The level
1a020 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1a030 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b 69  use we are worki
1a040 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ng on */.  int i
1a050 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  Eq,            /
1a060 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 65  * Index of the e
1a070 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77 69 74  quality term wit
1a080 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c 20 2a  hin this level *
1a090 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20  /.  int bRev,   
1a0a0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1a0b0 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72 64 65  for reverse-orde
1a0c0 72 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e 73 20  r IN operations 
1a0d0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65 74  */.  int iTarget
1a0e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 65           /* Atte
1a0f0 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65 73  mpt to leave res
1a100 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65 67  ults in this reg
1a110 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78  ister */.){.  Ex
1a120 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
1a130 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76  pExpr;.  Vdbe *v
1a140 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1a150 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20  ;.  int iReg;   
1a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a170 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
1a180 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20  ng results */.. 
1a190 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65 74   assert( iTarget
1a1a0 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e  >0 );.  if( pX->
1a1b0 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20  op==TK_EQ ){.   
1a1c0 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45   iReg = sqlite3E
1a1d0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
1a1e0 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
1a1f0 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 65  , iTarget);.  }e
1a200 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d  lse if( pX->op==
1a210 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  TK_ISNULL ){.   
1a220 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b   iReg = iTarget;
1a230 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a240 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
1a250 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69 66  l, 0, iReg);.#if
1a260 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a270 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73  _SUBQUERY.  }els
1a280 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65  e{.    int eType
1a290 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a  ;.    int iTab;.
1a2a0 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f      struct InLoo
1a2b0 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68 65 72  p *pIn;.    Wher
1a2c0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70  eLoop *pLoop = p
1a2d0 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a  Level->pWLoop;..
1a2e0 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
1a2f0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1a300 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
1a310 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d  .      && pLoop-
1a320 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
1a330 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f  =0.      && pLoo
1a340 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
1a350 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 45  x->aSortOrder[iE
1a360 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q].    ){.      
1a370 74 65 73 74 63 61 73 65 28 20 69 45 71 3d 3d 30  testcase( iEq==0
1a380 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1a390 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20  se( bRev );.    
1a3a0 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a    bRev = !bRev;.
1a3b0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1a3c0 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  ( pX->op==TK_IN 
1a3d0 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54  );.    iReg = iT
1a3e0 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70 65  arget;.    eType
1a3f0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
1a400 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 58  Index(pParse, pX
1a410 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 65 54  , 0);.    if( eT
1a420 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype==IN_INDEX_IN
1a430 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20  DEX_DESC ){.    
1a440 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76    testcase( bRev
1a450 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d   );.      bRev =
1a460 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20   !bRev;.    }.  
1a470 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61    iTab = pX->iTa
1a480 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ble;.    sqlite3
1a490 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52  VdbeAddOp2(v, bR
1a4a0 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f  ev ? OP_Last : O
1a4b0 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20  P_Rewind, iTab, 
1a4c0 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
1a4d0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1a4e0 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
1a4f0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f  )==0 );.    pLoo
1a500 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  p->wsFlags |= WH
1a510 45 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20 20  ERE_IN_ABLE;.   
1a520 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69   if( pLevel->u.i
1a530 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  n.nIn==0 ){.    
1a540 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78    pLevel->addrNx
1a550 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
1a560 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1a570 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75   }.    pLevel->u
1a580 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70  .in.nIn++;.    p
1a590 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
1a5a0 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c  oop =.       sql
1a5b0 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
1a5c0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
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 2c 0a 20 20 20 20 20 20 20 20 20 20  Loop,.          
1a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a600 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65      sizeof(pLeve
1a610 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b  l->u.in.aInLoop[
1a620 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  0])*pLevel->u.in
1a630 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d  .nIn);.    pIn =
1a640 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
1a650 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70  nLoop;.    if( p
1a660 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20  In ){.      pIn 
1a670 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  += pLevel->u.in.
1a680 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70  nIn - 1;.      p
1a690 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b  In->iCur = iTab;
1a6a0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
1a6b0 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
1a6c0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d   ){.        pIn-
1a6d0 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c  >addrInTop = sql
1a6e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a6f0 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62  , OP_Rowid, iTab
1a700 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  , iReg);.      }
1a710 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49  else{.        pI
1a720 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73  n->addrInTop = s
1a730 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1a740 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
1a750 54 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20  Tab, 0, iReg);. 
1a760 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
1a770 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62  ->eEndLoopOp = b
1a780 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20  Rev ? OP_Prev : 
1a790 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  OP_Next;.      s
1a7a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
1a7b0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69  (v, OP_IsNull, i
1a7c0 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Reg);.    }else{
1a7d0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75  .      pLevel->u
1a7e0 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20  .in.nIn = 0;.   
1a7f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
1a800 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1a810 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72 65  el, pTerm);.  re
1a820 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a  turn iReg;.}../*
1a830 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1a840 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
1a850 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20  uate all == and 
1a860 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66  IN constraints f
1a870 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a  or an.** index..
1a880 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1a890 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c  e, consider tabl
1a8a0 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66  e t1(a,b,c,d,e,f
1a8b0 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31 28  ) with index i1(
1a8c0 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f  a,b,c)..** Suppo
1a8d0 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  se the WHERE cla
1a8e0 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d  use is this:  a=
1a8f0 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32  =5 AND b IN (1,2
1a900 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20  ,3) AND c>5 AND 
1a910 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65  c<10.** The inde
1a920 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73  x has as many as
1a930 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79 20   three equality 
1a940 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74  constraints, but
1a950 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d   in this.** exam
1a960 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20 22  ple, the third "
1a970 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69  c" value is an i
1a980 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f  nequality.  So o
1a990 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73  nly two .** cons
1a9a0 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65  traints are code
1a9b0 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
1a9c0 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63   will generate c
1a9d0 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a  ode to evaluate.
1a9e0 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e  ** a==5 and b IN
1a9f0 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63   (1,2,3).  The c
1aa00 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f  urrent values fo
1aa10 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62  r a and b will b
1aa20 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63  e stored.** in c
1aa30 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73  onsecutive regis
1aa40 74 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64  ters and the ind
1aa50 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ex of the first 
1aa60 72 65 67 69 73 74 65 72 20 69 73 20 72 65 74 75  register is retu
1aa70 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  rned..**.** In t
1aa80 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
1aa90 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68   nEq==2.  But th
1aaa0 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f  is subroutine wo
1aab0 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75  rks for any valu
1aac0 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c  e.** of nEq incl
1aad0 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71  uding 0.  If nEq
1aae0 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ==0, this routin
1aaf0 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f  e is nearly a no
1ab00 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  -op..** The only
1ab10 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69   thing it does i
1ab20 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70  s allocate the p
1ab30 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f  Level->iMem memo
1ab40 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63  ry cell and.** c
1ab50 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66 69 6e  ompute the affin
1ab60 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ity string..**.*
1ab70 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1ab80 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73 20  lways allocates 
1ab90 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d  at least one mem
1aba0 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 74  ory cell and ret
1abb0 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65  urns.** the inde
1abc0 78 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72 79  x of that memory
1abd0 20 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65 20   cell. The code 
1abe0 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68  that.** calls th
1abf0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
1ac00 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20  use that memory 
1ac10 63 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74 68  cell to store th
1ac20 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a  e termination.**
1ac30 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68   key value of th
1ac40 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20  e loop.  If one 
1ac50 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61  or more IN opera
1ac60 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68 65  tors appear, the
1ac70 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
1ac80 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61  e allocates an a
1ac90 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65  dditional nEq me
1aca0 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69  mory cells for i
1acb0 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a  nternal.** use..
1acc0 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
1acd0 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20 69  urning, *pzAff i
1ace0 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
1acf0 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
1ad00 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79 20  ining a.** copy 
1ad10 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66  of the column af
1ad20 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f 66  finity string of
1ad30 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f 63   the index alloc
1ad40 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71  ated using.** sq
1ad50 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e  lite3DbMalloc().
1ad60 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69 65 73   Except, entries
1ad70 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f 66 20   in the copy of 
1ad80 74 68 65 20 73 74 72 69 6e 67 20 61 73 73 6f 63  the string assoc
1ad90 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 65 71  iated.** with eq
1ada0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1adb0 74 73 20 74 68 61 74 20 75 73 65 20 4e 4f 4e 45  ts that use NONE
1adc0 20 61 66 66 69 6e 69 74 79 20 61 72 65 20 73 65   affinity are se
1add0 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  t to.** SQLITE_A
1ade0 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69 73  FF_NONE. This is
1adf0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 51   to deal with SQ
1ae00 4c 20 73 75 63 68 20 61 73 20 74 68 65 20 66 6f  L such as the fo
1ae10 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
1ae20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
1ae30 28 61 20 54 45 58 54 20 50 52 49 4d 41 52 59 20  (a TEXT PRIMARY 
1ae40 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45  KEY, b);.**   SE
1ae50 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
1ae60 20 41 53 20 74 32 2c 20 74 31 20 57 48 45 52 45   AS t2, t1 WHERE
1ae70 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a   t1.a = t2.b;.**
1ae80 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70  .** In the examp
1ae90 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 69 6e  le above, the in
1aea0 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68 61 73  dex on t1(a) has
1aeb0 20 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20   TEXT affinity. 
1aec0 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65  But since.** the
1aed0 20 72 69 67 68 74 20 68 61 6e 64 20 73 69 64 65   right hand side
1aee0 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74 79   of the equality
1aef0 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74 32 2e   constraint (t2.
1af00 62 29 20 68 61 73 20 4e 4f 4e 45 20 61 66 66 69  b) has NONE affi
1af10 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76  nity,.** no conv
1af20 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  ersion should be
1af30 20 61 74 74 65 6d 70 74 65 64 20 62 65 66 6f 72   attempted befor
1af40 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62 20 76  e using a t2.b v
1af50 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f 66 0a  alue as part of.
1af60 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65 61 72  ** a key to sear
1af70 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20 48 65  ch the index. He
1af80 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 62 79  nce the first by
1af90 74 65 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  te in the return
1afa0 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73  ed affinity.** s
1afb0 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20 65 78  tring in this ex
1afc0 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65 20 73  ample would be s
1afd0 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41 46 46  et to SQLITE_AFF
1afe0 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  _NONE..*/.static
1aff0 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75 61   int codeAllEqua
1b000 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72  lityTerms(.  Par
1b010 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1b020 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1b030 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
1b040 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20  Level *pLevel,  
1b050 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64   /* Which nested
1b060 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f   loop of the FRO
1b070 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20  M we are coding 
1b080 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20  */.  int bRev,  
1b090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1b0a0 76 65 72 73 65 20 74 68 65 20 6f 72 64 65 72 20  verse the order 
1b0b0 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  of IN operators 
1b0c0 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52  */.  int nExtraR
1b0d0 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  eg,        /* Nu
1b0e0 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
1b0f0 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63  gisters to alloc
1b100 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ate */.  char **
1b110 70 7a 41 66 66 20 20 20 20 20 20 20 20 20 20 2f  pzAff          /
1b120 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 70 6f  * OUT: Set to po
1b130 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74 79 20  int to affinity 
1b140 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  string */.){.  i
1b150 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20  nt nEq;         
1b160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b170 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d  The number of ==
1b180 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   or IN constrain
1b190 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20  ts to code */.  
1b1a0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1b1b0 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
1b1c0 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f   The vm under co
1b1d0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1b1e0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
1b1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b200 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   The index being
1b210 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c   used for this l
1b220 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  oop */.  WhereTe
1b230 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
1b240 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
1b250 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  le constraint te
1b260 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  rm */.  WhereLoo
1b270 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
1b280 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
1b290 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
1b2a0 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
1b2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2c0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1b2d0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
1b2e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1b2f0 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
1b300 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ster */.  int nR
1b310 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
1b320 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1b330 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  r of registers t
1b340 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
1b350 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20  char *zAff;     
1b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b370 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   Affinity string
1b380 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20   to return */.. 
1b390 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20   /* This module 
1b3a0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f  is only called o
1b3b0 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68  n query plans th
1b3c0 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e  at use an index.
1b3d0 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c   */.  pLoop = pL
1b3e0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
1b3f0 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
1b400 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1b410 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
1b420 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f   );.  nEq = pLoo
1b430 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
1b440 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
1b450 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
1b460 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
1b470 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  0 );..  /* Figur
1b480 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d  e out how many m
1b490 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77  emory cells we w
1b4a0 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c  ill need then al
1b4b0 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a  locate them..  *
1b4c0 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50  /.  regBase = pP
1b4d0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
1b4e0 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e    nReg = pLoop->
1b4f0 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45  u.btree.nEq + nE
1b500 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73  xtraReg;.  pPars
1b510 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
1b520 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74  ..  zAff = sqlit
1b530 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73  e3DbStrDup(pPars
1b540 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33 49 6e  e->db, sqlite3In
1b550 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76  dexAffinityStr(v
1b560 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66 28 20  , pIdx));.  if( 
1b570 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70 50 61  !zAff ){.    pPa
1b580 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1b590 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a  ailed = 1;.  }..
1b5a0 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
1b5b0 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
1b5c0 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73  raints.  */.  as
1b5d0 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
1b5e0 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f  umn>=nEq );.  fo
1b5f0 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b  r(j=0; j<nEq; j+
1b600 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a  +){.    int r1;.
1b610 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
1b620 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20  p->aLTerm[j];.  
1b630 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
1b640 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 );.    /* The
1b650 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 72 75 65 20   following true 
1b660 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74 68  for indices with
1b670 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d   redundant colum
1b680 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20  ns. .    ** Ex: 
1b690 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
1b6a0 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53 45  ON t1(a,b,a); SE
1b6b0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1b6c0 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d 30  HERE a=0 AND b=0
1b6d0 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73  ; */.    testcas
1b6e0 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  e( (pTerm->wtFla
1b6f0 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
1b700 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
1b710 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
1b720 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1b730 41 4c 20 29 3b 0a 20 20 20 20 72 31 20 3d 20 63  AL );.    r1 = c
1b740 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
1b750 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
1b760 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20  Level, j, bRev, 
1b770 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
1b780 69 66 28 20 72 31 21 3d 72 65 67 42 61 73 65 2b  if( r1!=regBase+
1b790 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  j ){.      if( n
1b7a0 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Reg==1 ){.      
1b7b0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1b7c0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1b7d0 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20 20  regBase);.      
1b7e0 20 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b 0a    regBase = r1;.
1b7f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b800 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b810 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
1b820 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b  py, r1, regBase+
1b830 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j);.      }.    
1b840 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
1b850 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1b860 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
1b870 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1b880 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1b890 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66   WO_IN );.    if
1b8a0 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
1b8b0 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c  tor & (WO_ISNULL
1b8c0 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20  |WO_IN))==0 ){. 
1b8d0 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
1b8e0 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  t = pTerm->pExpr
1b8f0 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
1b900 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1b910 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69  sNullJump(v, pRi
1b920 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20  ght, regBase+j, 
1b930 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
1b940 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66 66  ;.      if( zAff
1b950 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1b960 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1b970 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a  finity(pRight, z
1b980 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f  Aff[j])==SQLITE_
1b990 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
1b9a0 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20        zAff[j] = 
1b9b0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1b9c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b9d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1b9e0 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
1b9f0 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
1ba00 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  zAff[j]) ){.    
1ba10 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20        zAff[j] = 
1ba20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1ba30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ba40 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a   }.    }.  }.  *
1ba50 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20  pzAff = zAff;.  
1ba60 72 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a  return regBase;.
1ba70 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1ba80 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
1ba90 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1baa0 65 20 69 73 20 61 20 68 65 6c 70 65 72 20 66 6f  e is a helper fo
1bab0 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61  r explainIndexRa
1bac0 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a  nge() below.**.*
1bad0 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74 68 65  * pStr holds the
1bae0 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78 70 72   text of an expr
1baf0 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65 20 61  ession that we a
1bb00 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70 20 6f  re building up o
1bb10 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20  ne term.** at a 
1bb20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f 75 74  time.  This rout
1bb30 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77 20 74  ine adds a new t
1bb40 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  erm to the end o
1bb50 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1bb60 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65 20 73  ..** Terms are s
1bb70 65 70 61 72 61 74 65 64 20 62 79 20 41 4e 44 20  eparated by AND 
1bb80 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e 44 22  so add the "AND"
1bb90 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f 6e 64   text for second
1bba0 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0a   and subsequent.
1bbb0 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a  ** terms only..*
1bbc0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
1bbd0 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
1bbe0 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70 53 74  .  StrAccum *pSt
1bbf0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
1bc00 2a 20 54 68 65 20 74 65 78 74 20 65 78 70 72 65  * The text expre
1bc10 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c  ssion being buil
1bc20 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d  t */.  int iTerm
1bc30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1bc40 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
1bc50 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72 73 74  his term.  First
1bc60 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f   is zero */.  co
1bc70 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
1bc80 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  n,        /* Nam
1bc90 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
1bca0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1bcb0 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20 20 20  *zOp            
1bcc0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1bcd0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20  operator */.){. 
1bce0 20 69 66 28 20 69 54 65 72 6d 20 29 20 73 71 6c   if( iTerm ) sql
1bcf0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
1bd00 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22  nd(pStr, " AND "
1bd10 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  , 5);.  sqlite3S
1bd20 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
1bd30 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31 29  tr, zColumn, -1)
1bd40 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
1bd50 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
1bd60 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  zOp, 1);.  sqlit
1bd70 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
1bd80 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a  (pStr, "?", 1);.
1bd90 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
1bda0 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72 69 62  t pLevel describ
1bdb0 65 73 20 61 20 73 74 72 61 74 65 67 79 20 66 6f  es a strategy fo
1bdc0 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65  r scanning table
1bdd0 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20   pTab. This .** 
1bde0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1bdf0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1be00 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 63 6f  string buffer co
1be10 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73 63 72  ntaining a descr
1be20 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  iption.** of the
1be30 20 73 75 62 73 65 74 20 6f 66 20 74 61 62 6c 65   subset of table
1be40 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79   rows scanned by
1be50 20 74 68 65 20 73 74 72 61 74 65 67 79 20 69 6e   the strategy in
1be60 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 0a   the form of an.
1be70 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f  ** SQL expressio
1be80 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72 6f  n. Or, if all ro
1be90 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64 2c 20  ws are scanned, 
1bea0 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
1beb0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1bec0 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72  ple, if the quer
1bed0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  y:.**.**   SELEC
1bee0 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
1bef0 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a  E a=1 AND b>2;.*
1bf00 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64 20  *.** is run and 
1bf10 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65  there is an inde
1bf20 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65  x on (a, b), the
1bf30 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1bf40 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72  returns a.** str
1bf50 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a  ing similar to:.
1bf60 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44  **.**   "a=? AND
1bf70 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20   b>?".**.** The 
1bf80 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72  returned pointer
1bf90 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f 72   points to memor
1bfa0 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
1bfb0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
1bfc0 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  )..** It is the 
1bfd0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
1bfe0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
1bff0 66 72 65 65 20 74 68 65 20 62 75 66 66 65 72 20  free the buffer 
1c000 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e 6f  when it is.** no
1c010 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64   longer required
1c020 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
1c030 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61   *explainIndexRa
1c040 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  nge(sqlite3 *db,
1c050 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
1c060 70 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  p, Table *pTab){
1c070 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
1c080 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
1c090 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20  e.pIndex;.  int 
1c0a0 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  nEq = pLoop->u.b
1c0b0 74 72 65 65 2e 6e 45 71 3b 0a 20 20 69 6e 74 20  tree.nEq;.  int 
1c0c0 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  i, j;.  Column *
1c0d0 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  aCol = pTab->aCo
1c0e0 6c 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f 6c 75  l;.  int *aiColu
1c0f0 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43  mn = pIndex->aiC
1c100 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75  olumn;.  StrAccu
1c110 6d 20 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e 45  m txt;..  if( nE
1c120 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e  q==0 && (pLoop->
1c130 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
1c140 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45  _BTM_LIMIT|WHERE
1c150 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20  _TOP_LIMIT))==0 
1c160 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1c170 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
1c180 72 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74 2c  rAccumInit(&txt,
1c190 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41   0, 0, SQLITE_MA
1c1a0 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78 74  X_LENGTH);.  txt
1c1b0 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69  .db = db;.  sqli
1c1c0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
1c1d0 64 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32 29  d(&txt, " (", 2)
1c1e0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
1c1f0 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 65 78  Eq; i++){.    ex
1c200 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
1c210 26 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61 69  &txt, i, aCol[ai
1c220 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65  Column[i]].zName
1c230 2c 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a  , "=");.  }..  j
1c240 20 3d 20 69 3b 0a 20 20 69 66 28 20 70 4c 6f 6f   = i;.  if( pLoo
1c250 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45  p->wsFlags&WHERE
1c260 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
1c270 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d    char *z = (j==
1c280 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
1c290 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43  ) ? "rowid" : aC
1c2a0 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  ol[aiColumn[j]].
1c2b0 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61  zName;.    expla
1c2c0 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78  inAppendTerm(&tx
1c2d0 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b  t, i++, z, ">");
1c2e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70  .  }.  if( pLoop
1c2f0 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
1c300 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  TOP_LIMIT ){.   
1c310 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70   char *z = (j==p
1c320 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
1c330 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f   ? "rowid" : aCo
1c340 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  l[aiColumn[j]].z
1c350 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69  Name;.    explai
1c360 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
1c370 2c 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20  , i, z, "<");.  
1c380 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  }.  sqlite3StrAc
1c390 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20  cumAppend(&txt, 
1c3a0 22 29 22 2c 20 31 29 3b 0a 20 20 72 65 74 75 72  ")", 1);.  retur
1c3b0 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  n sqlite3StrAccu
1c3c0 6d 46 69 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d  mFinish(&txt);.}
1c3d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1c3e0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
1c3f0 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74 6c   unless currentl
1c400 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20  y processing an 
1c410 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
1c420 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49  AN.** command. I
1c430 66 20 74 68 65 20 71 75 65 72 79 20 62 65 69 6e  f the query bein
1c440 67 20 63 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e  g compiled is an
1c450 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
1c460 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  LAN, a single.**
1c470 20 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64   record is added
1c480 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74   to the output t
1c490 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74  o describe the t
1c4a0 61 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65  able scan strate
1c4b0 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c  gy in .** pLevel
1c4c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1c4d0 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
1c4e0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1c4f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c500 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
1c510 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
1c520 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
1c530 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1c540 65 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70  e list this loop
1c550 20 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20   refers to */.  
1c560 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
1c570 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
1c580 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65  /* Scan to write
1c590 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f   OP_Explain opco
1c5a0 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  de for */.  int 
1c5b0 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  iLevel,         
1c5c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1c5d0 61 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22  alue for "level"
1c5e0 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75   column of outpu
1c5f0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
1c600 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c610 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1c620 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d  for "from" colum
1c630 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20  n of output */. 
1c640 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20   u16 wctrlFlags 
1c650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c660 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
1c670 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
1c680 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20  Begin() */.){.  
1c690 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
1c6a0 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 73 74  ain==2 ){.    st
1c6b0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1c6c0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
1c6d0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
1c6e0 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65  iFrom];.    Vdbe
1c6f0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1c700 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20  dbe;      /* VM 
1c710 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
1c720 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  d */.    sqlite3
1c730 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1c740 62 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61  b;     /* Databa
1c750 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20  se handle */.   
1c760 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20   char *zMsg;    
1c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c780 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20 74 6f  * Text to add to
1c790 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20   EQP output */. 
1c7a0 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 50 61     int iId = pPa
1c7b0 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20  rse->iSelectId; 
1c7c0 20 2f 2a 20 53 65 6c 65 63 74 20 69 64 20 28 6c   /* Select id (l
1c7d0 65 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20  eft-most output 
1c7e0 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69  column) */.    i
1c7f0 6e 74 20 69 73 53 65 61 72 63 68 3b 20 20 20 20  nt isSearch;    
1c800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c810 54 72 75 65 20 66 6f 72 20 61 20 53 45 41 52 43  True for a SEARC
1c820 48 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 43 41  H. False for SCA
1c830 4e 2e 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c  N. */.    WhereL
1c840 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  oop *pLoop;     
1c850 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1c860 6f 6e 74 72 6f 6c 6c 69 6e 67 20 57 68 65 72 65  ontrolling Where
1c870 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Loop object */. 
1c880 20 20 20 75 33 32 20 66 6c 61 67 73 3b 20 20 20     u32 flags;   
1c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8a0 20 2f 2a 20 46 6c 61 67 73 20 74 68 61 74 20 64   /* Flags that d
1c8b0 65 73 63 72 69 62 65 20 74 68 69 73 20 6c 6f 6f  escribe this loo
1c8c0 70 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70 20  p */..    pLoop 
1c8d0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
1c8e0 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 70 4c  ;.    flags = pL
1c8f0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  oop->wsFlags;.  
1c900 20 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45    if( (flags&WHE
1c910 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20  RE_MULTI_OR) || 
1c920 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  (wctrlFlags&WHER
1c930 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
1c940 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20   ) return;..    
1c950 69 73 53 65 61 72 63 68 20 3d 20 28 66 6c 61 67  isSearch = (flag
1c960 73 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  s&(WHERE_BTM_LIM
1c970 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  IT|WHERE_TOP_LIM
1c980 49 54 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  IT))!=0.        
1c990 20 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 26 57      || ((flags&W
1c9a0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1c9b0 45 29 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d  E)==0 && (pLoop-
1c9c0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3e 30 29 29  >u.btree.nEq>0))
1c9d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
1c9e0 28 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45  (wctrlFlags&(WHE
1c9f0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57  RE_ORDERBY_MIN|W
1ca00 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
1ca10 29 29 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d 20  ));..    zMsg = 
1ca20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
1ca30 62 2c 20 22 25 73 22 2c 20 69 73 53 65 61 72 63  b, "%s", isSearc
1ca40 68 3f 22 53 45 41 52 43 48 22 3a 22 53 43 41 4e  h?"SEARCH":"SCAN
1ca50 22 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ");.    if( pIte
1ca60 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
1ca70 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1ca80 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1ca90 4d 73 67 2c 20 22 25 73 20 53 55 42 51 55 45 52  Msg, "%s SUBQUER
1caa0 59 20 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74 65  Y %d", zMsg,pIte
1cab0 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20  m->iSelectId);. 
1cac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cad0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1cae0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1caf0 20 22 25 73 20 54 41 42 4c 45 20 25 73 22 2c 20   "%s TABLE %s", 
1cb00 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  zMsg, pItem->zNa
1cb10 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  me);.    }..    
1cb20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  if( pItem->zAlia
1cb30 73 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20  s ){.      zMsg 
1cb40 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1cb50 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
1cb60 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49  AS %s", zMsg, pI
1cb70 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1cb80 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61    }.    if( (fla
1cb90 67 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c  gs & (WHERE_IPK|
1cba0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
1cbb0 4c 45 29 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  LE))==0.     && 
1cbc0 41 4c 57 41 59 53 28 70 4c 6f 6f 70 2d 3e 75 2e  ALWAYS(pLoop->u.
1cbd0 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 29  btree.pIndex!=0)
1cbe0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68  .    ){.      ch
1cbf0 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 65 78 70  ar *zWhere = exp
1cc00 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 64  lainIndexRange(d
1cc10 62 2c 20 70 4c 6f 6f 70 2c 20 70 49 74 65 6d 2d  b, pLoop, pItem-
1cc20 3e 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d  >pTab);.      zM
1cc30 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1cc40 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 0a 20  endf(db, zMsg,. 
1cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
1cc60 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  flags & WHERE_AU
1cc70 54 4f 5f 49 4e 44 45 58 29 20 3f 20 0a 20 20 20  TO_INDEX) ? .   
1cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc90 22 25 73 20 55 53 49 4e 47 20 41 55 54 4f 4d 41  "%s USING AUTOMA
1cca0 54 49 43 20 25 73 49 4e 44 45 58 25 2e 30 73 25  TIC %sINDEX%.0s%
1ccb0 73 22 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20  s" :.           
1ccc0 20 20 20 20 20 20 20 20 22 25 73 20 55 53 49 4e          "%s USIN
1ccd0 47 20 25 73 49 4e 44 45 58 20 25 73 25 73 22 29  G %sINDEX %s%s")
1cce0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1ccf0 20 20 7a 4d 73 67 2c 20 28 28 66 6c 61 67 73 20    zMsg, ((flags 
1cd00 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
1cd10 29 20 3f 20 22 43 4f 56 45 52 49 4e 47 20 22 20  ) ? "COVERING " 
1cd20 3a 20 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20  : ""),.         
1cd30 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62        pLoop->u.b
1cd40 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61  tree.pIndex->zNa
1cd50 6d 65 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20  me, zWhere);.   
1cd60 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1cd70 28 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20  (db, zWhere);.  
1cd80 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61    }else if( (fla
1cd90 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21  gs & WHERE_IPK)!
1cda0 3d 30 20 26 26 20 28 66 6c 61 67 73 20 26 20 57  =0 && (flags & W
1cdb0 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29  HERE_CONSTRAINT)
1cdc0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73  !=0 ){.      zMs
1cdd0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
1cde0 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
1cdf0 73 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20  s USING INTEGER 
1ce00 50 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d  PRIMARY KEY", zM
1ce10 73 67 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  sg);..      if( 
1ce20 66 6c 61 67 73 26 28 57 48 45 52 45 5f 43 4f 4c  flags&(WHERE_COL
1ce30 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c  UMN_EQ|WHERE_COL
1ce40 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20  UMN_IN) ){.     
1ce50 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1ce60 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1ce70 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3d 3f  sg, "%s (rowid=?
1ce80 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
1ce90 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67   }else if( (flag
1cea0 73 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d  s&WHERE_BOTH_LIM
1ceb0 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f  IT)==WHERE_BOTH_
1cec0 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20  LIMIT ){.       
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 3e 3f 20 41  , "%s (rowid>? A
1cf00 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d  ND rowid<?)", zM
1cf10 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sg);.      }else
1cf20 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45   if( flags&WHERE
1cf30 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
1cf40 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1cf50 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1cf60 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
1cf70 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d>?)", zMsg);.  
1cf80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
1cf90 57 41 59 53 28 66 6c 61 67 73 26 57 48 45 52 45  WAYS(flags&WHERE
1cfa0 5f 54 4f 50 5f 4c 49 4d 49 54 29 20 29 7b 0a 20  _TOP_LIMIT) ){. 
1cfb0 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
1cfc0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1cfd0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77  , zMsg, "%s (row
1cfe0 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id<?)", zMsg);. 
1cff0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
1d000 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d010 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
1d020 20 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67    else if( (flag
1d030 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
1d040 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
1d050 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1d060 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1d070 4d 73 67 2c 20 22 25 73 20 56 49 52 54 55 41 4c  Msg, "%s VIRTUAL
1d080 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a   TABLE INDEX %d:
1d090 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20  %s", zMsg,.     
1d0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
1d0b0 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75  op->u.vtab.idxNu
1d0c0 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  m, pLoop->u.vtab
1d0d0 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a  .idxStr);.    }.
1d0e0 23 65 6e 64 69 66 0a 20 20 20 20 7a 4d 73 67 20  #endif.    zMsg 
1d0f0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1d100 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 22  f(db, zMsg, "%s"
1d110 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  , zMsg);.    sql
1d120 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1d130 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49  , OP_Explain, iI
1d140 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d  d, iLevel, iFrom
1d150 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
1d160 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
1d170 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
1d180 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78  nOneScan(u,v,w,x
1d190 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
1d1a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
1d1b0 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47  AIN */.../*.** G
1d1c0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1d1d0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1d1e0 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70  e iLevel-th loop
1d1f0 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
1d200 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  ause.** implemen
1d210 74 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  tation described
1d220 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73   by pWInfo..*/.s
1d230 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f  tatic Bitmask co
1d240 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a  deOneLoopStart(.
1d250 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
1d260 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65  nfo,   /* Comple
1d270 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  te information a
1d280 62 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63  bout the WHERE c
1d290 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
1d2a0 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
1d2b0 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f  /* Which level o
1d2c0 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68  f pWInfo->a[] sh
1d2d0 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f  ould be coded */
1d2e0 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
1d2f0 61 64 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68  ady     /* Which
1d300 20 74 61 62 6c 65 73 20 61 72 65 20 63 75 72 72   tables are curr
1d310 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20  ently available 
1d320 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b  */.){.  int j, k
1d330 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1d340 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
1d350 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
1d360 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
1d370 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
1d380 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
1d390 74 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20  t addrNxt;      
1d3a0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a     /* Where to j
1d3b0 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ump to continue 
1d3c0 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
1d3d0 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   case */.  int o
1d3e0 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20  mitTable;       
1d3f0 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73  /* True if we us
1d400 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79  e the index only
1d410 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20   */.  int bRev; 
1d420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1d430 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ue if we need to
1d440 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   scan in reverse
1d450 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72   order */.  Wher
1d460 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
1d470 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65   /* The where le
1d480 76 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20  vel to be coded 
1d490 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
1d4a0 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65  pLoop;    /* The
1d4b0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1d4c0 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
1d4d0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
1d4e0 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d  pWC;    /* Decom
1d4f0 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
1d500 65 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c 61  entire WHERE cla
1d510 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  use */.  WhereTe
1d520 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
1d530 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48           /* A WH
1d540 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
1d550 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
1d560 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
1d570 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1d580 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
1d590 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
1d5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d5b0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
1d5c0 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ion */.  Vdbe *v
1d5d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d5e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d5f0 70 72 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e  prepared stmt un
1d600 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1d610 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
1d620 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
1d630 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63  Item;  /* FROM c
1d640 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67  lause term being
1d650 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
1d660 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20  addrBrk;        
1d670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
1d680 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
1d690 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  k out of the loo
1d6a0 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
1d6b0 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ont;            
1d6c0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
1d6d0 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
1d6e0 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20  with next cycle 
1d6f0 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52  */.  int iRowidR
1d700 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  eg = 0;        /
1d710 2a 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65  * Rowid is store
1d720 64 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  d in this regist
1d730 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20  er, if not zero 
1d740 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73  */.  int iReleas
1d750 65 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f  eReg = 0;      /
1d760 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20  * Temp register 
1d770 74 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20 72  to free before r
1d780 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 20 20 42 69  eturning */.  Bi
1d790 74 6d 61 73 6b 20 6e 65 77 4e 6f 74 52 65 61 64  tmask newNotRead
1d7a0 79 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  y;      /* Retur
1d7b0 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 70 50  n value */..  pP
1d7c0 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
1d7d0 50 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61  Parse;.  v = pPa
1d7e0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57  rse->pVdbe;.  pW
1d7f0 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
1d800 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
1d810 3e 64 62 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20  >db;.  pLevel = 
1d820 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65  &pWInfo->a[iLeve
1d830 6c 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  l];.  pLoop = pL
1d840 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
1d850 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e  pTabItem = &pWIn
1d860 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
1d870 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
1d880 20 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65    iCur = pTabIte
1d890 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 62 52  m->iCursor;.  bR
1d8a0 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65  ev = (pWInfo->re
1d8b0 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31  vMask>>iLevel)&1
1d8c0 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20  ;.  omitTable = 
1d8d0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1d8e0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
1d8f0 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )!=0 .          
1d900 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
1d910 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1d920 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b  FORCE_TABLE)==0;
1d930 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1d940 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 4a 6f  nt((v, "Begin Jo
1d950 69 6e 20 4c 6f 6f 70 20 25 64 22 2c 20 69 4c 65  in Loop %d", iLe
1d960 76 65 6c 29 29 3b 0a 0a 20 20 2f 2a 20 43 72 65  vel));..  /* Cre
1d970 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20 74  ate labels for t
1d980 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20 22  he "break" and "
1d990 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72 75  continue" instru
1d9a0 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20  ctions.  ** for 
1d9b0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
1d9c0 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64 64 72 42  .  Jump to addrB
1d9d0 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  rk to break out 
1d9e0 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20  of a loop..  ** 
1d9f0 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20  Jump to cont to 
1da00 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  go immediately t
1da10 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
1da20 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tion of the.  **
1da30 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   loop..  **.  **
1da40 20 57 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   When there is a
1da50 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77  n IN operator, w
1da60 65 20 61 6c 73 6f 20 68 61 76 65 20 61 20 22 61  e also have a "a
1da70 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 20 74 68  ddrNxt" label th
1da80 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f  at.  ** means to
1da90 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74   continue with t
1daa0 68 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75 65  he next IN value
1dab0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57   combination.  W
1dac0 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20 61  hen.  ** there a
1dad0 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f  re no IN operato
1dae0 72 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72  rs in the constr
1daf0 61 69 6e 74 73 2c 20 74 68 65 20 22 61 64 64 72  aints, the "addr
1db00 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20  Nxt" label.  ** 
1db10 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 22  is the same as "
1db20 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20  addrBrk"..  */. 
1db30 20 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65   addrBrk = pLeve
1db40 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c 65  l->addrBrk = pLe
1db50 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73  vel->addrNxt = s
1db60 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1db70 62 65 6c 28 76 29 3b 0a 20 20 61 64 64 72 43 6f  bel(v);.  addrCo
1db80 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  nt = pLevel->add
1db90 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  rCont = sqlite3V
1dba0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1dbb0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1dbc0 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  s the right tabl
1dbd0 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  e of a LEFT OUTE
1dbe0 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65  R JOIN, allocate
1dbf0 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61   and.  ** initia
1dc00 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65  lize a memory ce
1dc10 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73 20  ll that records 
1dc20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61  if this table ma
1dc30 74 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72  tches any.  ** r
1dc40 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74  ow of the left t
1dc50 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
1dc60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65  ..  */.  if( pLe
1dc70 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20  vel->iFrom>0 && 
1dc80 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69  (pTabItem[0].joi
1dc90 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
1dca0 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65 76 65  !=0 ){.    pLeve
1dcb0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b  l->iLeftJoin = +
1dcc0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1dcd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1dce0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1dcf0 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69  er, 0, pLevel->i
1dd00 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56  LeftJoin);.    V
1dd10 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1dd20 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e  init LEFT JOIN n
1dd30 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b  o-match flag"));
1dd40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69  .  }..  /* Speci
1dd50 61 6c 20 63 61 73 65 20 6f 66 20 61 20 46 52 4f  al case of a FRO
1dd60 4d 20 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M clause subquer
1dd70 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  y implemented as
1dd80 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f   a co-routine */
1dd90 0a 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d  .  if( pTabItem-
1dda0 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b  >viaCoroutine ){
1ddb0 0a 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c  .    int regYiel
1ddc0 64 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72 65  d = pTabItem->re
1ddd0 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c  gReturn;.    sql
1dde0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ddf0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54  , OP_Integer, pT
1de00 61 62 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c  abItem->addrFill
1de10 53 75 62 2d 31 2c 20 72 65 67 59 69 65 6c 64 29  Sub-1, regYield)
1de20 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
1de30 20 3d 20 20 73 71 6c 69 74 65 33 56 64 62 65 41   =  sqlite3VdbeA
1de40 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
1de50 64 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20  d, regYield);.  
1de60 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1de70 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 63  , "next row of c
1de80 6f 2d 72 6f 75 74 69 6e 65 20 25 73 22 2c 20 70  o-routine %s", p
1de90 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  TabItem->pTab->z
1dea0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73 71 6c 69  Name));.    sqli
1deb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1dec0 20 4f 50 5f 49 66 2c 20 72 65 67 59 69 65 6c 64   OP_If, regYield
1ded0 2b 31 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20  +1, addrBrk);.  
1dee0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
1def0 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65 0a  P_Goto;.  }else.
1df00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1df10 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1df20 45 0a 20 20 69 66 28 20 20 28 70 4c 6f 6f 70 2d  E.  if(  (pLoop-
1df30 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1df40 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
1df50 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  0 ){.    /* Case
1df60 20 31 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69   1:  The table i
1df70 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c  s a virtual-tabl
1df80 65 2e 20 20 55 73 65 20 74 68 65 20 56 46 69 6c  e.  Use the VFil
1df90 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20  ter and VNext.  
1dfa0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f    **          to
1dfb0 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
1dfc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
1dfd0 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56   iReg;   /* P3 V
1dfe0 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c  alue for OP_VFil
1dff0 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  ter */.    int a
1e000 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20 20  ddrNotFound;.   
1e010 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
1e020 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d   = pLoop->nLTerm
1e030 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ;..    sqlite3Ex
1e040 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
1e050 73 65 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20  se);.    iReg = 
1e060 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
1e070 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e  nge(pParse, nCon
1e080 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20  straint+2);.    
1e090 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70  addrNotFound = p
1e0a0 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a  Level->addrBrk;.
1e0b0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
1e0c0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29  Constraint; j++)
1e0d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 72  {.      int iTar
1e0e0 67 65 74 20 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a  get = iReg+j+2;.
1e0f0 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c        pTerm = pL
1e100 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a  oop->aLTerm[j];.
1e110 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
1e120 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1e130 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
1e140 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
1e150 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  N ){.        cod
1e160 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
1e170 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65  arse, pTerm, pLe
1e180 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 69 54  vel, j, bRev, iT
1e190 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1e1a0 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70  addrNotFound = p
1e1b0 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a  Level->addrNxt;.
1e1c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e1d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1e1e0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 54 65  Code(pParse, pTe
1e1f0 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
1e200 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20  t, iTarget);.   
1e210 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
1e220 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e230 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1e240 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
1e250 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20  xNum, iReg);.   
1e260 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e270 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1e280 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 69  , nConstraint, i
1e290 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69  Reg+1);.    sqli
1e2a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1e2b0 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75   OP_VFilter, iCu
1e2c0 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 2c  r, addrNotFound,
1e2d0 20 69 52 65 67 2c 0a 20 20 20 20 20 20 20 20 20   iReg,.         
1e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
1e2f0 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  op->u.vtab.idxSt
1e300 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
1e310 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
1e320 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
1e330 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50  ? P4_MPRINTF : P
1e340 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 70  4_STATIC);.    p
1e350 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  Loop->u.vtab.nee
1e360 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 66  dFree = 0;.    f
1e370 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74  or(j=0; j<nConst
1e380 72 61 69 6e 74 20 26 26 20 6a 3c 31 36 3b 20 6a  raint && j<16; j
1e390 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
1e3a0 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  pLoop->u.vtab.om
1e3b0 69 74 4d 61 73 6b 3e 3e 6a 29 26 31 20 29 7b 0a  itMask>>j)&1 ){.
1e3c0 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
1e3d0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4c 6f 6f  erm(pLevel, pLoo
1e3e0 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 29 3b 0a 20  p->aLTerm[j]);. 
1e3f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1e400 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1e410 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76  _VNext;.    pLev
1e420 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
1e430 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
1e440 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1e450 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73  ntAddr(v);.    s
1e460 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1e470 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  pRange(pParse, i
1e480 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  Reg, nConstraint
1e490 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +2);.    sqlite3
1e4a0 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
1e4b0 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  rse, 1);.  }else
1e4c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1e4d0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1e4e0 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70  BLE */..  if( (p
1e4f0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1e500 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20  WHERE_IPK)!=0.  
1e510 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
1e520 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c  ags & (WHERE_COL
1e530 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c  UMN_IN|WHERE_COL
1e540 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20 20 29 7b  UMN_EQ))!=0.  ){
1e550 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20  .    /* Case 2: 
1e560 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79   We can directly
1e570 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e   reference a sin
1e580 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e  gle row using an
1e590 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1e5a0 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72   equality compar
1e5b0 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65  ison against the
1e5c0 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f   ROWID field.  O
1e5d0 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  r.    **        
1e5e0 20 20 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d    we reference m
1e5f0 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69  ultiple rows usi
1e600 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28  ng a "rowid IN (
1e610 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20  ...)".    **    
1e620 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e        construct.
1e630 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1e640 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  rt( pLoop->u.btr
1e650 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20 20 20  ee.nEq==1 );.   
1e660 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73   iReleaseReg = s
1e670 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
1e680 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 54  (pParse);.    pT
1e690 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  erm = pLoop->aLT
1e6a0 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65  erm[0];.    asse
1e6b0 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
1e6c0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
1e6d0 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  m->pExpr!=0 );. 
1e6e0 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
1e6f0 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74  able==0 );.    t
1e700 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
1e710 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1e720 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 69 52  IRTUAL );.    iR
1e730 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71  owidReg = codeEq
1e740 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
1e750 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
1e760 2c 20 30 2c 20 62 52 65 76 2c 20 69 52 65 6c 65  , 0, bRev, iRele
1e770 61 73 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64  aseReg);.    add
1e780 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rNxt = pLevel->a
1e790 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69  ddrNxt;.    sqli
1e7a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e7b0 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
1e7c0 52 6f 77 69 64 52 65 67 2c 20 61 64 64 72 4e 78  RowidReg, addrNx
1e7d0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
1e7e0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1e7f0 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c  NotExists, iCur,
1e800 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64   addrNxt, iRowid
1e810 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Reg);.    sqlite
1e820 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1e830 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
1e840 20 69 52 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a   iRowidReg, 1);.
1e850 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1e860 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
1e870 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77  , iCur, -1, iRow
1e880 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65  idReg);.    Vdbe
1e890 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22  Comment((v, "pk"
1e8a0 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ));.    pLevel->
1e8b0 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  op = OP_Noop;.  
1e8c0 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f 70  }else if( (pLoop
1e8d0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1e8e0 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 20 20 20  E_IPK)!=0.      
1e8f0 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
1e900 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
1e910 4c 55 4d 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20  LUMN_RANGE)!=0. 
1e920 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
1e930 33 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20 69  3:  We have an i
1e940 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72  nequality compar
1e950 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65  ison against the
1e960 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20   ROWID field..  
1e970 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73    */.    int tes
1e980 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  tOp = OP_Noop;. 
1e990 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20     int start;.  
1e9a0 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75    int memEndValu
1e9b0 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65  e = 0;.    Where
1e9c0 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70  Term *pStart, *p
1e9d0 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  End;..    assert
1e9e0 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
1e9f0 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20  ;.    j = 0;.   
1ea00 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 20 3d   pStart = pEnd =
1ea10 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f   0;.    if( pLoo
1ea20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1ea30 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70  RE_BTM_LIMIT ) p
1ea40 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61  Start = pLoop->a
1ea50 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20  LTerm[j++];.    
1ea60 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1ea70 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
1ea80 49 4d 49 54 20 29 20 70 45 6e 64 20 3d 20 70 4c  IMIT ) pEnd = pL
1ea90 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
1eaa0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
1eab0 74 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21  tart!=0 || pEnd!
1eac0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 62 52  =0 );.    if( bR
1ead0 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  ev ){.      pTer
1eae0 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20  m = pStart;.    
1eaf0 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b    pStart = pEnd;
1eb00 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54  .      pEnd = pT
1eb10 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  erm;.    }.    i
1eb20 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
1eb30 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20     Expr *pX;    
1eb40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1eb50 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
1eb60 64 65 66 69 6e 65 73 20 74 68 65 20 73 74 61 72  defines the star
1eb70 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  t bound */.     
1eb80 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20   int r1, rTemp; 
1eb90 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
1eba0 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20  ers for holding 
1ebb0 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61  the start bounda
1ebc0 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  ry */..      /* 
1ebd0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
1ebe0 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78  nstant maps TK_x
1ebf0 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72  x codes into cor
1ec00 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20  responding .    
1ec10 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65    ** seek opcode
1ec20 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f  s.  It depends o
1ec30 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f  n a particular o
1ec40 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78  rdering of TK_xx
1ec50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1ec60 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70  const u8 aMoveOp
1ec70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
1ec80 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f    /* TK_GT */  O
1ec90 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20 20 20  P_SeekGt,.      
1eca0 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f       /* TK_LE */
1ecb0 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20 20 20    OP_SeekLe,.   
1ecc0 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54          /* TK_LT
1ecd0 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a   */  OP_SeekLt,.
1ece0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
1ecf0 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47  _GE */  OP_SeekG
1ed00 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  e.      };.     
1ed10 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d   assert( TK_LE==
1ed20 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20  TK_GT+1 );      
1ed30 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
1ed40 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20   ordering.. */. 
1ed50 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1ed60 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20  LT==TK_GT+2 );  
1ed70 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74      /*  ... of t
1ed80 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e  he TK_xx values.
1ed90 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  .. */.      asse
1eda0 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54  rt( TK_GE==TK_GT
1edb0 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e  +3 );      /*  .
1edc0 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20  .. is correcct. 
1edd0 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  */..      assert
1ede0 28 20 28 70 53 74 61 72 74 2d 3e 77 74 46 6c 61  ( (pStart->wtFla
1edf0 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
1ee00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1ee10 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77  tcase( pStart->w
1ee20 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
1ee30 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 70  RTUAL );.      p
1ee40 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70  X = pStart->pExp
1ee50 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
1ee60 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   pX!=0 );.      
1ee70 74 65 73 74 63 61 73 65 28 20 70 53 74 61 72 74  testcase( pStart
1ee80 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43  ->leftCursor!=iC
1ee90 75 72 20 29 3b 20 2f 2a 20 74 72 61 6e 73 69 74  ur ); /* transit
1eea0 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ive constraints 
1eeb0 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  */.      r1 = sq
1eec0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1eed0 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  p(pParse, pX->pR
1eee0 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20  ight, &rTemp);. 
1eef0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ef00 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f  AddOp3(v, aMoveO
1ef10 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c  p[pX->op-TK_GT],
1ef20 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20   iCur, addrBrk, 
1ef30 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  r1);.      VdbeC
1ef40 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
1ef50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ef60 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1ef70 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
1ef80 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  r1, 1);.      sq
1ef90 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1efa0 52 65 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d  Reg(pParse, rTem
1efb0 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c  p);.      disabl
1efc0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53  eTerm(pLevel, pS
1efd0 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  tart);.    }else
1efe0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1eff0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65  dbeAddOp2(v, bRe
1f000 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50  v ? OP_Last : OP
1f010 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61  _Rewind, iCur, a
1f020 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20  ddrBrk);.    }. 
1f030 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20     if( pEnd ){. 
1f040 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20       Expr *pX;. 
1f050 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e       pX = pEnd->
1f060 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
1f070 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
1f080 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45 6e      assert( (pEn
1f090 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
1f0a0 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20  M_VNULL)==0 );. 
1f0b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1f0c0 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  End->leftCursor!
1f0d0 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54 72 61 6e  =iCur ); /* Tran
1f0e0 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e  sitive constrain
1f0f0 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ts */.      test
1f100 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c  case( pEnd->wtFl
1f110 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1f120 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45  AL );.      memE
1f130 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72  ndValue = ++pPar
1f140 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1f150 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1f160 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
1f170 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29  ht, memEndValue)
1f180 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
1f190 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
1f1a0 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op==TK_GT ){.  
1f1b0 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
1f1c0 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50  Rev ? OP_Le : OP
1f1d0 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _Ge;.      }else
1f1e0 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
1f1f0 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20   = bRev ? OP_Lt 
1f200 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d  : OP_Gt;.      }
1f210 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
1f220 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29  rm(pLevel, pEnd)
1f230 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72  ;.    }.    star
1f240 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
1f250 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1f260 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1f270 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
1f280 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c   OP_Next;.    pL
1f290 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
1f2a0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1f2b0 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61 73 73  = start;.    ass
1f2c0 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d  ert( pLevel->p5=
1f2d0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 74 65  =0 );.    if( te
1f2e0 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
1f2f0 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
1f300 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d   = iReleaseReg =
1f310 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1f320 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
1f330 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f340 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
1f350 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67   iCur, iRowidReg
1f360 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f370 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
1f380 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
1f390 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1f3a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f3b0 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20  dOp3(v, testOp, 
1f3c0 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64  memEndValue, add
1f3d0 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29  rBrk, iRowidReg)
1f3e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1f3f0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
1f400 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
1f410 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  C | SQLITE_JUMPI
1f420 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  FNULL);.    }.  
1f430 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d  }else if( pLoop-
1f440 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1f450 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
1f460 2f 2a 20 43 61 73 65 20 34 3a 20 41 20 73 63 61  /* Case 4: A sca
1f470 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  n using an index
1f480 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1f490 20 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52          The WHER
1f4a0 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e  E clause may con
1f4b0 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  tain zero or mor
1f4c0 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20  e equality .    
1f4d0 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d 73  **         terms
1f4e0 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f   ("==" or "IN" o
1f4f0 70 65 72 61 74 6f 72 73 29 20 74 68 61 74 20 72  perators) that r
1f500 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20  efer to the N.  
1f510 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66    **         lef
1f520 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f  t-most columns o
1f530 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20  f the index. It 
1f540 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
1f550 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f560 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1f570 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d  raints (>, <, >=
1f580 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69   or <=) on the i
1f590 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20  ndexed.    **   
1f5a0 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61        column tha
1f5b0 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  t immediately fo
1f5c0 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61  llows the N equa
1f5d0 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20  lities. Only .  
1f5e0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65    **         the
1f5f0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75   right-most colu
1f600 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65  mn can be an ine
1f610 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65  quality - the re
1f620 73 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20  st must.    **  
1f630 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22         use the "
1f640 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65  ==" and "IN" ope
1f650 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d  rators. For exam
1f660 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20  ple, if the .   
1f670 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65   **         inde
1f680 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c  x is on (x,y,z),
1f690 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   then the follow
1f6a0 69 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20  ing clauses are 
1f6b0 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  all .    **     
1f6c0 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20      optimized:. 
1f6d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1f6e0 20 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20          x=5.    
1f6f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
1f700 35 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a  5 AND y=10.    *
1f710 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1f720 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
1f730 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1f740 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30  AND y>5 AND y<10
1f750 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f760 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41     x=5 AND y=5 A
1f770 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a  ND z<=10.    **.
1f780 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
1f790 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20  he z<10 term of 
1f7a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  the following ca
1f7b0 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e  nnot be used, on
1f7c0 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ly.    **       
1f7d0 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a    the x=5 term:.
1f7e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1f7f0 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
1f800 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20   z<10.    **.   
1f810 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61   **         N ma
1f820 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65  y be zero if the
1f830 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74  re are inequalit
1f840 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20  y constraints.. 
1f850 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66     **         If
1f860 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e   there are no in
1f870 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1f880 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20  ints, then N is 
1f890 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  at.    **       
1f8a0 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20    least one..   
1f8b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1f8c0 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20     This case is 
1f8d0 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74  also used when t
1f8e0 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52  here are no WHER
1f8f0 45 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  E clause.    ** 
1f900 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69          constrai
1f910 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78  nts but an index
1f920 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79   is selected any
1f930 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20  way, in order.  
1f940 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20    **         to 
1f950 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74  force the output
1f960 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72   order to confor
1f970 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59  m to an ORDER BY
1f980 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73  ..    */  .    s
1f990 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
1f9a0 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20  StartOp[] = {.  
1f9b0 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a      0,.      0,.
1f9c0 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c        OP_Rewind,
1f9d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a             /* 2:
1f9e0 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61   (!start_constra
1f9f0 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20  ints && startEq 
1fa00 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20  &&  !bRev) */.  
1fa10 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20      OP_Last,    
1fa20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28           /* 3: (
1fa30 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  !start_constrain
1fa40 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26  ts && startEq &&
1fa50 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20     bRev) */.    
1fa60 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20 20    OP_SeekGt,    
1fa70 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74         /* 4: (st
1fa80 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1fa90 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20   && !startEq && 
1faa0 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
1fab0 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20 20  OP_SeekLt,      
1fac0 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72       /* 5: (star
1fad0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
1fae0 26 20 21 73 74 61 72 74 45 71 20 26 26 20 20 62  & !startEq &&  b
1faf0 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
1fb00 5f 53 65 65 6b 47 65 2c 20 20 20 20 20 20 20 20  _SeekGe,        
1fb10 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f     /* 6: (start_
1fb20 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
1fb30 20 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65   startEq && !bRe
1fb40 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
1fb50 65 65 6b 4c 65 20 20 20 20 20 20 20 20 20 20 20  eekLe           
1fb60 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f   /* 7: (start_co
1fb70 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73  nstraints  &&  s
1fb80 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29  tartEq &&  bRev)
1fb90 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73   */.    };.    s
1fba0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
1fbb0 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  EndOp[] = {.    
1fbc0 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20    OP_Noop,      
1fbd0 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65         /* 0: (!e
1fbe0 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20  nd_constraints) 
1fbf0 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47  */.      OP_IdxG
1fc00 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  E,            /*
1fc10 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   1: (end_constra
1fc20 69 6e 74 73 20 26 26 20 21 62 52 65 76 29 20 2a  ints && !bRev) *
1fc30 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54  /.      OP_IdxLT
1fc40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fc50 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  2: (end_constrai
1fc60 6e 74 73 20 26 26 20 62 52 65 76 29 20 2a 2f 0a  nts && bRev) */.
1fc70 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e      };.    int n
1fc80 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Eq = pLoop->u.bt
1fc90 72 65 65 2e 6e 45 71 3b 20 20 2f 2a 20 4e 75 6d  ree.nEq;  /* Num
1fca0 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20  ber of == or IN 
1fcb0 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74  terms */.    int
1fcc0 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b   isMinQuery = 0;
1fcd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1fce0 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74  f this is an opt
1fcf0 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69  imized SELECT mi
1fd00 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e  n(x).. */.    in
1fd10 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
1fd20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61             /* Ba
1fd30 73 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  se register hold
1fd40 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  ing constraint v
1fd50 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  alues */.    int
1fd60 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   r1;            
1fd70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
1fd80 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  p register */.  
1fd90 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
1fda0 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f  ngeStart = 0;  /
1fdb0 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
1fdc0 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
1fdd0 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68   start */.    Wh
1fde0 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45  ereTerm *pRangeE
1fdf0 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e  nd = 0;    /* In
1fe00 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1fe10 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64  int at range end
1fe20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72   */.    int star
1fe30 74 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  tEq;            
1fe40 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1fe50 72 61 6e 67 65 20 73 74 61 72 74 20 75 73 65 73  range start uses
1fe60 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
1fe70 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20  .    int endEq; 
1fe80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe90 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e    /* True if ran
1fea0 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20  ge end uses ==, 
1feb0 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20  >= or <= */.    
1fec0 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72  int start_constr
1fed0 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20  aints;       /* 
1fee0 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69  Start of range i
1fef0 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f  s constrained */
1ff00 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  .    int nConstr
1ff10 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  aint;           
1ff20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1ff30 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
1ff40 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
1ff50 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
1ff60 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
1ff70 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
1ff80 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  g */.    int iId
1ff90 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  xCur;           
1ffa0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
1ffb0 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
1ffc0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
1ffd0 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b  t nExtraReg = 0;
1ffe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1fff0 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
20000 67 69 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a  gisters needed *
20010 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20  /.    int op;   
20020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20030 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f     /* Instructio
20040 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  n opcode */.    
20050 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66 3b  char *zStartAff;
20060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20070 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74 61  Affinity for sta
20080 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  rt of range cons
20090 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68  traint */.    ch
200a0 61 72 20 2a 7a 45 6e 64 41 66 66 3b 20 20 20 20  ar *zEndAff;    
200b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
200c0 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20 6f  finity for end o
200d0 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  f range constrai
200e0 6e 74 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20  nt */..    pIdx 
200f0 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
20100 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 49 64  .pIndex;.    iId
20110 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
20120 49 64 78 43 75 72 3b 0a 0a 20 20 20 20 2f 2a 20  IdxCur;..    /* 
20130 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74  If this loop sat
20140 69 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72  isfies a sort or
20150 64 65 72 20 28 70 4f 72 64 65 72 42 79 29 20 72  der (pOrderBy) r
20160 65 71 75 65 73 74 20 74 68 61 74 20 0a 20 20 20  equest that .   
20170 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20 74   ** was passed t
20180 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
20190 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22  to implement a "
201a0 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e  SELECT min(x) ..
201b0 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79  ." .    ** query
201c0 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
201d0 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f  r will only allo
201e0 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75  w the loop to ru
201f0 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73  n for.    ** a s
20200 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e  ingle iteration.
20210 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
20220 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 72   the first row r
20230 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73  eturned.    ** s
20240 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61  hould not have a
20250 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72   NULL value stor
20260 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f  ed in 'x'. If co
20270 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20  lumn 'x' is.    
20280 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65  ** the first one
20290 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 65   after the nEq e
202a0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
202b0 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  nts in the index
202c0 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65  ,.    ** this re
202d0 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63  quires some spec
202e0 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20  ial handling..  
202f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 57    */.    if( (pW
20300 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
20310 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  &WHERE_ORDERBY_M
20320 49 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  IN)!=0.     && (
20330 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 21 3d  pWInfo->bOBSat!=
20340 30 29 0a 20 20 20 20 20 26 26 20 28 70 49 64 78  0).     && (pIdx
20350 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20  ->nColumn>nEq). 
20360 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61     ){.      /* a
20370 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d  ssert( pOrderBy-
20380 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a  >nExpr==1 ); */.
20390 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
203a0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e   pOrderBy->a[0].
203b0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
203c0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
203d0 45 71 5d 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20  Eq] ); */.      
203e0 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a  isMinQuery = 1;.
203f0 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20        nExtraReg 
20400 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
20410 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65 71  /* Find any ineq
20420 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
20430 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20  t terms for the 
20440 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a 20  start and end . 
20450 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e     ** of the ran
20460 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ge. .    */.    
20470 6a 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28  j = nEq;.    if(
20480 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
20490 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
204a0 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67  T ){.      pRang
204b0 65 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e  eStart = pLoop->
204c0 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20  aLTerm[j++];.   
204d0 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31     nExtraReg = 1
204e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
204f0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
20500 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
20510 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65   ){.      pRange
20520 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  End = pLoop->aLT
20530 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20  erm[j++];.      
20540 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
20550 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e     }..    /* Gen
20560 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
20570 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74  aluate all const
20580 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e  raint terms usin
20590 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a  g == or IN.    *
205a0 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
205b0 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20  values of those 
205c0 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61  terms in an arra
205d0 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20  y of registers. 
205e0 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
205f0 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a  t regBase..    *
20600 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  /.    regBase = 
20610 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54  codeAllEqualityT
20620 65 72 6d 73 28 70 50 61 72 73 65 2c 70 4c 65 76  erms(pParse,pLev
20630 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72 61 52 65  el,bRev,nExtraRe
20640 67 2c 26 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  g,&zStartAff);. 
20650 20 20 20 7a 45 6e 64 41 66 66 20 3d 20 73 71 6c     zEndAff = sql
20660 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
20670 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20   zStartAff);.   
20680 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65   addrNxt = pLeve
20690 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20  l->addrNxt;..   
206a0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
206b0 69 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72  ing a reverse or
206c0 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61  der scan on an a
206d0 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20  scending index, 
206e0 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77  or.    ** a forw
206f0 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f  ard order scan o
20700 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69  n a descending i
20710 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67  ndex, interchang
20720 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74  e the .    ** st
20730 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d  art and end term
20740 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61  s (pRangeStart a
20750 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20  nd pRangeEnd).. 
20760 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e     */.    if( (n
20770 45 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  Eq<pIdx->nColumn
20780 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d   && bRev==(pIdx-
20790 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
207a0 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29  ==SQLITE_SO_ASC)
207b0 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76 20  ).     || (bRev 
207c0 26 26 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  && pIdx->nColumn
207d0 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  ==nEq).    ){.  
207e0 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65      SWAP(WhereTe
207f0 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c  rm *, pRangeEnd,
20800 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20   pRangeStart);. 
20810 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61     }..    testca
20820 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  se( pRangeStart 
20830 26 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d  && (pRangeStart-
20840 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
20850 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  LE)!=0 );.    te
20860 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
20870 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74  art && (pRangeSt
20880 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
20890 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20   WO_GE)!=0 );.  
208a0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
208b0 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65  geEnd && (pRange
208c0 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
208d0 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20   WO_LE)!=0 );.  
208e0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
208f0 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65  geEnd && (pRange
20900 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
20910 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20   WO_GE)!=0 );.  
20920 20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52 61    startEq = !pRa
20930 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e  ngeStart || pRan
20940 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
20950 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
20960 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20  E);.    endEq = 
20970 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20    !pRangeEnd || 
20980 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
20990 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f  ator & (WO_LE|WO
209a0 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f  _GE);.    start_
209b0 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52  constraints = pR
209c0 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71  angeStart || nEq
209d0 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  >0;..    /* Seek
209e0 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f   the index curso
209f0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
20a00 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
20a10 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20      nConstraint 
20a20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
20a30 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20  RangeStart ){.  
20a40 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
20a50 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e   = pRangeStart->
20a60 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
20a70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
20a80 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
20a90 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
20aa0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52  );.      if( (pR
20ab0 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61  angeStart->wtFla
20ac0 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
20ad0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
20ae0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73  qlite3ExprCodeIs
20af0 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67  NullJump(v, pRig
20b00 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  ht, regBase+nEq,
20b10 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20   addrNxt);.     
20b20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74   }.      if( zSt
20b30 61 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20  artAff ){.      
20b40 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d    if( sqlite3Com
20b50 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69  pareAffinity(pRi
20b60 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e  ght, zStartAff[n
20b70 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46  Eq])==SQLITE_AFF
20b80 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20  _NONE){.        
20b90 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63    /* Since the c
20ba0 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20  omparison is to 
20bb0 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74  be performed wit
20bc0 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73  h no conversions
20bd0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70  .          ** ap
20be0 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65  plied to the ope
20bf0 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61  rands, set the a
20c00 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79  ffinity to apply
20c10 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20   to pRight to . 
20c20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49           ** SQLI
20c30 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f  TE_AFF_NONE.  */
20c40 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72  .          zStar
20c50 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49  tAff[nEq] = SQLI
20c60 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
20c70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
20c80 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65  f( sqlite3ExprNe
20c90 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
20ca0 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61  nge(pRight, zSta
20cb0 72 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20  rtAff[nEq]) ){. 
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 7d 20 20 0a 20     }.      }  . 
20d00 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
20d10 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ++;.      testca
20d20 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d  se( pRangeStart-
20d30 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
20d40 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d  VIRTUAL );.    }
20d50 65 6c 73 65 20 69 66 28 20 69 73 4d 69 6e 51 75  else if( isMinQu
20d60 65 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ery ){.      sql
20d70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20d80 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
20d90 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
20da0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
20db0 0a 20 20 20 20 20 20 73 74 61 72 74 45 71 20 3d  .      startEq =
20dc0 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f   0;.      start_
20dd0 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b  constraints = 1;
20de0 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41  .    }.    codeA
20df0 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61  pplyAffinity(pPa
20e00 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  rse, regBase, nC
20e10 6f 6e 73 74 72 61 69 6e 74 2c 20 7a 53 74 61 72  onstraint, zStar
20e20 74 41 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20  tAff);.    op = 
20e30 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f  aStartOp[(start_
20e40 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20  constraints<<2) 
20e50 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b  + (startEq<<1) +
20e60 20 62 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65   bRev];.    asse
20e70 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20  rt( op!=0 );.   
20e80 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
20e90 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20  P_Rewind );.    
20ea0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
20eb0 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20 74 65 73  _Last );.    tes
20ec0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
20ed0 65 6b 47 74 20 29 3b 0a 20 20 20 20 74 65 73 74  ekGt );.    test
20ee0 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
20ef0 6b 47 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63  kGe );.    testc
20f00 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
20f10 4c 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  Le );.    testca
20f20 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  se( op==OP_SeekL
20f30 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t );.    sqlite3
20f40 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
20f50 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64   op, iIdxCur, ad
20f60 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20  drNxt, regBase, 
20f70 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 0a 20  nConstraint);.. 
20f80 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76     /* Load the v
20f90 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65  alue for the ine
20fa0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
20fb0 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
20fc0 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67   the.    ** rang
20fd0 65 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20  e (if any)..    
20fe0 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  */.    nConstrai
20ff0 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66  nt = nEq;.    if
21000 28 20 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20  ( pRangeEnd ){. 
21010 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
21020 74 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70  t = pRangeEnd->p
21030 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
21040 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
21050 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
21060 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  e, regBase+nEq, 
21070 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
21080 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
21090 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
210a0 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66  e+nEq);.      if
210b0 28 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74  ( (pRangeEnd->wt
210c0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
210d0 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LL)==0 ){.      
210e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
210f0 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70  eIsNullJump(v, p
21100 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e  Right, regBase+n
21110 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  Eq, addrNxt);.  
21120 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
21130 7a 45 6e 64 41 66 66 20 29 7b 0a 20 20 20 20 20  zEndAff ){.     
21140 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
21150 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52  mpareAffinity(pR
21160 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45  ight, zEndAff[nE
21170 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  q])==SQLITE_AFF_
21180 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20  NONE){.         
21190 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f   /* Since the co
211a0 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62  mparison is to b
211b0 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68  e performed with
211c0 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a   no conversions.
211d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70            ** app
211e0 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72  lied to the oper
211f0 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66  ands, set the af
21200 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20  finity to apply 
21210 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20  to pRight to .  
21220 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54          ** SQLIT
21230 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a  E_AFF_NONE.  */.
21240 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66            zEndAf
21250 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
21260 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
21270 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
21280 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
21290 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
212a0 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66  (pRight, zEndAff
212b0 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20  [nEq]) ){.      
212c0 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d      zEndAff[nEq]
212d0 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
212e0 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
212f0 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20 63 6f      }  .      co
21300 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
21310 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
21320 20 6e 45 71 2b 31 2c 20 7a 45 6e 64 41 66 66 29   nEq+1, zEndAff)
21330 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61  ;.      nConstra
21340 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73  int++;.      tes
21350 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
21360 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
21370 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
21380 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
21390 72 65 65 28 64 62 2c 20 7a 53 74 61 72 74 41 66  ree(db, zStartAf
213a0 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  f);.    sqlite3D
213b0 62 46 72 65 65 28 64 62 2c 20 7a 45 6e 64 41 66  bFree(db, zEndAf
213c0 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20  f);..    /* Top 
213d0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79  of the loop body
213e0 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   */.    pLevel->
213f0 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p2 = sqlite3Vdbe
21400 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
21410 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  .    /* Check if
21420 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f   the index curso
21430 72 20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e  r is past the en
21440 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  d of the range. 
21450 2a 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e 64  */.    op = aEnd
21460 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c  Op[(pRangeEnd ||
21470 20 6e 45 71 29 20 2a 20 28 31 20 2b 20 62 52 65   nEq) * (1 + bRe
21480 76 29 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73  v)];.    testcas
21490 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29  e( op==OP_Noop )
214a0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
214b0 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a  op==OP_IdxGE );.
214c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
214d0 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20  ==OP_IdxLT );.  
214e0 20 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f    if( op!=OP_Noo
214f0 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
21500 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
21510 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20  v, op, iIdxCur, 
21520 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65  addrNxt, regBase
21530 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  , nConstraint);.
21540 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21550 65 43 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64  eChangeP5(v, end
21560 45 71 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a  Eq!=bRev ?1:0);.
21570 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
21580 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75   there are inequ
21590 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
215a0 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  s, check that th
215b0 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f  e value.    ** o
215c0 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
215d0 6d 6e 20 74 68 61 74 20 74 68 65 20 69 6e 65 71  mn that the ineq
215e0 75 61 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e 73  uality contrains
215f0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20   is not NULL..  
21600 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 6a    ** If it is, j
21610 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ump to the next 
21620 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
21630 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
21640 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
21650 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
21660 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
21670 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
21680 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
21690 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
216a0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
216b0 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
216c0 49 54 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  IT );.    if( (p
216d0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
216e0 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  (WHERE_BTM_LIMIT
216f0 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
21700 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ))!=0 ){.      s
21710 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
21720 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
21730 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72 31 29  IdxCur, nEq, r1)
21740 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21750 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21760 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64 72  IsNull, r1, addr
21770 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Cont);.    }.   
21780 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
21790 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
217a0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  1);..    /* Seek
217b0 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   the table curso
217c0 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  r, if required *
217d0 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72  /.    disableTer
217e0 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65  m(pLevel, pRange
217f0 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61  Start);.    disa
21800 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
21810 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20  pRangeEnd);.    
21820 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29  if( !omitTable )
21830 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
21840 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20  g = iReleaseReg 
21850 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
21860 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
21870 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21880 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f  dOp2(v, OP_IdxRo
21890 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52  wid, iIdxCur, iR
218a0 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
218b0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
218c0 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
218d0 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
218e0 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
218f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21900 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52  P_Seek, iCur, iR
21910 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65  owidReg);  /* De
21920 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20  ferred seek */. 
21930 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63     }..    /* Rec
21940 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75 63 74  ord the instruct
21950 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d  ion used to term
21960 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20  inate the loop. 
21970 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20  Disable .    ** 
21980 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
21990 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e  ms made redundan
219a0 74 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 72  t by the index r
219b0 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a  ange scan..    *
219c0 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  /.    if( pLoop-
219d0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
219e0 5f 4f 4e 45 52 4f 57 20 29 7b 0a 20 20 20 20 20  _ONEROW ){.     
219f0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
21a00 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65  _Noop;.    }else
21a10 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
21a20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
21a30 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c  OP_Prev;.    }el
21a40 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
21a50 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a  ->op = OP_Next;.
21a60 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
21a70 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a  ->p1 = iIdxCur;.
21a80 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
21a90 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
21aa0 43 4f 4e 53 54 52 41 49 4e 54 29 3d 3d 30 20 29  CONSTRAINT)==0 )
21ab0 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
21ac0 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54  p5 = SQLITE_STMT
21ad0 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
21ae0 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  STEP;.    }else{
21af0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21b00 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a  Level->p5==0 );.
21b10 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23      }.  }else..#
21b20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21b30 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
21b40 4f 4e 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  ON.  if( pLoop->
21b50 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
21b60 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20  MULTI_OR ){.    
21b70 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 77 6f 20  /* Case 5:  Two 
21b80 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65  or more separate
21b90 6c 79 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73  ly indexed terms
21ba0 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52   connected by OR
21bb0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
21bc0 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
21bd0 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54     **   CREATE T
21be0 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29  ABLE t1(a,b,c,d)
21bf0 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
21c00 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
21c10 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  (a);.    **   CR
21c20 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e  EATE INDEX i2 ON
21c30 20 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(b);.    **  
21c40 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 33   CREATE INDEX i3
21c50 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a   ON t1(c);.    *
21c60 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43  *.    **   SELEC
21c70 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
21c80 45 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20  E a=5 OR b=7 OR 
21c90 28 63 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a  (c=11 AND d=13).
21ca0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e      **.    ** In
21cb0 20 74 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68   the example, th
21cc0 65 72 65 20 61 72 65 20 74 68 72 65 65 20 69 6e  ere are three in
21cd0 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e  dexed terms conn
21ce0 65 63 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20  ected by OR..   
21cf0 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74   ** The top of t
21d00 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69  he loop looks li
21d10 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a  ke this:.    **.
21d20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
21d30 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20  Null       1    
21d40 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65              # Ze
21d50 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e  ro the rowset in
21d60 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20   reg 1.    **.  
21d70 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65    ** Then, for e
21d80 61 63 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d  ach indexed term
21d90 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e  , the following.
21da0 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74   The arguments t
21db0 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54  o.    ** RowSetT
21dc0 65 73 74 20 61 72 65 20 73 75 63 68 20 74 68 61  est are such tha
21dd0 74 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74  t the rowid of t
21de0 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69  he current row i
21df0 73 20 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a  s inserted.    *
21e00 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65  * into the RowSe
21e10 74 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65  t. If it is alre
21e20 61 64 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e  ady present, con
21e30 74 72 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20  trol skips the. 
21e40 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f     ** Gosub opco
21e50 64 65 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72  de and jumps str
21e60 61 69 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64  aight to the cod
21e70 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 57  e generated by W
21e80 68 65 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a  hereEnd()..    *
21e90 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
21ea0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
21eb0 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a  n(<term>).    **
21ec0 20 20 20 20 20 20 20 20 20 20 52 6f 77 53 65 74            RowSet
21ed0 54 65 73 74 20 20 20 20 20 20 20 20 20 20 20 20  Test            
21ee0 20 20 20 20 20 20 23 20 49 6e 73 65 72 74 20 72        # Insert r
21ef0 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74  owid into rowset
21f00 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
21f10 20 47 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a   Gosub      2 A.
21f20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71      **        sq
21f30 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a  lite3WhereEnd().
21f40 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
21f50 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76  llowing the abov
21f60 65 2c 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69  e, code to termi
21f70 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c  nate the loop. L
21f80 61 62 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67  abel A, the targ
21f90 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  et.    ** of the
21fa0 20 47 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75   Gosub above, ju
21fb0 6d 70 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72  mps to the instr
21fc0 75 63 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74  uction right aft
21fd0 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20  er the Goto..   
21fe0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
21ff0 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31      Null       1
22000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22010 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65  # Zero the rowse
22020 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a  t in reg 1.    *
22030 2a 20 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20  *          Goto 
22040 20 20 20 20 20 20 42 20 20 20 20 20 20 20 20 20        B         
22050 20 20 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f         # The loo
22060 70 20 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20  p is finished.. 
22070 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
22080 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79     A: <loop body
22090 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >               
220a0 20 20 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c    # Return data,
220b0 20 77 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a   whatever..    *
220c0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
220d0 20 20 52 65 74 75 72 6e 20 20 20 20 20 32 20 20    Return     2  
220e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
220f0 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65  Jump back to the
22100 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20   Gosub.    **.  
22110 20 20 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61    **       B: <a
22120 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20  fter the loop>. 
22130 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20     **.    */.   
22140 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f   WhereClause *pO
22150 72 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rWc;    /* The O
22160 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20  R-clause broken 
22170 6f 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  out into subterm
22180 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74  s */.    SrcList
22190 20 2a 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20   *pOrTab;       
221a0 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62  /* Shortened tab
221b0 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c  le list or OR-cl
221c0 61 75 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  ause generation 
221d0 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43  */.    Index *pC
221e0 6f 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ov = 0;         
221f0 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c      /* Potential
22200 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
22210 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20  (or NULL) */.   
22220 20 69 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70   int iCovCur = p
22230 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
22240 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20 66  /* Cursor used f
22250 6f 72 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28  or index scans (
22260 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20  if any) */..    
22270 69 6e 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20  int regReturn = 
22280 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20  ++pParse->nMem; 
22290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
222a0 69 73 74 65 72 20 75 73 65 64 20 77 69 74 68 20  ister used with 
222b0 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20  OP_Gosub */.    
222c0 69 6e 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20  int regRowset = 
222d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
222e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
222f0 69 73 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74  ister for RowSet
22300 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69   object */.    i
22310 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b  nt regRowid = 0;
22320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22330 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
22340 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77  ster holding row
22350 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c  id */.    int iL
22360 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65  oopBody = sqlite
22370 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
22380 29 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  );  /* Start of 
22390 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20  loop body */.   
223a0 20 69 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20   int iRetInit;  
223b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
223d0 64 72 65 73 73 20 6f 66 20 72 65 67 52 65 74 75  dress of regRetu
223e0 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69  rn init */.    i
223f0 6e 74 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73  nt untestedTerms
22400 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
22410 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20    /* Some terms 
22420 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74  not completely t
22430 65 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  ested */.    int
22440 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
22450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22460 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
22470 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 41 6e  */.    Expr *pAn
22480 64 45 78 70 72 20 3d 20 30 3b 20 20 20 20 20 20  dExpr = 0;      
22490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
224a0 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65  ".. AND (...)" e
224b0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
224c0 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f  .    pTerm = pLo
224d0 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20  op->aLTerm[0];. 
224e0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
224f0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
22500 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  t( pTerm->eOpera
22510 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20  tor & WO_OR );. 
22520 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
22530 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
22540 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a  M_ORINFO)!=0 );.
22550 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65      pOrWc = &pTe
22560 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
22570 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  c;.    pLevel->o
22580 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20  p = OP_Return;. 
22590 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
225a0 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20  regReturn;..    
225b0 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77 20  /* Set up a new 
225c0 53 72 63 4c 69 73 74 20 69 6e 20 70 4f 72 54 61  SrcList in pOrTa
225d0 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  b containing the
225e0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61   table being sca
225f0 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  nned.    ** by t
22600 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20  his loop in the 
22610 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c  a[0] slot and al
22620 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  l notReady table
22630 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74  s in a[1..] slot
22640 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  s..    ** This b
22650 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69  ecomes the SrcLi
22660 73 74 20 69 6e 20 74 68 65 20 72 65 63 75 72 73  st in the recurs
22670 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ive call to sqli
22680 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e  te3WhereBegin().
22690 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
226a0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31  pWInfo->nLevel>1
226b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e   ){.      int nN
226c0 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20  otReady;        
226d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
226e0 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61  number of notRea
226f0 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  dy tables */.   
22700 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
22710 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b  t_item *origSrc;
22720 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
22730 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   list of tables 
22740 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61  */.      nNotRea
22750 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  dy = pWInfo->nLe
22760 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31  vel - iLevel - 1
22770 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d  ;.      pOrTab =
22780 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c   sqlite3StackAll
22790 6f 63 52 61 77 28 64 62 2c 0a 20 20 20 20 20 20  ocRaw(db,.      
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227b0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f        sizeof(*pO
227c0 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79  rTab)+ nNotReady
227d0 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e  *sizeof(pOrTab->
227e0 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  a[0]));.      if
227f0 28 20 70 4f 72 54 61 62 3d 3d 30 20 29 20 72 65  ( pOrTab==0 ) re
22800 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20  turn notReady;. 
22810 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c       pOrTab->nAl
22820 6c 6f 63 20 3d 20 28 75 38 29 28 6e 4e 6f 74 52  loc = (u8)(nNotR
22830 65 61 64 79 20 2b 20 31 29 3b 0a 20 20 20 20 20  eady + 1);.     
22840 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20   pOrTab->nSrc = 
22850 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a  pOrTab->nAlloc;.
22860 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 72        memcpy(pOr
22870 54 61 62 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d  Tab->a, pTabItem
22880 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61 62 49 74  , sizeof(*pTabIt
22890 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72 69 67  em));.      orig
228a0 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Src = pWInfo->pT
228b0 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  abList->a;.     
228c0 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f   for(k=1; k<=nNo
228d0 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20  tReady; k++){.  
228e0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4f        memcpy(&pO
228f0 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69  rTab->a[k], &ori
22900 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69  gSrc[pLevel[k].i
22910 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f  From], sizeof(pO
22920 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20  rTab->a[k]));.  
22930 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
22940 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20  .      pOrTab = 
22950 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
22960 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
22970 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72  Initialize the r
22980 6f 77 73 65 74 20 72 65 67 69 73 74 65 72 20 74  owset register t
22990 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20  o contain NULL. 
229a0 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a  An SQL NULL is .
229b0 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e      ** equivalen
229c0 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f  t to an empty ro
229d0 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  wset..    **.   
229e0 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c   ** Also initial
229f0 69 7a 65 20 72 65 67 52 65 74 75 72 6e 20 74 6f  ize regReturn to
22a00 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 61 64 64   contain the add
22a10 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e 73 74  ress of the inst
22a20 72 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  ruction .    ** 
22a30 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
22a40 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 74  owing the OP_Ret
22a50 75 72 6e 20 61 74 20 74 68 65 20 62 6f 74 74 6f  urn at the botto
22a60 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54  m of the loop. T
22a70 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 72 65  his.    ** is re
22a80 71 75 69 72 65 64 20 69 6e 20 61 20 66 65 77 20  quired in a few 
22a90 6f 62 73 63 75 72 65 20 4c 45 46 54 20 4a 4f 49  obscure LEFT JOI
22aa0 4e 20 63 61 73 65 73 20 77 68 65 72 65 20 63 6f  N cases where co
22ab0 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20  ntrol jumps.    
22ac0 2a 2a 20 6f 76 65 72 20 74 68 65 20 74 6f 70 20  ** over the top 
22ad0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f  of the loop into
22ae0 20 74 68 65 20 62 6f 64 79 20 6f 66 20 69 74 2e   the body of it.
22af0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
22b00 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 63  e .    ** correc
22b10 74 20 72 65 73 70 6f 6e 73 65 20 66 6f 72 20 74  t response for t
22b20 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63  he end-of-loop c
22b30 6f 64 65 20 28 74 68 65 20 4f 50 5f 52 65 74 75  ode (the OP_Retu
22b40 72 6e 29 20 69 73 20 74 6f 20 0a 20 20 20 20 2a  rn) is to .    *
22b50 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  * fall through t
22b60 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
22b70 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20  uction, just as 
22b80 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20  an OP_Next does 
22b90 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64  if.    ** called
22ba0 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c   on an uninitial
22bb0 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20 20 20  ized cursor..   
22bc0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 57 49   */.    if( (pWI
22bd0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
22be0 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54  & WHERE_DUPLICAT
22bf0 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20  ES_OK)==0 ){.   
22c00 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20 2b     regRowset = +
22c10 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
22c20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20       regRowid = 
22c30 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
22c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22c50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
22c60 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73 65 74  ll, 0, regRowset
22c70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65  );.    }.    iRe
22c80 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56  tInit = sqlite3V
22c90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
22ca0 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52  Integer, 0, regR
22cb0 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20  eturn);..    /* 
22cc0 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
22cd0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
22ce0 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  z of the form:  
22cf0 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e  (x1 OR x2 OR ...
22d00 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54  ) AND y.    ** T
22d10 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20 74 65  hen for every te
22d20 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74 65 20  rm xN, evaluate 
22d30 61 73 20 74 68 65 20 73 75 62 65 78 70 72 65 73  as the subexpres
22d40 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20  sion: xN AND z. 
22d50 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20     ** That way, 
22d60 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61 74 20  terms in y that 
22d70 61 72 65 20 66 61 63 74 6f 72 65 64 20 69 6e 74  are factored int
22d80 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74 69 6f  o the disjunctio
22d90 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  n will.    ** be
22da0 20 70 69 63 6b 65 64 20 75 70 20 62 79 20 74 68   picked up by th
22db0 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
22dc0 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  s to sqlite3Wher
22dd0 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a  eBegin() below..
22de0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63      **.    ** Ac
22df0 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73 75 62  tually, each sub
22e00 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
22e10 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e 20 41  nverted to "xN A
22e20 4e 44 20 77 22 20 77 68 65 72 65 20 77 20 69 73  ND w" where w is
22e30 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69 6e 74  .    ** the "int
22e40 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d 73 20  eresting" terms 
22e50 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74 68 61  of z - terms tha
22e60 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e  t did not origin
22e70 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ate in the.    *
22e80 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  * ON or USING cl
22e90 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
22ea0 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20 74  OIN, and terms t
22eb0 68 61 74 20 61 72 65 20 75 73 61 62 6c 65 20 61  hat are usable a
22ec0 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  s .    ** indice
22ed0 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
22ee0 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   This optimizati
22ef0 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70  on also only app
22f00 6c 69 65 73 20 69 66 20 74 68 65 20 28 78 31 20  lies if the (x1 
22f10 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65  OR x2 OR ...) te
22f20 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  rm.    ** is not
22f30 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
22f40 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61  e ON clause of a
22f50 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20   LEFT JOIN..    
22f60 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 20 68 74  ** See ticket ht
22f70 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e  tp://www.sqlite.
22f80 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33  org/src/info/f23
22f90 36 39 33 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20  69304e4.    */. 
22fa0 20 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72     if( pWC->nTer
22fb0 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  m>1 ){.      int
22fc0 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f   iTerm;.      fo
22fd0 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d  r(iTerm=0; iTerm
22fe0 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65  <pWC->nTerm; iTe
22ff0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45  rm++){.        E
23000 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 57 43  xpr *pExpr = pWC
23010 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72  ->a[iTerm].pExpr
23020 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 26 70  ;.        if( &p
23030 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d 3d 20  WC->a[iTerm] == 
23040 70 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65  pTerm ) continue
23050 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78  ;.        if( Ex
23060 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
23070 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
23080 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
23090 20 20 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61        if( pWC->a
230a0 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20  [iTerm].wtFlags 
230b0 26 20 28 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 20  & (TERM_ORINFO) 
230c0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
230d0 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b      if( (pWC->a[
230e0 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f 72  iTerm].eOperator
230f0 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20   & WO_ALL)==0 ) 
23100 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
23110 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
23120 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
23130 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
23140 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74  pAndExpr = sqlit
23150 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 41  e3ExprAnd(db, pA
23160 6e 64 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a  ndExpr, pExpr);.
23170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
23180 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20  ( pAndExpr ){.  
23190 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d        pAndExpr =
231a0 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
231b0 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  arse, TK_AND, 0,
231c0 20 70 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a 20   pAndExpr, 0);. 
231d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
231e0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
231f0 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b  OrWc->nTerm; ii+
23200 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54  +){.      WhereT
23210 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26  erm *pOrTerm = &
23220 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20  pOrWc->a[ii];.  
23230 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
23240 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
23250 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d 2d 3e 65  r || (pOrTerm->e
23260 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e  Operator & WO_AN
23270 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  D)!=0 ){.       
23280 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62   WhereInfo *pSub
23290 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
232a0 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67  /* Info for sing
232b0 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20  le OR-term scan 
232c0 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  */.        Expr 
232d0 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f 72 54 65  *pOrExpr = pOrTe
232e0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
232f0 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
23300 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
23310 72 74 79 28 70 4f 72 45 78 70 72 2c 20 45 50 5f  rty(pOrExpr, EP_
23320 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
23330 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d         pAndExpr-
23340 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45 78 70 72  >pLeft = pOrExpr
23350 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 45  ;.          pOrE
23360 78 70 72 20 3d 20 70 41 6e 64 45 78 70 72 3b 0a  xpr = pAndExpr;.
23370 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23380 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
23390 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20  h table entries 
233a0 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20  that match term 
233b0 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  pOrTerm. */.    
233c0 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20      pSubWInfo = 
233d0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
233e0 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62  n(pParse, pOrTab
233f0 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c  , pOrExpr, 0, 0,
23400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23410 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f           WHERE_O
23420 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 20 7c  MIT_OPEN_CLOSE |
23430 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20   WHERE_AND_ONLY 
23440 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
23450 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
23460 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20 57 48  FORCE_TABLE | WH
23470 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
23480 59 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20 20 20  Y, iCovCur);.   
23490 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
234a0 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65  bWInfo || pParse
234b0 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
234c0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
234d0 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49        if( pSubWI
234e0 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
234f0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62   WhereLoop *pSub
23500 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  Loop;.          
23510 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  explainOneScan(.
23520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
23530 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70  arse, pOrTab, &p
23540 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20  SubWInfo->a[0], 
23550 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e  iLevel, pLevel->
23560 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20  iFrom, 0.       
23570 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
23580 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
23590 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
235a0 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d  DUPLICATES_OK)==
235b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
235c0 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28 69 69   int iSet = ((ii
235d0 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  ==pOrWc->nTerm-1
235e0 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20 20  )?-1:ii);.      
235f0 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20        int r;.   
23600 20 20 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c           r = sql
23610 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
23620 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54  olumn(pParse, pT
23630 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20 2d 31  abItem->pTab, -1
23640 2c 20 69 43 75 72 2c 20 0a 20 20 20 20 20 20 20  , iCur, .       
23650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23670 20 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a    regRowid, 0);.
23680 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
23690 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
236a0 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73  (v, OP_RowSetTes
236b0 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a 20 20  t, regRowset,.  
236c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
236e0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
236f0 74 41 64 64 72 28 76 29 2b 32 2c 20 72 2c 20 69  tAddr(v)+2, r, i
23700 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Set);.          
23710 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
23720 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
23730 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65   OP_Gosub, regRe
23740 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29  turn, iLoopBody)
23750 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
23760 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75  The pSubWInfo->u
23770 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61  ntestedTerms fla
23780 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  g means that thi
23790 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20  s OR term.      
237a0 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64      ** contained
237b0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44   one or more AND
237c0 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74   term from a not
237d0 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68  Ready table.  Th
237e0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
237f0 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f  erms from the no
23800 74 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75  tReady table cou
23810 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64  ld not be tested
23820 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20   and will.      
23830 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62      ** need to b
23840 65 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a  e tested later..
23850 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
23860 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57         if( pSubW
23870 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
23880 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54 65  rms ) untestedTe
23890 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20  rms = 1;..      
238a0 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66      /* If all of
238b0 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65   the OR-connecte
238c0 64 20 74 65 72 6d 73 20 61 72 65 20 6f 70 74 69  d terms are opti
238d0 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20  mized using the 
238e0 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a  same.          *
238f0 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 65  * index, and the
23900 20 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64   index is opened
23910 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
23920 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20  cursor number.  
23930 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 65 61          ** by ea
23940 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ch call to sqlit
23950 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 6d  e3WhereBegin() m
23960 61 64 65 20 62 79 20 74 68 69 73 20 6c 6f 6f 70  ade by this loop
23970 2c 20 69 74 20 6d 61 79 0a 20 20 20 20 20 20 20  , it may.       
23980 20 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c     ** be possibl
23990 65 20 74 6f 20 75 73 65 20 74 68 61 74 20 69 6e  e to use that in
239a0 64 65 78 20 61 73 20 61 20 63 6f 76 65 72 69 6e  dex as a coverin
239b0 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  g index..       
239c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
239d0 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74  ** If the call t
239e0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
239f0 67 69 6e 28 29 20 61 62 6f 76 65 20 72 65 73 75  gin() above resu
23a00 6c 74 65 64 20 69 6e 20 61 20 73 63 61 6e 20 74  lted in a scan t
23a10 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
23a20 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20   uses an index, 
23a30 61 6e 64 20 74 68 69 73 20 69 73 20 65 69 74 68  and this is eith
23a40 65 72 20 74 68 65 20 66 69 72 73 74 20 4f 52 2d  er the first OR-
23a50 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a 20  connected term. 
23a60 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
23a70 65 73 73 65 64 20 6f 72 20 74 68 65 20 69 6e 64  essed or the ind
23a80 65 78 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ex is the same a
23a90 73 20 74 68 61 74 20 75 73 65 64 20 62 79 20 61  s that used by a
23aa0 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20  ll previous.    
23ab0 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20        ** terms, 
23ac0 73 65 74 20 70 43 6f 76 20 74 6f 20 74 68 65 20  set pCov to the 
23ad0 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69  candidate coveri
23ae0 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68 65 72 77  ng index. Otherw
23af0 69 73 65 2c 20 73 65 74 20 0a 20 20 20 20 20 20  ise, set .      
23b00 20 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e      ** pCov to N
23b10 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ULL to indicate 
23b20 74 68 61 74 20 6e 6f 20 63 61 6e 64 69 64 61 74  that no candidat
23b30 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  e covering index
23b40 20 77 69 6c 6c 20 0a 20 20 20 20 20 20 20 20 20   will .         
23b50 20 2a 2a 20 62 65 20 61 76 61 69 6c 61 62 6c 65   ** be available
23b60 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
23b70 20 20 20 20 20 20 20 20 20 70 53 75 62 4c 6f 6f           pSubLoo
23b80 70 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61  p = pSubWInfo->a
23b90 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  [0].pWLoop;.    
23ba0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
23bb0 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  SubLoop->wsFlags
23bc0 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
23bd0 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  DEX)==0 );.     
23be0 20 20 20 20 20 69 66 28 20 28 70 53 75 62 4c 6f       if( (pSubLo
23bf0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
23c00 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
23c10 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69             && (i
23c20 69 3d 3d 30 20 7c 7c 20 70 53 75 62 4c 6f 6f 70  i==0 || pSubLoop
23c30 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
23c40 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20 20 20 20  ==pCov).        
23c50 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
23c60 20 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e   assert( pSubWIn
23c70 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78 43 75 72  fo->a[0].iIdxCur
23c80 3d 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20 20 20  ==iCovCur );.   
23c90 20 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20           pCov = 
23ca0 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  pSubLoop->u.btre
23cb0 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  e.pIndex;.      
23cc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23cd0 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30 3b         pCov = 0;
23ce0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
23cf0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73          /* Finis
23d00 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75  h the loop throu
23d10 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  gh table entries
23d20 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d   that match term
23d30 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20   pOrTerm. */.   
23d40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
23d50 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f  ereEnd(pSubWInfo
23d60 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
23d70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
23d80 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78  Level->u.pCovidx
23d90 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69 66 28   = pCov;.    if(
23da0 20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d 3e   pCov ) pLevel->
23db0 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43 75  iIdxCur = iCovCu
23dc0 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64 45  r;.    if( pAndE
23dd0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41 6e  xpr ){.      pAn
23de0 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30  dExpr->pLeft = 0
23df0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
23e00 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 41  xprDelete(db, pA
23e10 6e 64 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  ndExpr);.    }. 
23e20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
23e30 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e  angeP1(v, iRetIn
23e40 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  it, sqlite3VdbeC
23e50 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
23e60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23e70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
23e80 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  , 0, pLevel->add
23e90 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  rBrk);.    sqlit
23ea0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
23eb0 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29  el(v, iLoopBody)
23ec0 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  ;..    if( pWInf
23ed0 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71  o->nLevel>1 ) sq
23ee0 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64  lite3StackFree(d
23ef0 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20  b, pOrTab);.    
23f00 69 66 28 20 21 75 6e 74 65 73 74 65 64 54 65 72  if( !untestedTer
23f10 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d  ms ) disableTerm
23f20 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
23f30 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
23f40 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  /* SQLITE_OMIT_O
23f50 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  R_OPTIMIZATION *
23f60 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61  /..  {.    /* Ca
23f70 73 65 20 36 3a 20 20 54 68 65 72 65 20 69 73 20  se 6:  There is 
23f80 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e  no usable index.
23f90 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63    We must do a c
23fa0 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20  omplete.    **  
23fb0 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20          scan of 
23fc0 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65  the entire table
23fd0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61  ..    */.    sta
23fe0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
23ff0 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74  ep[] = { OP_Next
24000 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20  , OP_Prev };.   
24010 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
24020 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50   aStart[] = { OP
24030 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74  _Rewind, OP_Last
24040 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   };.    assert( 
24050 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d  bRev==0 || bRev=
24060 3d 31 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  =1 );.    pLevel
24070 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65  ->op = aStep[bRe
24080 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  v];.    pLevel->
24090 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  p1 = iCur;.    p
240a0 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20  Level->p2 = 1 + 
240b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
240c0 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76  2(v, aStart[bRev
240d0 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  ], iCur, addrBrk
240e0 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  );.    pLevel->p
240f0 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  5 = SQLITE_STMTS
24100 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
24110 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 65 77 4e 6f  TEP;.  }.  newNo
24120 74 52 65 61 64 79 20 3d 20 6e 6f 74 52 65 61 64  tReady = notRead
24130 79 20 26 20 7e 67 65 74 4d 61 73 6b 28 26 70 57  y & ~getMask(&pW
24140 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
24150 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73  iCur);..  /* Ins
24160 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74  ert code to test
24170 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73   every subexpres
24180 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65  sion that can be
24190 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a   completely.  **
241a0 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20   computed using 
241b0 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20  the current set 
241c0 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  of tables..  */.
241d0 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
241e0 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d  >a, j=pWC->nTerm
241f0 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72  ; j>0; j--, pTer
24200 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
24210 70 45 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  pE;.    testcase
24220 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
24230 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
24240 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
24250 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
24260 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a  & TERM_CODED );.
24270 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
24280 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
24290 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
242a0 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
242b0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
242c0 72 65 72 65 71 41 6c 6c 20 26 20 6e 65 77 4e 6f  rereqAll & newNo
242d0 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20  tReady)!=0 ){.  
242e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57      testcase( pW
242f0 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
24300 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  rms==0.         
24310 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
24320 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
24330 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
24340 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  LY)!=0 );.      
24350 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
24360 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20  Terms = 1;.     
24370 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
24380 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d  .    pE = pTerm-
24390 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >pExpr;.    asse
243a0 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20  rt( pE!=0 );.   
243b0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
243c0 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48  ftJoin && !ExprH
243d0 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
243e0 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
243f0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
24400 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
24410 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
24420 73 65 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74  se, pE, addrCont
24430 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
24440 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d  ULL);.    pTerm-
24450 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
24460 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f  _CODED;.  }..  /
24470 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f  * Insert code to
24480 20 74 65 73 74 20 66 6f 72 20 69 6d 70 6c 69 65   test for implie
24490 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 61  d constraints ba
244a0 73 65 64 20 6f 6e 20 74 72 61 6e 73 69 74 69 76  sed on transitiv
244b0 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ity.  ** of the 
244c0 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72 2e 0a 20  "==" operator.. 
244d0 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65   **.  ** Example
244e0 3a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  : If the WHERE c
244f0 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 22  lause contains "
24500 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e 64 20 22  t1.a=t2.b" and "
24510 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a 2a 20 61  t2.b=123".  ** a
24520 6e 64 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67  nd we are coding
24530 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64   the t1 loop and
24540 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 68 61 73   the t2 loop has
24550 20 6e 6f 74 20 79 65 74 20 63 6f 64 65 64 2c 0a   not yet coded,.
24560 20 20 2a 2a 20 74 68 65 6e 20 77 65 20 63 61 6e    ** then we can
24570 6e 6f 74 20 75 73 65 20 74 68 65 20 22 74 31 2e  not use the "t1.
24580 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74 72 61 69  a=t2.b" constrai
24590 6e 74 2c 20 62 75 74 20 77 65 20 63 61 6e 20 63  nt, but we can c
245a0 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20 69 6d 70  ode.  ** the imp
245b0 6c 69 65 64 20 22 74 31 2e 61 3d 31 32 33 22 20  lied "t1.a=123" 
245c0 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f  constraint..  */
245d0 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
245e0 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72  ->a, j=pWC->nTer
245f0 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65  m; j>0; j--, pTe
24600 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
24610 2a 70 45 2c 20 2a 70 45 41 6c 74 3b 0a 20 20 20  *pE, *pEAlt;.   
24620 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6c 74   WhereTerm *pAlt
24630 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
24640 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
24650 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
24660 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
24670 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
24680 65 4f 70 65 72 61 74 6f 72 21 3d 28 57 4f 5f 45  eOperator!=(WO_E
24690 51 55 49 56 7c 57 4f 5f 45 51 29 20 29 20 63 6f  QUIV|WO_EQ) ) co
246a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
246b0 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
246c0 72 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  r!=iCur ) contin
246d0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  ue;.    if( pLev
246e0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 20  el->iLeftJoin ) 
246f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45  continue;.    pE
24700 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
24710 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
24720 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
24730 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
24740 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
24750 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
24760 74 20 26 20 6e 65 77 4e 6f 74 52 65 61 64 79 29  t & newNotReady)
24770 21 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c 74 20  !=0 );.    pAlt 
24780 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
24790 69 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c  iCur, pTerm->u.l
247a0 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65  eftColumn, notRe
247b0 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  ady, WO_EQ|WO_IN
247c0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 41  , 0);.    if( pA
247d0 6c 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  lt==0 ) continue
247e0 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74 2d 3e  ;.    if( pAlt->
247f0 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
24800 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
24810 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  e;.    testcase(
24820 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72   pAlt->eOperator
24830 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20   & WO_EQ );.    
24840 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e  testcase( pAlt->
24850 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
24860 4e 20 29 3b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  N );.    VdbeNoo
24870 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65  pComment((v, "be
24880 67 69 6e 20 74 72 61 6e 73 69 74 69 76 65 20 63  gin transitive c
24890 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b 0a 20 20  onstraint"));.  
248a0 20 20 70 45 41 6c 74 20 3d 20 73 71 6c 69 74 65    pEAlt = sqlite
248b0 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64  3StackAllocRaw(d
248c0 62 2c 20 73 69 7a 65 6f 66 28 2a 70 45 41 6c 74  b, sizeof(*pEAlt
248d0 29 29 3b 0a 20 20 20 20 69 66 28 20 70 45 41 6c  ));.    if( pEAl
248e0 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 41 6c  t ){.      *pEAl
248f0 74 20 3d 20 2a 70 41 6c 74 2d 3e 70 45 78 70 72  t = *pAlt->pExpr
24900 3b 0a 20 20 20 20 20 20 70 45 41 6c 74 2d 3e 70  ;.      pEAlt->p
24910 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c 65 66 74  Left = pE->pLeft
24920 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
24930 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
24940 65 2c 20 70 45 41 6c 74 2c 20 61 64 64 72 43 6f  e, pEAlt, addrCo
24950 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nt, SQLITE_JUMPI
24960 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  FNULL);.      sq
24970 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64  lite3StackFree(d
24980 62 2c 20 70 45 41 6c 74 29 3b 0a 20 20 20 20 7d  b, pEAlt);.    }
24990 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61  .  }..  /* For a
249a0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
249b0 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
249c0 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64  that will record
249d0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20   the fact that. 
249e0 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
249f0 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68   row of the righ
24a00 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63  t table has matc
24a10 68 65 64 20 74 68 65 20 6c 65 66 74 20 74 61 62  hed the left tab
24a20 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28  le.  .  */.  if(
24a30 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
24a40 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  in ){.    pLevel
24a50 2d 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73 71  ->addrFirst = sq
24a60 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
24a70 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
24a80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
24a90 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
24aa0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
24ab0 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  in);.    VdbeCom
24ac0 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64  ment((v, "record
24ad0 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29   LEFT JOIN hit")
24ae0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
24af0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
24b00 72 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 54  rse);.    for(pT
24b10 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b  erm=pWC->a, j=0;
24b20 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a   j<pWC->nTerm; j
24b30 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
24b40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
24b50 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
24b60 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
24b70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
24b80 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
24b90 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
24ba0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
24bb0 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
24bc0 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
24bd0 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
24be0 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
24bf0 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 65 77  >prereqAll & new
24c00 4e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a  NotReady)!=0 ){.
24c10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
24c20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
24c30 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20  Terms );.       
24c40 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
24c50 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
24c60 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b   pTerm->pExpr );
24c70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
24c80 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
24c90 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  , pTerm->pExpr, 
24ca0 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45  addrCont, SQLITE
24cb0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
24cc0 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
24cd0 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
24ce0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
24cf0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
24d00 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65 6c  Reg(pParse, iRel
24d10 65 61 73 65 52 65 67 29 3b 0a 0a 20 20 72 65 74  easeReg);..  ret
24d20 75 72 6e 20 6e 65 77 4e 6f 74 52 65 61 64 79 3b  urn newNotReady;
24d30 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45  .}..#ifdef WHERE
24d40 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
24d50 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72  .** Print a Wher
24d60 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72  eLoop object for
24d70 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f   debugging purpo
24d80 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ses.*/.static vo
24d90 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e  id whereLoopPrin
24da0 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  t(WhereLoop *p, 
24db0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
24dc0 74 29 7b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31  t){.  int nb = 1
24dd0 2b 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  +(pTabList->nSrc
24de0 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63 74 20  +7)/8;.  struct 
24df0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
24e00 74 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  tem = pTabList->
24e10 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54  a + p->iTab;.  T
24e20 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74  able *pTab = pIt
24e30 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69  em->pTab;.  sqli
24e40 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24e50 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a  %c%2d.%0*llx.%0*
24e60 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20  llx", p->cId,.  
24e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e80 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20     p->iTab, nb, 
24e90 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c  p->maskSelf, nb,
24ea0 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20 73   p->prereq);.  s
24eb0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24ec0 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20  f(" %12s",.     
24ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ee0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20  pItem->zAlias ? 
24ef0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20  pItem->zAlias : 
24f00 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
24f10 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
24f20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
24f30 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
24f40 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  if( p->u.btree.p
24f50 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 63  Index ){.      c
24f60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
24f70 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49   = p->u.btree.pI
24f80 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  ndex->zName;.   
24f90 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
24fa0 29 20 7a 4e 61 6d 65 20 3d 20 22 69 70 6b 22 3b  ) zName = "ipk";
24fb0 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
24fc0 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
24fd0 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31  e_autoindex_", 1
24fe0 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  7)==0 ){.       
24ff0 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33   int i = sqlite3
25000 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20  Strlen30(zName) 
25010 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69  - 1;.        whi
25020 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f  le( zName[i]!='_
25030 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20  ' ) i--;.       
25040 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20   zName += i;.   
25050 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
25060 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2e  e3DebugPrintf(".
25070 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d  %-16s %2d", zNam
25080 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  e, p->u.btree.nE
25090 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  q);.    }else{. 
250a0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
250b0 67 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c 22  gPrintf("%20s","
250c0 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ");.    }.  }els
250d0 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  e{.    char *z;.
250e0 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74 61      if( p->u.vta
250f0 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20  b.idxStr ){.    
25100 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
25110 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73 5c  rintf("(%d,\"%s\
25120 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20 20  ",%x)",.        
25130 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61          p->u.vta
25140 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76  b.idxNum, p->u.v
25150 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75  tab.idxStr, p->u
25160 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b  .vtab.omitMask);
25170 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25180 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
25190 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22 2c  rintf("(%d,%x)",
251a0 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75   p->u.vtab.idxNu
251b0 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  m, p->u.vtab.omi
251c0 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  tMask);.    }.  
251d0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
251e0 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20 7a  intf(" %-19s", z
251f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
25200 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 73 71  ree(z);.  }.  sq
25210 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
25220 28 22 20 66 20 25 30 34 78 20 4e 20 25 64 22 2c  (" f %04x N %d",
25230 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e   p->wsFlags, p->
25240 6e 4c 54 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74  nLTerm);.  sqlit
25250 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
25260 63 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22  cost %d,%d,%d\n"
25270 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e  , p->rSetup, p->
25280 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a  rRun, p->nOut);.
25290 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
252a0 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d  Convert bulk mem
252b0 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64  ory into a valid
252c0 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
252d0 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a  can be passed.**
252e0 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65   to whereLoopCle
252f0 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a  ar harmlessly..*
25300 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
25310 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72  ereLoopInit(Wher
25320 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e  eLoop *p){.  p->
25330 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65  aLTerm = p->aLTe
25340 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c  rmSpace;.  p->nL
25350 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  Term = 0;.  p->n
25360 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a  LSlot = ArraySiz
25370 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  e(p->aLTermSpace
25380 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20  );.  p->wsFlags 
25390 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
253a0 65 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  ear the WhereLoo
253b0 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76  p.u union.  Leav
253c0 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65  e WhereLoop.pLTe
253d0 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74  rm intact..*/.st
253e0 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
253f0 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71  oopClearUnion(sq
25400 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
25410 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20  Loop *p){.  if( 
25420 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
25430 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
25440 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45  |WHERE_AUTO_INDE
25450 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70  X) ){.    if( (p
25460 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
25470 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
25480 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e  =0 && p->u.vtab.
25490 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20  needFree ){.    
254a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
254b0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29  ->u.vtab.idxStr)
254c0 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61  ;.      p->u.vta
254d0 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
254e0 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
254f0 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  idxStr = 0;.    
25500 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73  }else if( (p->ws
25510 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
25520 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20  TO_INDEX)!=0 && 
25530 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
25540 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  x!=0 ){.      sq
25550 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
25560 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
25570 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20  x->zColAff);.   
25580 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
25590 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  (db, p->u.btree.
255a0 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70  pIndex);.      p
255b0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
255c0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
255d0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
255e0 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d  ate internal mem
255f0 6f 72 79 20 75 73 65 64 20 62 79 20 61 20 57 68  ory used by a Wh
25600 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a  ereLoop object.*
25610 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
25620 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c  ereLoopClear(sql
25630 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
25640 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  oop *p){.  if( p
25650 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54  ->aLTerm!=p->aLT
25660 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74  ermSpace ) sqlit
25670 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
25680 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65  aLTerm);.  where
25690 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64  LoopClearUnion(d
256a0 62 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f  b, p);.  whereLo
256b0 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a  opInit(p);.}../*
256c0 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65  .** Increase the
256d0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
256e0 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c  on for pLoop->aL
256f0 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20  Term[] to be at 
25700 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74  least n..*/.stat
25710 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
25720 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a  Resize(sqlite3 *
25730 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
25740 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72  , int n){.  Wher
25750 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20  eTerm **paNew;. 
25760 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d   if( p->nLSlot>=
25770 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n ) return SQLIT
25780 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37  E_OK;.  n = (n+7
25790 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20  )&~7;.  paNew = 
257a0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
257b0 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d  aw(db, sizeof(p-
257c0 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a  >aLTerm[0])*n);.
257d0 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29    if( paNew==0 )
257e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
257f0 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70  OMEM;.  memcpy(p
25800 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c  aNew, p->aLTerm,
25810 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72   sizeof(p->aLTer
25820 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29  m[0])*p->nLSlot)
25830 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  ;.  if( p->aLTer
25840 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
25850 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
25860 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  e(db, p->aLTerm)
25870 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  ;.  p->aLTerm = 
25880 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c  paNew;.  p->nLSl
25890 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e  ot = n;.  return
258a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
258b0 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f  *.** Transfer co
258c0 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73  ntent from the s
258d0 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f  econd pLoop into
258e0 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73   the first..*/.s
258f0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
25900 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20  oopXfer(sqlite3 
25910 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
25920 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  pTo, WhereLoop *
25930 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 77 68  pFrom){.  if( wh
25940 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
25950 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c  , pTo, pFrom->nL
25960 54 65 72 6d 29 20 29 20 72 65 74 75 72 6e 20 53  Term) ) return S
25970 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 77  QLITE_NOMEM;.  w
25980 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
25990 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 6d  on(db, pTo);.  m
259a0 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d  emcpy(pTo, pFrom
259b0 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45  , WHERE_LOOP_XFE
259c0 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28  R_SZ);.  memcpy(
259d0 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72  pTo->aLTerm, pFr
259e0 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d  om->aLTerm, pTo-
259f0 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70  >nLTerm*sizeof(p
25a00 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b  To->aLTerm[0]));
25a10 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73  .  if( pFrom->ws
25a20 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
25a30 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20  RTUALTABLE ){.  
25a40 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e    pFrom->u.vtab.
25a50 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
25a60 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d  }else if( (pFrom
25a70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
25a80 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
25a90 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75   ){.    pFrom->u
25aa0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
25ab0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
25ac0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
25ad0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65  .** Delete a Whe
25ae0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f  reLoop object.*/
25af0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
25b00 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c  reLoopDelete(sql
25b10 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
25b20 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65  oop *p){.  where
25b30 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29  LoopClear(db, p)
25b40 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
25b50 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
25b60 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49  ** Free a WhereI
25b70 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f  nfo structure.*/
25b80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
25b90 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74  reInfoFree(sqlit
25ba0 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66  e3 *db, WhereInf
25bb0 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66  o *pWInfo){.  if
25bc0 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29  ( ALWAYS(pWInfo)
25bd0 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61   ){.    whereCla
25be0 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f  useClear(&pWInfo
25bf0 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c  ->sWC);.    whil
25c00 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  e( pWInfo->pLoop
25c10 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  s ){.      Where
25c20 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f  Loop *p = pWInfo
25c30 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20  ->pLoops;.      
25c40 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d  pWInfo->pLoops =
25c50 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20   p->pNextLoop;. 
25c60 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65       whereLoopDe
25c70 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  lete(db, p);.   
25c80 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
25c90 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
25ca0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
25cb0 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65  nsert or replace
25cc0 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74   a WhereLoop ent
25cd0 72 79 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d  ry using the tem
25ce0 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a  plate supplied..
25cf0 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
25d00 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  g WhereLoop entr
25d10 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77  y might be overw
25d20 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65  ritten if the ne
25d30 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73  w template.** is
25d40 20 62 65 74 74 65 72 20 61 6e 64 20 68 61 73 20   better and has 
25d50 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
25d60 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70  es.  Or the temp
25d70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e  late will be ign
25d80 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69  ored.** and no i
25d90 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72  nsert will occur
25da0 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
25db0 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73  WhereLoop is fas
25dc0 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66  ter and has.** f
25dd0 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
25de0 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c  s than the templ
25df0 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ate.  Otherwise 
25e00 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20  a new WhereLoop 
25e10 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65  is.** added base
25e20 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  d on the templat
25e30 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69  e..**.** If pBui
25e40 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
25e50 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65  not NULL then we
25e60 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74   only care about
25e70 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65   only the.** pre
25e80 72 65 71 75 69 73 69 74 65 73 20 61 6e 64 20 72  requisites and r
25e90 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73  Run and nOut cos
25ea0 74 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74  ts of the N best
25eb0 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a   loops.  That.**
25ec0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
25ed0 67 61 74 68 65 72 65 64 20 69 6e 20 74 68 65 20  gathered in the 
25ee0 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
25ef0 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73   object.  This s
25f00 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73  pecial.** proces
25f10 73 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65  sing mode is use
25f20 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c  d only for OR cl
25f30 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
25f40 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75  .**.** When accu
25f50 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c  mulating multipl
25f60 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42  e loops (when pB
25f70 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69  uilder->pOrSet i
25f80 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74  s NULL) we.** st
25f90 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72  ill might overwr
25fa0 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70  ite similar loop
25fb0 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 74  s with the new t
25fc0 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a  emplate if the.*
25fd0 2a 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65  * template is be
25fe0 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79  tter.  Loops may
25ff0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
26000 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
26010 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20   .** conditions 
26020 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
26030 20 20 28 31 29 20 20 54 68 65 79 20 68 61 76 65    (1)  They have
26040 20 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a   the same iTab..
26050 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 79 20  **    (2)  They 
26060 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 53  have the same iS
26070 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33  ortIdx..**    (3
26080 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
26090 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65  has same or fewe
260a0 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74  r dependencies t
260b0 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
260c0 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20  loop.**    (4)  
260d0 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73  The template has
260e0 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77   the same or low
260f0 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65  er cost than the
26100 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a   current loop.**
26110 20 20 20 20 28 35 29 20 20 54 68 65 20 74 65 6d      (5)  The tem
26120 70 6c 61 74 65 20 75 73 65 73 20 6d 6f 72 65 20  plate uses more 
26130 74 65 72 6d 73 20 6f 66 20 74 68 65 20 73 61 6d  terms of the sam
26140 65 20 69 6e 64 65 78 20 62 75 74 20 68 61 73 20  e index but has 
26150 6e 6f 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  no additional.**
26160 20 20 20 20 20 20 20 20 20 64 65 70 65 6e 64 65           depende
26170 6e 63 69 65 73 20 20 20 20 20 20 20 20 20 20 0a  ncies          .
26180 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
26190 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68  ereLoopInsert(Wh
261a0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
261b0 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c  pBuilder, WhereL
261c0 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b  oop *pTemplate){
261d0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70  .  WhereLoop **p
261e0 70 50 72 65 76 2c 20 2a 70 2c 20 2a 70 4e 65 78  pPrev, *p, *pNex
261f0 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 49 6e  t = 0;.  WhereIn
26200 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
26210 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
26220 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
26230 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
26240 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69  b;..  /* If pBui
26250 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
26260 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e  defined, then on
26270 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66  ly keep track of
26280 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20   the costs.  ** 
26290 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a  and prereqs..  *
262a0 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72  /.  if( pBuilder
262b0 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 23  ->pOrSet!=0 ){.#
262c0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
262d0 41 42 4c 45 44 0a 20 20 20 20 75 31 36 20 6e 20  ABLED.    u16 n 
262e0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  = pBuilder->pOrS
262f0 65 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20 78  et->n;.    int x
26300 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 77 68   =.#endif.    wh
26310 65 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69  ereOrInsert(pBui
26320 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54  lder->pOrSet, pT
26330 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c  emplate->prereq,
26340 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
26350 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26370 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
26380 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52  >nOut);.#if WHER
26390 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
263a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
263b0 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
263c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
263d0 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20  ebugPrintf(x?"  
263e0 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f   or-%d:  ":"   o
263f0 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20  r-X:  ", n);.   
26400 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
26410 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 57 49  t(pTemplate, pWI
26420 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a  nfo->pTabList);.
26430 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
26440 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26450 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61  K;.  }..  /* Sea
26460 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74  rch for an exist
26470 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f  ing WhereLoop to
26480 20 6f 76 65 72 77 72 69 74 65 2c 20 6f 72 20 77   overwrite, or w
26490 68 69 63 68 20 74 61 6b 65 73 0a 20 20 2a 2a 20  hich takes.  ** 
264a0 70 72 69 6f 72 69 74 79 20 6f 76 65 72 20 70 54  priority over pT
264b0 65 6d 70 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  emplate..  */.  
264c0 66 6f 72 28 70 70 50 72 65 76 3d 26 70 57 49 6e  for(ppPrev=&pWIn
264d0 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 3d 2a 70  fo->pLoops, p=*p
264e0 70 50 72 65 76 3b 20 70 3b 20 70 70 50 72 65 76  pPrev; p; ppPrev
264f0 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20  =&p->pNextLoop, 
26500 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20 20  p=*ppPrev){.    
26510 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65  if( p->iTab!=pTe
26520 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20  mplate->iTab || 
26530 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54 65  p->iSortIdx!=pTe
26540 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64 78  mplate->iSortIdx
26550 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
26560 65 69 74 68 65 72 20 74 68 65 20 69 54 61 62 20  either the iTab 
26570 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61 6c 75  or iSortIdx valu
26580 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65 72 65  es for two Where
26590 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65 72 65  Loop are differe
265a0 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  nt.      ** then
265b0 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70   those WhereLoop
265c0 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e  s need to be con
265d0 73 69 64 65 72 65 64 20 73 65 70 61 72 61 74 65  sidered separate
265e0 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69 73 0a  ly.  Neither is.
265f0 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e 64 69        ** a candi
26600 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63 65 20  date to replace 
26610 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20  the other. */.  
26620 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
26630 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68    }.    /* In th
26640 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
26650 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 72 53  entation, the rS
26660 65 74 75 70 20 76 61 6c 75 65 20 69 73 20 65 69  etup value is ei
26670 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a  ther zero.    **
26680 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20   or the cost of 
26690 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f  building an auto
266a0 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f  matic index (Nlo
266b0 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67  gN) and the Nlog
266c0 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20  N.    ** is the 
266d0 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74 69  same for compati
266e0 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20  ble WhereLoops. 
266f0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
26700 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70  ->rSetup==0 || p
26710 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
26720 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  ==0 .           
26730 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74        || p->rSet
26740 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up==pTemplate->r
26750 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a  Setup );..    /*
26760 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
26770 65 65 28 29 20 61 6c 77 61 79 73 20 67 65 6e 65  ee() always gene
26780 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65 72 74  rates and insert
26790 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  s the automatic 
267a0 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 73  index.    ** cas
267b0 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63 65 20  e first.  Hence 
267c0 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e 64 69  compatible candi
267d0 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 73 20  date WhereLoops 
267e0 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c 61 72  never have a lar
267f0 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65 74 75  ger.    ** rSetu
26800 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53 45 54  p. Call this SET
26810 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a  UP-INVARIANT */.
26820 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
26830 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65  Setup>=pTemplate
26840 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20  ->rSetup );..   
26850 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20   if( (p->prereq 
26860 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  & pTemplate->pre
26870 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 0a  req)==p->prereq.
26880 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75       && p->rSetu
26890 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p<=pTemplate->rS
268a0 65 74 75 70 0a 20 20 20 20 20 26 26 20 70 2d 3e  etup.     && p->
268b0 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d  rRun<=pTemplate-
268c0 3e 72 52 75 6e 0a 20 20 20 20 29 7b 0a 20 20 20  >rRun.    ){.   
268d0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
268e0 68 20 74 61 6b 65 6e 20 77 68 65 6e 20 70 20 69  h taken when p i
268f0 73 20 65 71 75 61 6c 20 6f 72 20 62 65 74 74 65  s equal or bette
26900 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  r than pTemplate
26910 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c   in .      ** al
26920 6c 20 6f 66 20 28 31 29 20 64 65 70 65 6e 64 65  l of (1) depende
26930 6e 63 65 73 20 28 32 29 20 73 65 74 75 70 2d 63  nces (2) setup-c
26940 6f 73 74 2c 20 61 6e 64 20 28 33 29 20 72 75 6e  ost, and (3) run
26950 2d 63 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20  -cost. */.      
26960 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
26970 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p==pTemplate->rS
26980 65 74 75 70 20 29 3b 0a 20 20 20 20 20 20 69 66  etup );.      if
26990 28 20 70 2d 3e 6e 4c 54 65 72 6d 3c 70 54 65 6d  ( p->nLTerm<pTem
269a0 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 0a 20 20  plate->nLTerm.  
269b0 20 20 20 20 20 26 26 20 28 70 2d 3e 77 73 46 6c       && (p->wsFl
269c0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
269d0 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26  XED)!=0.       &
269e0 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73  & (pTemplate->ws
269f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
26a00 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20  DEXED)!=0.      
26a10 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70   && p->u.btree.p
26a20 49 6e 64 65 78 3d 3d 70 54 65 6d 70 6c 61 74 65  Index==pTemplate
26a30 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
26a40 0a 20 20 20 20 20 20 20 26 26 20 70 2d 3e 70 72  .       && p->pr
26a50 65 72 65 71 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  ereq==pTemplate-
26a60 3e 70 72 65 72 65 71 0a 20 20 20 20 20 20 29 7b  >prereq.      ){
26a70 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72  .        /* Over
26a80 77 72 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e  write an existin
26a90 67 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68  g WhereLoop with
26aa0 20 61 6e 20 73 69 6d 69 6c 61 72 20 6f 6e 65 20   an similar one 
26ab0 74 68 61 74 20 75 73 65 73 0a 20 20 20 20 20 20  that uses.      
26ac0 20 20 2a 2a 20 6d 6f 72 65 20 74 65 72 6d 73 20    ** more terms 
26ad0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  of the index */.
26ae0 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20          pNext = 
26af0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20  p->pNextLoop;.  
26b00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26b10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26b20 20 20 2f 2a 20 70 54 65 6d 70 6c 61 74 65 20 69    /* pTemplate i
26b30 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c 2e 0a 20  s not helpful.. 
26b40 20 20 20 20 20 20 20 2a 2a 20 52 65 74 75 72 6e         ** Return
26b50 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
26b60 67 20 6f 72 20 61 64 64 69 6e 67 20 61 6e 79 74  g or adding anyt
26b70 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20  hing */.        
26b80 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 49 6e  goto whereLoopIn
26b90 73 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20  sert_noop;.     
26ba0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
26bb0 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
26bc0 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
26bd0 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  ==pTemplate->pre
26be0 72 65 71 0a 20 20 20 20 20 26 26 20 70 2d 3e 72  req.     && p->r
26bf0 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run>=pTemplate->
26c00 72 52 75 6e 0a 20 20 20 20 20 26 26 20 41 4c 57  rRun.     && ALW
26c10 41 59 53 28 70 2d 3e 72 53 65 74 75 70 3e 3d 70  AYS(p->rSetup>=p
26c20 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
26c30 29 20 2f 2a 20 53 65 65 20 53 45 54 55 50 2d 49  ) /* See SETUP-I
26c40 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a  NVARIANT above *
26c50 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  /.    ){.      /
26c60 2a 20 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65  * Overwrite an e
26c70 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
26c80 70 20 77 69 74 68 20 61 20 62 65 74 74 65 72 20  p with a better 
26c90 6f 6e 65 3a 20 6f 6e 65 20 74 68 61 74 20 69 73  one: one that is
26ca0 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72  .      ** better
26cb0 20 61 74 20 6f 6e 65 20 6f 66 20 28 31 29 20 64   at one of (1) d
26cc0 65 70 65 6e 64 65 6e 63 65 73 2c 20 28 32 29 20  ependences, (2) 
26cd0 73 65 74 75 70 2d 63 6f 73 74 2c 20 6f 72 20 28  setup-cost, or (
26ce0 33 29 20 72 75 6e 2d 63 6f 73 74 0a 20 20 20 20  3) run-cost.    
26cf0 20 20 2a 2a 20 61 6e 64 20 69 73 20 6e 6f 20 77    ** and is no w
26d00 6f 72 73 65 20 69 6e 20 61 6e 79 20 6f 66 20 74  orse in any of t
26d10 68 6f 73 65 20 63 61 74 65 67 6f 72 69 65 73 2e  hose categories.
26d20 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 78 74 20   */.      pNext 
26d30 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  = p->pNextLoop;.
26d40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26d50 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
26d60 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
26d70 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61  int it means tha
26d80 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f  t either p[] sho
26d90 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74 74  uld be overwritt
26da0 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65  en.  ** with pTe
26db0 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20  mplate[] if p[] 
26dc0 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d  exists, or if p=
26dd0 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63  =NULL then alloc
26de0 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57  ate a new.  ** W
26df0 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73  hereLoop and ins
26e00 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66  ert it..  */.#if
26e10 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
26e20 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
26e30 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
26e40 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  8 ){.    if( p!=
26e50 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
26e60 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69  e3DebugPrintf("i
26e70 6e 73 2d 64 65 6c 3a 20 20 22 29 3b 0a 20 20 20  ns-del:  ");.   
26e80 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
26e90 74 28 70 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61  t(p, pWInfo->pTa
26ea0 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  bList);.    }.  
26eb0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
26ec0 69 6e 74 66 28 22 69 6e 73 2d 6e 65 77 3a 20 20  intf("ins-new:  
26ed0 22 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f  ");.    whereLoo
26ee0 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65  pPrint(pTemplate
26ef0 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  , pWInfo->pTabLi
26f00 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  st);.  }.#endif.
26f10 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
26f20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    p = sqlite3DbM
26f30 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
26f40 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b  eof(WhereLoop));
26f50 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
26f60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
26f70 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f  MEM;.    whereLo
26f80 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a 20  opInit(p);.  }. 
26f90 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64   whereLoopXfer(d
26fa0 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29  b, p, pTemplate)
26fb0 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ;.  p->pNextLoop
26fc0 20 3d 20 70 4e 65 78 74 3b 0a 20 20 2a 70 70 50   = pNext;.  *ppP
26fd0 72 65 76 20 3d 20 70 3b 0a 20 20 69 66 28 20 28  rev = p;.  if( (
26fe0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
26ff0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
27000 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ==0 ){.    Index
27010 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e   *pIndex = p->u.
27020 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
27030 20 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20    if( pIndex && 
27040 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20  pIndex->tnum==0 
27050 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74  ){.      p->u.bt
27060 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  ree.pIndex = 0;.
27070 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
27080 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
27090 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
270a0 20 74 68 65 20 69 6e 73 65 72 74 20 69 73 20 61   the insert is a
270b0 20 6e 6f 2d 6f 70 20 2a 2f 0a 77 68 65 72 65 4c   no-op */.whereL
270c0 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3a 0a  oopInsert_noop:.
270d0 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
270e0 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
270f0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
27100 20 30 78 38 20 29 7b 0a 20 20 20 20 73 71 6c 69   0x8 ){.    sqli
27110 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
27120 69 6e 73 2d 6e 6f 6f 70 3a 20 22 29 3b 0a 20 20  ins-noop: ");.  
27130 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
27140 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e  (pTemplate, pWIn
27150 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20  fo->pTabList);. 
27160 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
27170 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a  rn SQLITE_OK;  .
27180 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65  }../*.** We have
27190 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65 64 20   so far matched 
271a0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
271b0 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65 72 6d  u.btree.nEq term
271c0 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 70  s of the index p
271d0 49 6e 64 65 78 2e 0a 2a 2a 20 54 72 79 20 74 6f  Index..** Try to
271e0 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e   match one more.
271f0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65  .**.** If pProbe
27200 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20  ->tnum==0, that 
27210 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69 73 20  means pIndex is 
27220 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75 73 65  a fake index use
27230 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54  d for the.** INT
27240 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
27250 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27260 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
27270 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 4c  eIndex(.  WhereL
27280 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
27290 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54 68 65  lder,     /* The
272a0 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f   WhereLoop facto
272b0 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ry */.  struct S
272c0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
272d0 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  c,      /* FROM 
272e0 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e  clause term bein
272f0 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  g analyzed */.  
27300 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c 20 20  Index *pProbe,  
27310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27320 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70  /* An index on p
27330 53 72 63 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  Src */.  WhereCo
27340 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20  st nInMul       
27350 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28           /* log(
27360 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74  Number of iterat
27370 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e 29 20  ions due to IN) 
27380 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  */.){.  WhereInf
27390 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
273a0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f  lder->pWInfo;  /
273b0 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 65 20  * WHERE analyse 
273c0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72  context */.  Par
273d0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49  se *pParse = pWI
273e0 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20  nfo->pParse;    
273f0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
27400 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
27410 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
27420 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44  ->db;       /* D
27430 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
27440 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78  on malloc contex
27450 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
27460 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
27470 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61         /* Templa
27480 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64  te WhereLoop und
27490 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
274a0 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
274b0 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
274c0 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72 65 54       /* A WhereT
274d0 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69 64  erm under consid
274e0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
274f0 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20   opMask;        
27500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27510 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72 73 20  Valid operators 
27520 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  for constraints 
27530 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73  */.  WhereScan s
27540 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  can;            
27550 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
27560 20 66 6f 72 20 57 48 45 52 45 20 74 65 72 6d 73   for WHERE terms
27570 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73 61   */.  Bitmask sa
27580 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20 20 20  ved_prereq;     
27590 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
275a0 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
275b0 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75 31 36  >prereq */.  u16
275c0 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20   saved_nLTerm;  
275d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
275e0 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
275f0 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a  f pNew->nLTerm *
27600 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 5f 6e 45  /.  int saved_nE
27610 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
27620 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
27630 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75  value of pNew->u
27640 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20  .btree.nEq */.  
27650 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67  u32 saved_wsFlag
27660 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
27670 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
27680 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61  e of pNew->wsFla
27690 67 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  gs */.  WhereCos
276a0 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20  t saved_nOut;   
276b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
276c0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
276d0 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74  w->nOut */.  int
276e0 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
276f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27700 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  Index of the col
27710 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
27720 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
27730 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
27740 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
27750 63 6f 64 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  code */.  WhereC
27760 6f 73 74 20 6e 52 6f 77 45 73 74 3b 20 20 20 20  ost nRowEst;    
27770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74            /* Est
27780 69 6d 61 74 65 64 20 69 6e 64 65 78 20 73 65 6c  imated index sel
27790 65 63 74 69 76 69 74 79 20 2a 2f 0a 20 20 57 68  ectivity */.  Wh
277a0 65 72 65 43 6f 73 74 20 72 4c 6f 67 53 69 7a 65  ereCost rLogSize
277b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
277c0 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61   Logarithm of ta
277d0 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68  ble size */.  Wh
277e0 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20  ereTerm *pTop = 
277f0 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a  0, *pBtm = 0; /*
27800 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20   Top and bottom 
27810 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
27820 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70  s */..  pNew = p
27830 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
27840 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
27850 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53  ailed ) return S
27860 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20  QLITE_NOMEM;..  
27870 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77  assert( (pNew->w
27880 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
27890 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
278a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e  );.  assert( (pN
278b0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
278c0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d  ERE_TOP_LIMIT)==
278d0 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  0 );.  if( pNew-
278e0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
278f0 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
27900 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54    opMask = WO_LT
27910 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20  |WO_LE;.  }else 
27920 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d  if( pProbe->tnum
27930 3c 3d 30 20 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f  <=0 || (pSrc->jo
27940 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
27950 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61  )!=0 ){.    opMa
27960 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
27970 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
27980 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73  LT|WO_LE;.  }els
27990 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  e{.    opMask = 
279a0 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49  WO_EQ|WO_IN|WO_I
279b0 53 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47  SNULL|WO_GT|WO_G
279c0 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  E|WO_LT|WO_LE;. 
279d0 20 7d 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d   }.  if( pProbe-
279e0 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70  >bUnordered ) op
279f0 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c  Mask &= ~(WO_GT|
27a00 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_GE|WO_LT|WO_L
27a10 45 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  E);..  assert( p
27a20 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
27a30 3c 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  <=pProbe->nColum
27a40 6e 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  n );.  if( pNew-
27a50 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3c 20 70  >u.btree.nEq < p
27a60 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Probe->nColumn )
27a70 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 50 72  {.    iCol = pPr
27a80 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e  obe->aiColumn[pN
27a90 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d  ew->u.btree.nEq]
27aa0 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 3d 20  ;.    nRowEst = 
27ab0 77 68 65 72 65 43 6f 73 74 28 70 50 72 6f 62 65  whereCost(pProbe
27ac0 2d 3e 61 69 52 6f 77 45 73 74 5b 70 4e 65 77 2d  ->aiRowEst[pNew-
27ad0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 31 5d 29  >u.btree.nEq+1])
27ae0 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73  ;.    if( nRowEs
27af0 74 3d 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e  t==0 && pProbe->
27b00 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
27b10 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 31 3b 0a   ) nRowEst = 1;.
27b20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 43 6f    }else{.    iCo
27b30 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 6e 52 6f 77  l = -1;.    nRow
27b40 45 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  Est = 0;.  }.  p
27b50 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e  Term = whereScan
27b60 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 42 75 69  Init(&scan, pBui
27b70 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d  lder->pWC, pSrc-
27b80 3e 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a  >iCursor, iCol,.
27b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ba0 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20          opMask, 
27bb0 70 50 72 6f 62 65 29 3b 0a 20 20 73 61 76 65 64  pProbe);.  saved
27bc0 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62  _nEq = pNew->u.b
27bd0 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65  tree.nEq;.  save
27be0 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d  d_nLTerm = pNew-
27bf0 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64  >nLTerm;.  saved
27c00 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d  _wsFlags = pNew-
27c10 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65  >wsFlags;.  save
27c20 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d  d_prereq = pNew-
27c30 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64  >prereq;.  saved
27c40 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f  _nOut = pNew->nO
27c50 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74  ut;.  pNew->rSet
27c60 75 70 20 3d 20 30 3b 0a 20 20 72 4c 6f 67 53 69  up = 0;.  rLogSi
27c70 7a 65 20 3d 20 65 73 74 4c 6f 67 28 77 68 65 72  ze = estLog(wher
27c80 65 43 6f 73 74 28 70 50 72 6f 62 65 2d 3e 61 69  eCost(pProbe->ai
27c90 52 6f 77 45 73 74 5b 30 5d 29 29 3b 0a 20 20 66  RowEst[0]));.  f
27ca0 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  or(; rc==SQLITE_
27cb0 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20  OK && pTerm!=0; 
27cc0 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61  pTerm = whereSca
27cd0 6e 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20  nNext(&scan)){. 
27ce0 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a     int nIn = 0;.
27cf0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
27d00 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
27d10 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
27d20 6e 74 69 6e 75 65 3b 0a 23 69 66 64 65 66 20 53  ntinue;.#ifdef S
27d30 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
27d40 54 33 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  T3.    if( (pTer
27d50 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
27d60 4d 5f 56 4e 55 4c 4c 29 21 3d 30 20 26 26 20 70  M_VNULL)!=0 && p
27d70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  Src->pTab->aCol[
27d80 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b  iCol].notNull ){
27d90 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
27da0 20 2f 2a 20 73 6b 69 70 20 49 53 20 4e 4f 54 20   /* skip IS NOT 
27db0 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
27dc0 20 6f 6e 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63   on a NOT NULL c
27dd0 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 7d 0a 23  olumn */.    }.#
27de0 65 6e 64 69 66 0a 20 20 20 20 70 4e 65 77 2d 3e  endif.    pNew->
27df0 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
27e00 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65  wsFlags;.    pNe
27e10 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
27e20 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20   saved_nEq;.    
27e30 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73  pNew->nLTerm = s
27e40 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20  aved_nLTerm;.   
27e50 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
27e60 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70  size(db, pNew, p
27e70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29  New->nLTerm+1) )
27e80 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a   break; /* OOM *
27e90 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65  /.    pNew->aLTe
27ea0 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  rm[pNew->nLTerm+
27eb0 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  +] = pTerm;.    
27ec0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 28  pNew->prereq = (
27ed0 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20 70  saved_prereq | p
27ee0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
27ef0 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b  t) & ~pNew->mask
27f00 53 65 6c 66 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Self;.    pNew->
27f10 72 52 75 6e 20 3d 20 72 4c 6f 67 53 69 7a 65 3b  rRun = rLogSize;
27f20 20 2f 2a 20 42 61 73 65 6c 69 6e 65 20 63 6f 73   /* Baseline cos
27f30 74 20 69 73 20 6c 6f 67 32 28 4e 29 2e 20 20 41  t is log2(N).  A
27f40 64 6a 75 73 74 6d 65 6e 74 73 20 62 65 6c 6f 77  djustments below
27f50 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72   */.    if( pTer
27f60 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
27f70 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  O_IN ){.      Ex
27f80 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
27f90 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
27fa0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
27fb0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
27fc0 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
27fd0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
27fe0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
27ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22   ){.        /* "
28000 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
28010 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68 65  )":  TUNING: the
28020 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20   SELECT returns 
28030 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  25 rows */.     
28040 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73     nIn = 46;  as
28050 73 65 72 74 28 20 34 36 3d 3d 77 68 65 72 65 43  sert( 46==whereC
28060 6f 73 74 28 32 35 29 20 29 3b 0a 20 20 20 20 20  ost(25) );.     
28070 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
28080 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  S(pExpr->x.pList
28090 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   && pExpr->x.pLi
280a0 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
280b0 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28        /* "x IN (
280c0 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e  value, value, ..
280d0 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e  .)" */.        n
280e0 49 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 28 70  In = whereCost(p
280f0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
28100 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
28110 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
28120 2b 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 70 4e  += nIn;.      pN
28130 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b  ew->u.btree.nEq+
28140 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  +;.      pNew->n
28150 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20  Out = nRowEst + 
28160 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20  nInMul + nIn;.  
28170 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72    }else if( pTer
28180 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
28190 57 4f 5f 45 51 29 20 29 7b 0a 20 20 20 20 20 20  WO_EQ) ){.      
281a0 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77  assert( (pNew->w
281b0 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
281c0 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52  COLUMN_NULL|WHER
281d0 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d 30  E_COLUMN_IN))!=0
281e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
281f0 20 20 20 7c 7c 20 6e 49 6e 4d 75 6c 3d 3d 30 20     || nInMul==0 
28200 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  );.      pNew->w
28210 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
28220 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20  COLUMN_EQ;.     
28230 20 69 66 28 20 69 43 6f 6c 3c 30 20 20 0a 20 20   if( iCol<0  .  
28240 20 20 20 20 20 7c 7c 20 28 70 50 72 6f 62 65 2d       || (pProbe-
28250 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
28260 65 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20  e && nInMul==0. 
28270 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4e 65            && pNe
28280 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d  w->u.btree.nEq==
28290 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 2d  pProbe->nColumn-
282a0 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  1).      ){.    
282b0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4e 65      assert( (pNe
282c0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
282d0 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30  RE_COLUMN_IN)==0
282e0 20 7c 7c 20 69 43 6f 6c 3c 30 20 29 3b 0a 20 20   || iCol<0 );.  
282f0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
28300 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45  ags |= WHERE_ONE
28310 52 4f 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROW;.      }.   
28320 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
28330 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e  .nEq++;.      pN
28340 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45  ew->nOut = nRowE
28350 73 74 20 2b 20 6e 49 6e 4d 75 6c 3b 0a 20 20 20  st + nInMul;.   
28360 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d   }else if( pTerm
28370 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
28380 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20  O_ISNULL) ){.   
28390 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
283a0 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
283b0 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 4e 65  _NULL;.      pNe
283c0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b  w->u.btree.nEq++
283d0 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
283e0 47 3a 20 49 53 20 4e 55 4c 4c 20 73 65 6c 65 63  G: IS NULL selec
283f0 74 73 20 32 20 72 6f 77 73 20 2a 2f 0a 20 20 20  ts 2 rows */.   
28400 20 20 20 6e 49 6e 20 3d 20 31 30 3b 20 20 61 73     nIn = 10;  as
28410 73 65 72 74 28 20 31 30 3d 3d 77 68 65 72 65 43  sert( 10==whereC
28420 6f 73 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20  ost(2) );.      
28430 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f  pNew->nOut = nRo
28440 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20  wEst + nInMul + 
28450 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  nIn;.    }else i
28460 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
28470 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f  tor & (WO_GT|WO_
28480 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  GE) ){.      tes
28490 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
284a0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 54 20  perator & WO_GT 
284b0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
284c0 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
284d0 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20  tor & WO_GE );. 
284e0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
284f0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
28500 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42  MN_RANGE|WHERE_B
28510 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  TM_LIMIT;.      
28520 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pBtm = pTerm;.  
28530 20 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20      pTop = 0;.  
28540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
28550 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f  ssert( pTerm->eO
28560 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54  perator & (WO_LT
28570 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20  |WO_LE) );.     
28580 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
28590 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
285a0 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LT );.      tes
285b0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
285c0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20  perator & WO_LE 
285d0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  );.      pNew->w
285e0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
285f0 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
28600 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20  RE_TOP_LIMIT;.  
28610 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d      pTop = pTerm
28620 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28  ;.      pBtm = (
28630 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
28640 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29  WHERE_BTM_LIMIT)
28650 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20  !=0 ?.          
28660 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
28670 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c  >aLTerm[pNew->nL
28680 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20  Term-2] : 0;.   
28690 20 7d 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d   }.    if( pNew-
286a0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
286b0 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b  _COLUMN_RANGE ){
286c0 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74  .      /* Adjust
286d0 20 6e 4f 75 74 20 61 6e 64 20 72 52 75 6e 20 66   nOut and rRun f
286e0 6f 72 20 53 54 41 54 33 20 72 61 6e 67 65 20 76  or STAT3 range v
286f0 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 20 20 57  alues */.      W
28700 68 65 72 65 43 6f 73 74 20 72 44 69 76 3b 0a 20  hereCost rDiv;. 
28710 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65 53       whereRangeS
28720 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
28730 50 72 6f 62 65 2c 20 70 4e 65 77 2d 3e 75 2e 62  Probe, pNew->u.b
28740 74 72 65 65 2e 6e 45 71 2c 0a 20 20 20 20 20 20  tree.nEq,.      
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28760 20 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 26 72    pBtm, pTop, &r
28770 44 69 76 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  Div);.      pNew
28780 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
28790 4f 75 74 3e 72 44 69 76 2b 31 30 20 3f 20 73 61  Out>rDiv+10 ? sa
287a0 76 65 64 5f 6e 4f 75 74 20 2d 20 72 44 69 76 20  ved_nOut - rDiv 
287b0 3a 20 31 30 3b 0a 20 20 20 20 7d 0a 23 69 66 64  : 10;.    }.#ifd
287c0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
287d0 5f 53 54 41 54 33 0a 20 20 20 20 69 66 28 20 70  _STAT3.    if( p
287e0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
287f0 3d 3d 31 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e  ==1 && pProbe->n
28800 53 61 6d 70 6c 65 0a 20 20 20 20 20 26 26 20 20  Sample.     &&  
28810 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
28820 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53  led(db, SQLITE_S
28830 74 61 74 33 29 20 29 7b 0a 20 20 20 20 20 20 74  tat3) ){.      t
28840 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b  Rowcnt nOut = 0;
28850 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72  .      if( (pTer
28860 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
28870 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29  WO_EQ|WO_ISNULL)
28880 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
28890 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
288a0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
288b0 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  EQ );.        te
288c0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
288d0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
288e0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  NULL );.        
288f0 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53  rc = whereEqualS
28900 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
28910 50 72 6f 62 65 2c 20 70 54 65 72 6d 2d 3e 70 45  Probe, pTerm->pE
28920 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f  xpr->pRight, &nO
28930 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ut);.      }else
28940 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
28950 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 0a  erator & WO_IN).
28960 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
28970 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
28980 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
28990 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 20 29  EP_xIsSelect)  )
289a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
289b0 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50  hereInScanEst(pP
289c0 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 54  arse, pProbe, pT
289d0 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c  erm->pExpr->x.pL
289e0 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20  ist, &nOut);.   
289f0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
28a00 74 28 20 6e 4f 75 74 3d 3d 30 20 7c 7c 20 72 63  t( nOut==0 || rc
28a10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
28a20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 20 29 20       if( nOut ) 
28a30 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 77 68 65  pNew->nOut = whe
28a40 72 65 43 6f 73 74 28 6e 4f 75 74 29 3b 0a 20 20  reCost(nOut);.  
28a50 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
28a60 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  f( (pNew->wsFlag
28a70 73 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f  s & (WHERE_IDX_O
28a80 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d  NLY|WHERE_IPK))=
28a90 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45  =0 ){.      /* E
28aa0 61 63 68 20 72 6f 77 20 69 6e 76 6f 6c 76 65 73  ach row involves
28ab0 20 61 20 73 74 65 70 20 6f 66 20 74 68 65 20 69   a step of the i
28ac0 6e 64 65 78 2c 20 74 68 65 6e 20 61 20 62 69 6e  ndex, then a bin
28ad0 61 72 79 20 73 65 61 72 63 68 20 6f 66 0a 20 20  ary search of.  
28ae0 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20      ** the main 
28af0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 70  table */.      p
28b00 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 20 77 68 65  New->rRun =  whe
28b10 72 65 43 6f 73 74 41 64 64 28 70 4e 65 77 2d 3e  reCostAdd(pNew->
28b20 72 52 75 6e 2c 20 72 4c 6f 67 53 69 7a 65 3e 32  rRun, rLogSize>2
28b30 37 20 3f 20 72 4c 6f 67 53 69 7a 65 2d 31 37 20  7 ? rLogSize-17 
28b40 3a 20 31 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  : 10);.    }.   
28b50 20 2f 2a 20 53 74 65 70 20 63 6f 73 74 20 66 6f   /* Step cost fo
28b60 72 20 65 61 63 68 20 6f 75 74 70 75 74 20 72 6f  r each output ro
28b70 77 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 72  w */.    pNew->r
28b80 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 41  Run = whereCostA
28b90 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  dd(pNew->rRun, p
28ba0 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20  New->nOut);.    
28bb0 2f 2a 20 54 42 44 3a 20 41 64 6a 75 73 74 20 6e  /* TBD: Adjust n
28bc0 4f 75 74 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  Out for addition
28bd0 61 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  al constraints *
28be0 2f 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  /.    rc = where
28bf0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
28c00 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
28c10 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  if( (pNew->wsFla
28c20 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
28c30 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26  IMIT)==0.     &&
28c40 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
28c50 45 71 3c 28 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  Eq<(pProbe->nCol
28c60 75 6d 6e 20 2b 20 28 70 50 72 6f 62 65 2d 3e 7a  umn + (pProbe->z
28c70 4e 61 6d 65 21 3d 30 29 29 0a 20 20 20 20 29 7b  Name!=0)).    ){
28c80 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
28c90 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
28ca0 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
28cb0 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e  robe, nInMul+nIn
28cc0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
28cd0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61  New->prereq = sa
28ce0 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e  ved_prereq;.  pN
28cf0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
28d00 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70  = saved_nEq;.  p
28d10 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73  New->wsFlags = s
28d20 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20  aved_wsFlags;.  
28d30 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
28d40 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d  ed_nOut;.  pNew-
28d50 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f  >nLTerm = saved_
28d60 6e 4c 54 65 72 6d 3b 0a 20 20 72 65 74 75 72 6e  nLTerm;.  return
28d70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
28d80 74 75 72 6e 20 54 72 75 65 20 69 66 20 69 74 20  turn True if it 
28d90 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
28da0 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65   pIndex might be
28db0 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d   useful in.** im
28dc0 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f  plementing the O
28dd0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69  RDER BY clause i
28de0 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a  n pBuilder..**.*
28df0 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69  * Return False i
28e00 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20  f pBuilder does 
28e10 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f  not contain an O
28e20 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
28e30 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
28e40 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64   no way for pInd
28e50 65 78 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20  ex to be useful 
28e60 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  in implementing 
28e70 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59  that.** ORDER BY
28e80 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   clause..*/.stat
28e90 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68  ic int indexMigh
28ea0 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79  tHelpWithOrderBy
28eb0 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
28ec0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
28ed0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
28ee0 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29  .  int iCursor.)
28ef0 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
28f00 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  B;.  int ii, jj;
28f10 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  ..  if( pIndex->
28f20 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74  bUnordered ) ret
28f30 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4f  urn 0;.  if( (pO
28f40 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  B = pBuilder->pW
28f50 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d  Info->pOrderBy)=
28f60 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
28f70 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
28f80 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  B->nExpr; ii++){
28f90 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
28fa0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
28fb0 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61  ipCollate(pOB->a
28fc0 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  [ii].pExpr);.   
28fd0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
28fe0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
28ff0 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 45  rn 0;.    if( pE
29000 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75  xpr->iTable==iCu
29010 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 66 6f  rsor ){.      fo
29020 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65  r(jj=0; jj<pInde
29030 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 6a 2b 2b  x->nColumn; jj++
29040 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
29050 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
29060 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
29070 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  jj] ) return 1;.
29080 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
29090 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
290a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
290b0 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31 73  bitmask where 1s
290c0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
290d0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
290e0 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
290f0 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64 20  e table is used 
29100 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e  by an index.  On
29110 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33 20  ly the first 63 
29120 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73  columns are cons
29130 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  idered..*/.stati
29140 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e  c Bitmask column
29150 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  sInIndex(Index *
29160 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b  pIdx){.  Bitmask
29170 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b   m = 0;.  int j;
29180 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e  .  for(j=pIdx->n
29190 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20  Column-1; j>=0; 
291a0 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  j--){.    int x 
291b0 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
291c0 5b 6a 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73  [j];.    testcas
291d0 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  e( x==BMS-1 );. 
291e0 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
291f0 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 69 66 28  BMS-2 );.    if(
29200 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20   x<BMS-1 ) m |= 
29210 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 7d 0a  MASKBIT(x);.  }.
29220 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f    return m;.}../
29230 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
29240 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65  f a partial inde
29250 78 20 77 69 74 68 20 70 50 61 72 74 49 6e 64 65  x with pPartInde
29260 78 57 68 65 72 65 20 63 61 6e 20 62 65 20 75 73  xWhere can be us
29270 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ed.** in the cur
29280 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65 74  rent query.  Ret
29290 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63  urn true if it c
292a0 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65 20  an be and false 
292b0 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  if not..*/.stati
292c0 63 20 69 6e 74 20 77 68 65 72 65 55 73 61 62 6c  c int whereUsabl
292d0 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69 6e  ePartialIndex(in
292e0 74 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c 61  t iTab, WhereCla
292f0 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
29300 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 69  pWhere){.  int i
29310 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
29320 54 65 72 6d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  Term;.  for(i=0,
29330 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
29340 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
29350 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
29360 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
29370 6d 70 6c 69 65 73 45 78 70 72 28 70 54 65 72 6d  mpliesExpr(pTerm
29380 2d 3e 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c  ->pExpr, pWhere,
29390 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
293a0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
293b0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
293c0 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
293d0 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67  jects for a sing
293e0 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  le table of the 
293f0 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20 74  join where the t
29400 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66  able.** is idenf
29410 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d  ied by pBuilder-
29420 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68  >pNew->iTab.  Th
29430 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72  at table is guar
29440 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20  anteed to be.** 
29450 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20  a b-tree table, 
29460 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
29470 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
29480 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  nt whereLoopAddB
29490 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f  tree(.  WhereLoo
294a0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
294b0 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  er, /* WHERE cla
294c0 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  use information 
294d0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78  */.  Bitmask mEx
294e0 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20  tra             
294f0 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65 71   /* Extra prereq
29500 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e  uesites for usin
29510 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  g this table */.
29520 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
29530 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
29540 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
29550 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  is context */.  
29560 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20  Index *pProbe;  
29570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
29580 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65  n index we are e
29590 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49  valuating */.  I
295a0 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20  ndex sPk;       
295b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
295c0 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63  fake index objec
295d0 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72  t for the primar
295e0 79 20 6b 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63  y key */.  tRowc
295f0 6e 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d  nt aiRowEstPk[2]
29600 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69  ;      /* The ai
29610 52 6f 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66  RowEst[] value f
29620 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
29630 20 2a 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75   */.  int aiColu
29640 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20  mnPk = -1;      
29650 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e    /* The aColumn
29660 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
29670 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
29680 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
29690 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
296a0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
296b0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
296c0 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20  st_item *pSrc;  
296d0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
296e0 73 65 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f  se btree term to
296f0 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c   add */.  WhereL
29700 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  oop *pNew;      
29710 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74        /* Templat
29720 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
29730 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ct */.  int rc =
29740 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
29750 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
29760 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72  de */.  int iSor
29770 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20  tIdx = 1;       
29780 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d      /* Index num
29790 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20  ber */.  int b; 
297a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297b0 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61       /* A boolea
297c0 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 57 68 65  n value */.  Whe
297d0 72 65 43 6f 73 74 20 72 53 69 7a 65 3b 20 20 20  reCost rSize;   
297e0 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62           /* numb
297f0 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
29800 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65  e table */.  Whe
29810 72 65 43 6f 73 74 20 72 4c 6f 67 53 69 7a 65 3b  reCost rLogSize;
29820 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61           /* Loga
29830 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d  rithm of the num
29840 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
29850 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68  he table */.  Wh
29860 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
29870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
29880 20 70 61 72 73 65 64 20 57 48 45 52 45 20 63 6c   parsed WHERE cl
29890 61 75 73 65 20 2a 2f 0a 20 20 0a 20 20 70 4e 65  ause */.  .  pNe
298a0 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
298b0 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70  ew;.  pWInfo = p
298c0 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
298d0 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57  .  pTabList = pW
298e0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
298f0 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73    pSrc = pTabLis
29900 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61  t->a + pNew->iTa
29910 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c  b;.  pWC = pBuil
29920 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65  der->pWC;.  asse
29930 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28 70  rt( !IsVirtual(p
29940 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20  Src->pTab) );.. 
29950 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65   if( pSrc->pInde
29960 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49  x ){.    /* An I
29970 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
29980 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61 72   specifies a par
29990 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f  ticular index to
299a0 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f   use */.    pPro
299b0 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65  be = pSrc->pInde
299c0 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  x;.  }else{.    
299d0 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49  /* There is no I
299e0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
299f0 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65  .  Create a fake
29a00 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e   Index object in
29a10 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61   local.    ** va
29a20 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65  riable sPk to re
29a30 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69  present the rowi
29a40 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  d primary key in
29a50 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a  dex.  Make this.
29a60 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65      ** fake inde
29a70 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  x the first in a
29a80 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20   chain of Index 
29a90 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c  objects with all
29aa0 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20   of the real.   
29ab0 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66   ** indices to f
29ac0 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64  ollow */.    Ind
29ad0 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20  ex *pFirst;     
29ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29af0 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e  First of real in
29b00 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62  dices on the tab
29b10 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  le */.    memset
29b20 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sPk, 0, sizeof
29b30 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50  (Index));.    sP
29b40 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20  k.nColumn = 1;. 
29b50 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20     sPk.aiColumn 
29b60 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20  = &aiColumnPk;. 
29b70 20 20 20 73 50 6b 2e 61 69 52 6f 77 45 73 74 20     sPk.aiRowEst 
29b80 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20  = aiRowEstPk;.  
29b90 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20    sPk.onError = 
29ba0 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20 20  OE_Replace;.    
29bb0 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 53 72  sPk.pTable = pSr
29bc0 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 69 52  c->pTab;.    aiR
29bd0 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 53 72  owEstPk[0] = pSr
29be0 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74  c->pTab->nRowEst
29bf0 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b  ;.    aiRowEstPk
29c00 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70 46 69  [1] = 1;.    pFi
29c10 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  rst = pSrc->pTab
29c20 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  ->pIndex;.    if
29c30 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78  ( pSrc->notIndex
29c40 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ed==0 ){.      /
29c50 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63  * The real indic
29c60 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  es of the table 
29c70 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65  are only conside
29c80 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20  red if the.     
29c90 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20   ** NOT INDEXED 
29ca0 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69  qualifier is omi
29cb0 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52  tted from the FR
29cc0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
29cd0 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70     sPk.pNext = p
29ce0 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20  First;.    }.   
29cf0 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a   pProbe = &sPk;.
29d00 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 77 68    }.  rSize = wh
29d10 65 72 65 43 6f 73 74 28 70 53 72 63 2d 3e 70 54  ereCost(pSrc->pT
29d20 61 62 2d 3e 6e 52 6f 77 45 73 74 29 3b 0a 20 20  ab->nRowEst);.  
29d30 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f  rLogSize = estLo
29d40 67 28 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  g(rSize);..  /* 
29d50 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65  Automatic indexe
29d60 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75 69  s */.  if( !pBui
29d70 6c 64 65 72 2d 3e 70 4f 72 53 65 74 0a 20 20 20  lder->pOrSet.   
29d80 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  && (pWInfo->pPar
29d90 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
29da0 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78  SQLITE_AutoIndex
29db0 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72 63 2d  )!=0.   && pSrc-
29dc0 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 26 26  >pIndex==0.   &&
29dd0 20 21 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f 75   !pSrc->viaCorou
29de0 74 69 6e 65 0a 20 20 20 26 26 20 21 70 53 72 63  tine.   && !pSrc
29df0 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a 20 20 20  ->notIndexed.   
29e00 26 26 20 21 70 53 72 63 2d 3e 69 73 43 6f 72 72  && !pSrc->isCorr
29e10 65 6c 61 74 65 64 0a 20 20 29 7b 0a 20 20 20 20  elated.  ){.    
29e20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f  /* Generate auto
29e30 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70  -index WhereLoop
29e40 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  s */.    WhereTe
29e50 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57  rm *pTerm;.    W
29e60 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64  hereTerm *pWCEnd
29e70 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d   = pWC->a + pWC-
29e80 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28  >nTerm;.    for(
29e90 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63  pTerm=pWC->a; rc
29ea0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
29eb0 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
29ec0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  rm++){.      if(
29ed0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
29ee0 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ght & pNew->mask
29ef0 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Self ) continue;
29f00 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 43  .      if( termC
29f10 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
29f20 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a  rm, pSrc, 0) ){.
29f30 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
29f40 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
29f50 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
29f60 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
29f70 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
29f80 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
29f90 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
29fa0 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
29fb0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f      /* TUNING: O
29fc0 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72  ne-time cost for
29fd0 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61   computing the a
29fe0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
29ff0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70  s.        ** app
2a000 72 6f 78 69 6d 61 74 65 6c 79 20 37 2a 4e 2a 6c  roximately 7*N*l
2a010 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69  og2(N) where N i
2a020 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2a030 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20  rows in.        
2a040 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
2a050 6e 67 20 69 6e 64 65 78 65 64 2e 20 2a 2f 0a 20  ng indexed. */. 
2a060 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65         pNew->rSe
2a070 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b  tup = rLogSize +
2a080 20 72 53 69 7a 65 20 2b 20 32 38 3b 20 20 61 73   rSize + 28;  as
2a090 73 65 72 74 28 20 32 38 3d 3d 77 68 65 72 65 43  sert( 28==whereC
2a0a0 6f 73 74 28 37 29 20 29 3b 0a 20 20 20 20 20 20  ost(7) );.      
2a0b0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63    /* TUNING: Eac
2a0c0 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79  h index lookup y
2a0d0 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e  ields 20 rows in
2a0e0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69   the table.  Thi
2a0f0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  s.        ** is 
2a100 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75 73  more than the us
2a110 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20  ual guess of 10 
2a120 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68  rows, since we h
2a130 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20  ave no way.     
2a140 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 6e 69 6e     ** of knownin
2a150 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20  g how selective 
2a160 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75  the index will u
2a170 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49  ltimately be.  I
2a180 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20  t would.        
2a190 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73  ** not be unreas
2a1a0 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74  onable to make t
2a1b0 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c  his value much l
2a1c0 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  arger. */.      
2a1d0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34    pNew->nOut = 4
2a1e0 33 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d  3;  assert( 43==
2a1f0 77 68 65 72 65 43 6f 73 74 28 32 30 29 20 29 3b  whereCost(20) );
2a200 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
2a210 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 41  Run = whereCostA
2a220 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77  dd(rLogSize,pNew
2a230 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  ->nOut);.       
2a240 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
2a250 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
2a260 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  X;.        pNew-
2a270 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61  >prereq = mExtra
2a280 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   | pTerm->prereq
2a290 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72  Right;.        r
2a2a0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
2a2b0 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2a2c0 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
2a2d0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f   }.  }..  /* Loo
2a2e0 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63  p over all indic
2a2f0 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20  es.  */.  for(; 
2a300 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2a310 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d   pProbe; pProbe=
2a320 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69  pProbe->pNext, i
2a330 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20  SortIdx++){.    
2a340 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50 61 72  if( pProbe->pPar
2a350 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20  tIdxWhere!=0.   
2a360 20 20 26 26 20 21 77 68 65 72 65 55 73 61 62 6c    && !whereUsabl
2a370 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 70 4e  ePartialIndex(pN
2a380 65 77 2d 3e 69 54 61 62 2c 20 70 57 43 2c 20 70  ew->iTab, pWC, p
2a390 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57  Probe->pPartIdxW
2a3a0 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 63  here) ){.      c
2a3b0 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72  ontinue;  /* Par
2a3c0 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61 70 70  tial index inapp
2a3d0 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 69  ropriate for thi
2a3e0 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d  s query */.    }
2a3f0 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
2a400 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20  ee.nEq = 0;.    
2a410 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  pNew->nLTerm = 0
2a420 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72  ;.    pNew->iSor
2a430 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e  tIdx = 0;.    pN
2a440 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
2a450 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
2a460 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70   = mExtra;.    p
2a470 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a  New->nOut = rSiz
2a480 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  e;.    pNew->u.b
2a490 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50  tree.pIndex = pP
2a4a0 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e  robe;.    b = in
2a4b0 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68  dexMightHelpWith
2a4c0 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64 65 72  OrderBy(pBuilder
2a4d0 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e  , pProbe, pSrc->
2a4e0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a  iCursor);.    /*
2a4f0 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53   The ONEPASS_DES
2a500 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72  IRED flags never
2a510 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65 72   occurs together
2a520 20 77 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a   with ORDER BY *
2a530 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  /.    assert( (p
2a540 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2a550 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
2a560 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c  S_DESIRED)==0 ||
2a570 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   b==0 );.    if(
2a580 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30   pProbe->tnum<=0
2a590 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74   ){.      /* Int
2a5a0 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
2a5b0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
2a5c0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
2a5d0 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20  WHERE_IPK;..    
2a5e0 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20    /* Full table 
2a5f0 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e  scan */.      pN
2a600 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62  ew->iSortIdx = b
2a610 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b   ? iSortIdx : 0;
2a620 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  .      /* TUNING
2a630 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74  : Cost of full t
2a640 61 62 6c 65 20 73 63 61 6e 20 69 73 20 33 2a 28  able scan is 3*(
2a650 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20 20  N + log2(N))..  
2a660 20 20 20 20 2a 2a 20 20 2b 20 20 54 68 65 20 65      **  +  The e
2a670 78 74 72 61 20 33 20 66 61 63 74 6f 72 20 69 73  xtra 3 factor is
2a680 20 74 6f 20 65 6e 63 6f 75 72 61 67 65 20 74 68   to encourage th
2a690 65 20 75 73 65 20 6f 66 20 69 6e 64 65 78 65 64  e use of indexed
2a6a0 20 6c 6f 6f 6b 75 70 73 0a 20 20 20 20 20 20 2a   lookups.      *
2a6b0 2a 20 20 20 20 20 6f 76 65 72 20 66 75 6c 6c 20  *     over full 
2a6c0 73 63 61 6e 73 2e 20 20 41 20 73 6d 61 6c 6c 65  scans.  A smalle
2a6d0 72 20 63 6f 6e 73 74 61 6e 74 20 32 20 69 73 20  r constant 2 is 
2a6e0 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 69 6e  used for coverin
2a6f0 67 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69  g.      **     i
2a700 6e 64 65 78 20 73 63 61 6e 73 20 73 6f 20 74 68  ndex scans so th
2a710 61 74 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  at a covering in
2a720 64 65 78 20 73 63 61 6e 20 77 69 6c 6c 20 62 65  dex scan will be
2a730 20 66 61 76 6f 72 65 64 20 6f 76 65 72 0a 20 20   favored over.  
2a740 20 20 20 20 2a 2a 20 20 20 20 20 61 20 74 61 62      **     a tab
2a750 6c 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20  le scan. */.    
2a760 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 77    pNew->rRun = w
2a770 68 65 72 65 43 6f 73 74 41 64 64 28 72 53 69 7a  hereCostAdd(rSiz
2a780 65 2c 72 4c 6f 67 53 69 7a 65 29 20 2b 20 31 36  e,rLogSize) + 16
2a790 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  ;.      rc = whe
2a7a0 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
2a7b0 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
2a7c0 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
2a7d0 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
2a7e0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
2a7f0 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
2a800 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78   ~columnsInIndex
2a810 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20  (pProbe);.      
2a820 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
2a830 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f  (m==0) ? (WHERE_
2a840 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49  IDX_ONLY|WHERE_I
2a850 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f  NDEXED) : WHERE_
2a860 49 4e 44 45 58 45 44 3b 0a 0a 20 20 20 20 20 20  INDEXED;..      
2a870 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61  /* Full scan via
2a880 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
2a890 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20  if( b.       || 
2a8a0 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ( m==0.         
2a8b0 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72  && pProbe->bUnor
2a8c0 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  dered==0.       
2a8d0 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
2a8e0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2a8f0 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
2a900 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
2a910 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2a920 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20 20 20  nfig.bUseCis.   
2a930 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a        && Optimiz
2a940 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49  ationEnabled(pWI
2a950 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  nfo->pParse->db,
2a960 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78   SQLITE_CoverIdx
2a970 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20  Scan).          
2a980 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
2a990 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64     pNew->iSortId
2a9a0 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78  x = b ? iSortIdx
2a9b0 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   : 0;.        if
2a9c0 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( m==0 ){.      
2a9d0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
2a9e0 6f 73 74 20 6f 66 20 61 20 63 6f 76 65 72 69 6e  ost of a coverin
2a9f0 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69 73 20  g index scan is 
2aa00 32 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e  2*(N + log2(N)).
2aa10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 2b  .          **  +
2aa20 20 20 54 68 65 20 65 78 74 72 61 20 32 20 66 61    The extra 2 fa
2aa30 63 74 6f 72 20 69 73 20 74 6f 20 65 6e 63 6f 75  ctor is to encou
2aa40 72 61 67 65 20 74 68 65 20 75 73 65 20 6f 66 20  rage the use of 
2aa50 69 6e 64 65 78 65 64 20 6c 6f 6f 6b 75 70 73 0a  indexed lookups.
2aa60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20            **    
2aa70 20 6f 76 65 72 20 69 6e 64 65 78 20 73 63 61 6e   over index scan
2aa80 73 2e 20 20 41 20 74 61 62 6c 65 20 73 63 61 6e  s.  A table scan
2aa90 20 75 73 65 73 20 61 20 66 61 63 74 6f 72 20 6f   uses a factor o
2aaa0 66 20 33 20 73 6f 20 74 68 61 74 0a 20 20 20 20  f 3 so that.    
2aab0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64        **     ind
2aac0 65 78 20 73 63 61 6e 73 20 61 72 65 20 66 61 76  ex scans are fav
2aad0 6f 72 65 64 20 6f 76 65 72 20 74 61 62 6c 65 20  ored over table 
2aae0 73 63 61 6e 73 2e 0a 20 20 20 20 20 20 20 20 20  scans..         
2aaf0 20 2a 2a 20 20 2b 20 20 49 66 20 74 68 69 73 20   **  +  If this 
2ab00 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 6d  covering index m
2ab10 69 67 68 74 20 61 6c 73 6f 20 68 65 6c 70 20 73  ight also help s
2ab20 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52  atisfy the ORDER
2ab30 20 42 59 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   BY.          **
2ab40 20 20 20 20 20 63 6c 61 75 73 65 2c 20 74 68 65       clause, the
2ab50 6e 20 74 68 65 20 63 6f 73 74 20 69 73 20 66 75  n the cost is fu
2ab60 64 67 65 64 20 64 6f 77 6e 20 73 6c 69 67 68 74  dged down slight
2ab70 6c 79 20 73 6f 20 74 68 61 74 20 74 68 69 73 0a  ly so that this.
2ab80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20            **    
2ab90 20 69 6e 64 65 78 20 69 73 20 66 61 76 6f 72 65   index is favore
2aba0 64 20 61 62 6f 76 65 20 6f 74 68 65 72 20 69 6e  d above other in
2abb0 64 69 63 65 73 20 74 68 61 74 20 68 61 76 65 20  dices that have 
2abc0 6e 6f 20 68 6f 70 65 20 6f 66 0a 20 20 20 20 20  no hope of.     
2abd0 20 20 20 20 20 2a 2a 20 20 20 20 20 68 65 6c 70       **     help
2abe0 69 6e 67 20 77 69 74 68 20 74 68 65 20 4f 52 44  ing with the ORD
2abf0 45 52 20 42 59 2e 20 2a 2f 0a 20 20 20 20 20 20  ER BY. */.      
2ac00 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
2ac10 20 31 30 20 2b 20 77 68 65 72 65 43 6f 73 74 41   10 + whereCostA
2ac20 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69 7a  dd(rSize,rLogSiz
2ac30 65 29 20 2d 20 62 3b 0a 20 20 20 20 20 20 20 20  e) - b;.        
2ac40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2ac50 20 61 73 73 65 72 74 28 20 62 21 3d 30 20 29 3b   assert( b!=0 );
2ac60 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54   .          /* T
2ac70 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 73  UNING: Cost of s
2ac80 63 61 6e 6e 69 6e 67 20 61 20 6e 6f 6e 2d 63 6f  canning a non-co
2ac90 76 65 72 69 6e 67 20 69 6e 64 65 78 20 69 73 20  vering index is 
2aca0 28 4e 2b 31 29 2a 6c 6f 67 32 28 4e 29 0a 20 20  (N+1)*log2(N).  
2acb0 20 20 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68          ** which
2acc0 20 77 65 20 77 69 6c 6c 20 73 69 6d 70 6c 69 66   we will simplif
2acd0 79 20 74 6f 20 6a 75 73 74 20 4e 2a 6c 6f 67 32  y to just N*log2
2ace0 28 4e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (N) */.         
2acf0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53   pNew->rRun = rS
2ad00 69 7a 65 20 2b 20 72 4c 6f 67 53 69 7a 65 3b 0a  ize + rLogSize;.
2ad10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ad20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2ad30 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
2ad40 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   pNew);.        
2ad50 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
2ad60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2ad70 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2ad80 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
2ad90 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
2ada0 72 6f 62 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  robe, 0);..    /
2adb0 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
2adc0 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
2add0 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74  use, then only t
2ade0 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73  hat one index is
2adf0 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72  .    ** consider
2ae00 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
2ae10 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 20 62 72  Src->pIndex ) br
2ae20 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
2ae30 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
2ae40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2ae50 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
2ae60 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
2ae70 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20  p objects for a 
2ae80 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
2ae90 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a  n identified by.
2aea0 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  ** pBuilder->pNe
2aeb0 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74  w->iTab.  That t
2aec0 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65  able is guarante
2aed0 65 64 20 74 6f 20 62 65 20 61 20 76 69 72 74 75  ed to be a virtu
2aee0 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
2aef0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
2af00 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20 57  pAddVirtual(.  W
2af10 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
2af20 2a 70 42 75 69 6c 64 65 72 20 20 20 2f 2a 20 57  *pBuilder   /* W
2af30 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f  HERE clause info
2af40 72 6d 61 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  rmation */.){.  
2af50 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2af60 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
2af70 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63  WHERE analysis c
2af80 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73  ontext */.  Pars
2af90 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
2afa0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2afb0 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
2afc0 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
2afd0 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
2afe0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
2aff0 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
2b000 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2b010 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  pSrc;   /* The F
2b020 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
2b030 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 54  to search */.  T
2b040 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71  able *pTab;.  sq
2b050 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c  lite3 *db;.  sql
2b060 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
2b070 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72  *pIdxInfo;.  str
2b080 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
2b090 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49  x_constraint *pI
2b0a0 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74  dxCons;.  struct
2b0b0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
2b0c0 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20  onstraint_usage 
2b0d0 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65  *pUsage;.  Where
2b0e0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
2b0f0 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69  nt i, j;.  int i
2b100 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20  Term, mxTerm;.  
2b110 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  int nConstraint;
2b120 0a 20 20 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20  .  int seenIn = 
2b130 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2b140 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 49 4e  /* True if an IN
2b150 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73 65 65   operator is see
2b160 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56  n */.  int seenV
2b170 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ar = 0;         
2b180 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2b190 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f   non-constant co
2b1a0 6e 73 74 72 61 69 6e 74 20 69 73 20 73 65 65 6e  nstraint is seen
2b1b0 20 2a 2f 0a 20 20 69 6e 74 20 69 50 68 61 73 65   */.  int iPhase
2b1c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b1d0 20 20 20 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77     /* 0: const w
2b1e0 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c  /o IN, 1: const,
2b1f0 20 32 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49   2: no IN,  2: I
2b200 4e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  N */.  WhereLoop
2b210 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63   *pNew;.  int rc
2b220 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
2b230 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64   pWInfo = pBuild
2b240 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50  er->pWInfo;.  pP
2b250 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
2b260 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
2b270 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20  arse->db;.  pWC 
2b280 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
2b290 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
2b2a0 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63  er->pNew;.  pSrc
2b2b0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62   = &pWInfo->pTab
2b2c0 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54  List->a[pNew->iT
2b2d0 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70 53  ab];.  pTab = pS
2b2e0 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73 65  rc->pTab;.  asse
2b2f0 72 74 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  rt( IsVirtual(pT
2b300 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49 6e 66  ab) );.  pIdxInf
2b310 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65  o = allocateInde
2b320 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57  xInfo(pParse, pW
2b330 43 2c 20 70 53 72 63 2c 20 70 42 75 69 6c 64 65  C, pSrc, pBuilde
2b340 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  r->pOrderBy);.  
2b350 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
2b360 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2b370 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70  NOMEM;.  pNew->p
2b380 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 70 4e 65  rereq = 0;.  pNe
2b390 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
2b3a0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
2b3b0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
2b3c0 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54  BLE;.  pNew->nLT
2b3d0 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  erm = 0;.  pNew-
2b3e0 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
2b3f0 20 3d 20 30 3b 0a 20 20 70 55 73 61 67 65 20 3d   = 0;.  pUsage =
2b400 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
2b410 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 6e  traintUsage;.  n
2b420 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64  Constraint = pId
2b430 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
2b440 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c  nt;.  if( whereL
2b450 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e  oopResize(db, pN
2b460 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29  ew, nConstraint)
2b470 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
2b480 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e  bFree(db, pIdxIn
2b490 66 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  fo);.    return 
2b4a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2b4b0 7d 0a 0a 20 20 66 6f 72 28 69 50 68 61 73 65 3d  }..  for(iPhase=
2b4c0 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b 20 69 50  0; iPhase<=3; iP
2b4d0 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28  hase++){.    if(
2b4e0 20 21 73 65 65 6e 49 6e 20 26 26 20 28 69 50 68   !seenIn && (iPh
2b4f0 61 73 65 26 31 29 21 3d 30 20 29 7b 0a 20 20 20  ase&1)!=0 ){.   
2b500 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a 20 20 20     iPhase++;.   
2b510 20 20 20 69 66 28 20 69 50 68 61 73 65 3e 33 20     if( iPhase>3 
2b520 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
2b530 20 20 20 69 66 28 20 21 73 65 65 6e 56 61 72 20     if( !seenVar 
2b540 26 26 20 69 50 68 61 73 65 3e 31 20 29 20 62 72  && iPhase>1 ) br
2b550 65 61 6b 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  eak;.    pIdxCon
2b560 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c  s = *(struct sql
2b570 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
2b580 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
2b590 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->aConstraint;.
2b5a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2b5b0 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
2b5c0 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43  aint; i++, pIdxC
2b5d0 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20  ons++){.      j 
2b5e0 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72  = pIdxCons->iTer
2b5f0 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  mOffset;.      p
2b600 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a  Term = &pWC->a[j
2b610 5d 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  ];.      switch(
2b620 20 69 50 68 61 73 65 20 29 7b 0a 20 20 20 20 20   iPhase ){.     
2b630 20 20 20 63 61 73 65 20 30 3a 20 20 20 20 2f 2a     case 0:    /*
2b640 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 6f   Constants witho
2b650 75 74 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  ut IN operator *
2b660 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  /.          pIdx
2b670 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30  Cons->usable = 0
2b680 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2b690 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
2b6a0 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b  r & WO_IN)!=0 ){
2b6b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65  .            see
2b6c0 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nIn = 1;.       
2b6d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
2b6e0 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
2b6f0 52 69 67 68 74 21 3d 30 20 29 7b 0a 20 20 20 20  Right!=0 ){.    
2b700 20 20 20 20 20 20 20 20 73 65 65 6e 56 61 72 20          seenVar 
2b710 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
2b720 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d  else if( (pTerm-
2b730 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2b740 49 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)==0 ){.      
2b750 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
2b760 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  usable = 1;.    
2b770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b780 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2b790 20 63 61 73 65 20 31 3a 20 20 20 20 2f 2a 20 43   case 1:    /* C
2b7a0 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20 49 4e  onstants with IN
2b7b0 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
2b7c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2b7d0 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20  seenIn );.      
2b7e0 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
2b7f0 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70  able = (pTerm->p
2b800 72 65 72 65 71 52 69 67 68 74 3d 3d 30 29 3b 0a  rereqRight==0);.
2b810 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2b820 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 32 3a  .        case 2:
2b830 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73      /* Variables
2b840 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f 0a 20   without IN */. 
2b850 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2b860 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20 20 20   seenVar );.    
2b870 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
2b880 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d  usable = (pTerm-
2b890 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2b8a0 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  IN)==0;.        
2b8b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2b8c0 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20 56   default:   /* V
2b8d0 61 72 69 61 62 6c 65 73 20 77 69 74 68 20 49 4e  ariables with IN
2b8e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
2b8f0 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 26 26  sert( seenVar &&
2b900 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20   seenIn );.     
2b910 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
2b920 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  sable = 1;.     
2b930 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2b940 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65    }.    }.    me
2b950 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20  mset(pUsage, 0, 
2b960 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d  sizeof(pUsage[0]
2b970 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  )*pIdxInfo->nCon
2b980 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 69 66  straint);.    if
2b990 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  ( pIdxInfo->need
2b9a0 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73  ToFreeIdxStr ) s
2b9b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78  qlite3_free(pIdx
2b9c0 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20  Info->idxStr);. 
2b9d0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
2b9e0 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Str = 0;.    pId
2b9f0 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
2ba00 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
2ba10 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
2ba20 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  r = 0;.    pIdxI
2ba30 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
2ba40 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 49  umed = 0;.    pI
2ba50 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
2ba60 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42  dCost = SQLITE_B
2ba70 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65  IG_DBL / (double
2ba80 29 32 3b 0a 20 20 20 20 72 63 20 3d 20 76 74 61  )2;.    rc = vta
2ba90 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73  bBestIndex(pPars
2baa0 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66  e, pTab, pIdxInf
2bab0 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
2bac0 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41   goto whereLoopA
2bad0 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20  ddVtab_exit;.   
2bae0 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74   pIdxCons = *(st
2baf0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
2bb00 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
2bb10 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
2bb20 74 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77  traint;.    pNew
2bb30 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20 20  ->prereq = 0;.  
2bb40 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20    mxTerm = -1;. 
2bb50 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
2bb60 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72  >nLSlot>=nConstr
2bb70 61 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72 28  aint );.    for(
2bb80 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69  i=0; i<nConstrai
2bb90 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61  nt; i++) pNew->a
2bba0 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20  LTerm[i] = 0;.  
2bbb0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f    pNew->u.vtab.o
2bbc0 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  mitMask = 0;.   
2bbd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e   for(i=0; i<nCon
2bbe0 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
2bbf0 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20  dxCons++){.     
2bc00 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55   if( (iTerm = pU
2bc10 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
2bc20 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20  x - 1)>=0 ){.   
2bc30 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e       j = pIdxCon
2bc40 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  s->iTermOffset;.
2bc50 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
2bc60 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20  m>=nConstraint. 
2bc70 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20          || j<0. 
2bc80 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57          || j>=pW
2bc90 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  C->nTerm.       
2bca0 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72    || pNew->aLTer
2bcb0 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20  m[iTerm]!=0.    
2bcc0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2bcd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
2bce0 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  OR;.          sq
2bcf0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2bd00 61 72 73 65 2c 20 22 25 73 2e 78 42 65 73 74 49  arse, "%s.xBestI
2bd10 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e 63 74 69  ndex() malfuncti
2bd20 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  on", pTab->zName
2bd30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
2bd40 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74  o whereLoopAddVt
2bd50 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ab_exit;.       
2bd60 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63   }.        testc
2bd70 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e  ase( iTerm==nCon
2bd80 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20  straint-1 );.   
2bd90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
2bda0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
2bdb0 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d  estcase( j==pWC-
2bdc0 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20  >nTerm-1 );.    
2bdd0 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
2bde0 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[j];.        
2bdf0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20  pNew->prereq |= 
2be00 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
2be10 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
2be20 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e  rt( iTerm<pNew->
2be30 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20  nLSlot );.      
2be40 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69    pNew->aLTerm[i
2be50 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  Term] = pTerm;. 
2be60 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d         if( iTerm
2be70 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d  >mxTerm ) mxTerm
2be80 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20   = iTerm;.      
2be90 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
2bea0 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20 20 20  m==15 );.       
2beb0 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d   testcase( iTerm
2bec0 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20 20 20  ==16 );.        
2bed0 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20  if( iTerm<16 && 
2bee0 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29  pUsage[i].omit )
2bef0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
2bf00 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65  itMask |= 1<<iTe
2bf10 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rm;.        if( 
2bf20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
2bf30 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b  r & WO_IN)!=0 ){
2bf40 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2bf50 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30  Usage[i].omit==0
2bf60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2bf70 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  /* Do not attemp
2bf80 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e 20 63  t to use an IN c
2bf90 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74 68 65  onstraint if the
2bfa0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20   virtual table. 
2bfb0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61             ** sa
2bfc0 79 73 20 74 68 61 74 20 74 68 65 20 65 71 75 69  ys that the equi
2bfd0 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74 72  valent EQ constr
2bfe0 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 73  aint cannot be s
2bff0 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20  afely omitted.. 
2c000 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66             ** If
2c010 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74 20 74   we do attempt t
2c020 6f 20 75 73 65 20 73 75 63 68 20 61 20 63 6f 6e  o use such a con
2c030 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f  straint, some ro
2c040 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20 20 20  ws might be.    
2c050 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65 61          ** repea
2c060 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70 75  ted in the outpu
2c070 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
2c080 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2c090 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f     }.          /
2c0a0 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c  * A virtual tabl
2c0b0 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72  e that is constr
2c0c0 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63  ained by an IN c
2c0d0 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20  lause may not.  
2c0e0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75          ** consu
2c0f0 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  me the ORDER BY 
2c100 63 6c 61 75 73 65 20 62 65 63 61 75 73 65 20 28  clause because (
2c110 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  1) the order of 
2c120 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20  IN terms.       
2c130 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63     ** is not nec
2c140 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64  essarily related
2c150 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66   to the order of
2c160 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e   output terms an
2c170 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 28  d.          ** (
2c180 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70  2) Multiple outp
2c190 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  uts from a singl
2c1a0 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20  e IN value will 
2c1b0 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20 20  not merge.      
2c1c0 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e      ** together.
2c1d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70    */.          p
2c1e0 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
2c1f0 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
2c200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2c210 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e      }.    if( i>
2c220 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a  =nConstraint ){.
2c230 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
2c240 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20  rm = mxTerm+1;. 
2c250 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
2c260 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d  w->nLTerm<=pNew-
2c270 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20  >nLSlot );.     
2c280 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
2c290 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xNum = pIdxInfo-
2c2a0 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70  >idxNum;.      p
2c2b0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
2c2c0 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  Free = pIdxInfo-
2c2d0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
2c2e0 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  r;.      pIdxInf
2c2f0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
2c300 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Str = 0;.      p
2c310 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  New->u.vtab.idxS
2c320 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69  tr = pIdxInfo->i
2c330 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 4e 65  dxStr;.      pNe
2c340 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65  w->u.vtab.isOrde
2c350 72 65 64 20 3d 20 28 75 38 29 28 28 70 49 64 78  red = (u8)((pIdx
2c360 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 21 3d  Info->nOrderBy!=
2c370 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
2c380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c390 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78 49          && pIdxI
2c3a0 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
2c3b0 75 6d 65 64 29 3b 0a 20 20 20 20 20 20 70 4e 65  umed);.      pNe
2c3c0 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
2c3d0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2c3e0 3d 20 77 68 65 72 65 43 6f 73 74 46 72 6f 6d 44  = whereCostFromD
2c3f0 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e  ouble(pIdxInfo->
2c400 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
2c410 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
2c420 20 45 76 65 72 79 20 76 69 72 74 75 61 6c 20 74   Every virtual t
2c430 61 62 6c 65 20 71 75 65 72 79 20 72 65 74 75 72  able query retur
2c440 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20  ns 25 rows */.  
2c450 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2c460 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34 36   46;  assert( 46
2c470 3d 3d 77 68 65 72 65 43 6f 73 74 28 32 35 29 20  ==whereCost(25) 
2c480 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
2c490 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
2c4a0 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
2c4b0 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  if( pNew->u.vtab
2c4c0 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
2c4d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2c4e0 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69  e(pNew->u.vtab.i
2c4f0 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20  dxStr);.        
2c500 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
2c510 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  dFree = 0;.     
2c520 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a   }.    }.  }  ..
2c530 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
2c540 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64  _exit:.  if( pId
2c550 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
2c560 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65  eIdxStr ) sqlite
2c570 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
2c580 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
2c590 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
2c5a0 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  dxInfo);.  retur
2c5b0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
2c5c0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
2c5d0 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
2c5e0 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f  *.** Add WhereLo
2c5f0 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61  op entries to ha
2c600 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20  ndle OR terms.  
2c610 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65  This works for e
2c620 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20  ither.** btrees 
2c630 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
2c640 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2c650 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
2c660 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
2c670 20 2a 70 42 75 69 6c 64 65 72 2c 20 42 69 74 6d   *pBuilder, Bitm
2c680 61 73 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20 57  ask mExtra){.  W
2c690 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
2c6a0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
2c6b0 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  nfo;.  WhereClau
2c6c0 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
2c6d0 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68  Loop *pNew;.  Wh
2c6e0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
2c6f0 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72  *pWCEnd;.  int r
2c700 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2c710 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65   int iCur;.  Whe
2c720 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b  reClause tempWC;
2c730 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
2c740 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20  der sSubBuild;. 
2c750 20 57 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d   WhereOrSet sSum
2c760 2c 20 73 43 75 72 2c 20 73 50 72 65 76 3b 0a 20  , sCur, sPrev;. 
2c770 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2c780 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a  item *pItem;.  .
2c790 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
2c7a0 2d 3e 70 57 43 3b 0a 20 20 69 66 28 20 70 57 49  ->pWC;.  if( pWI
2c7b0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2c7c0 26 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59  & WHERE_AND_ONLY
2c7d0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2c7e0 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20  _OK;.  pWCEnd = 
2c7f0 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54  pWC->a + pWC->nT
2c800 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42  erm;.  pNew = pB
2c810 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
2c820 6d 65 6d 73 65 74 28 26 73 53 75 6d 2c 20 30 2c  memset(&sSum, 0,
2c830 20 73 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a   sizeof(sSum));.
2c840 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
2c850 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
2c860 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
2c870 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  OK; pTerm++){.  
2c880 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
2c890 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29  perator & WO_OR)
2c8a0 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  !=0.     && (pTe
2c8b0 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  rm->u.pOrInfo->i
2c8c0 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d  ndexable & pNew-
2c8d0 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20  >maskSelf)!=0 . 
2c8e0 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72     ){.      Wher
2c8f0 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20  eClause * const 
2c900 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWC = &pTerm->
2c910 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
2c920 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
2c930 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20   const pOrWCEnd 
2c940 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57  = &pOrWC->a[pOrW
2c950 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20  C->nTerm];.     
2c960 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
2c970 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  erm;.      int o
2c980 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  nce = 1;.      i
2c990 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20  nt i, j;.    .  
2c9a0 20 20 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e      pItem = pWIn
2c9b0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20  fo->pTabList->a 
2c9c0 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20  + pNew->iTab;.  
2c9d0 20 20 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d      iCur = pItem
2c9e0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
2c9f0 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42   sSubBuild = *pB
2ca00 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53  uilder;.      sS
2ca10 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79  ubBuild.pOrderBy
2ca20 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62   = 0;.      sSub
2ca30 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26  Build.pOrSet = &
2ca40 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 66 6f 72  sCur;..      for
2ca50 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e  (pOrTerm=pOrWC->
2ca60 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43  a; pOrTerm<pOrWC
2ca70 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  End; pOrTerm++){
2ca80 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f  .        if( (pO
2ca90 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
2caa0 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b   & WO_AND)!=0 ){
2cab0 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42  .          sSubB
2cac0 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72 54  uild.pWC = &pOrT
2cad0 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d  erm->u.pAndInfo-
2cae0 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  >wc;.        }el
2caf0 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
2cb00 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
2cb10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65   ){.          te
2cb20 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57  mpWC.pWInfo = pW
2cb30 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20  C->pWInfo;.     
2cb40 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75 74       tempWC.pOut
2cb50 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20  er = pWC;.      
2cb60 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20      tempWC.op = 
2cb70 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20  TK_AND;.        
2cb80 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d    tempWC.nTerm =
2cb90 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   1;.          te
2cba0 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d  mpWC.a = pOrTerm
2cbb0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62  ;.          sSub
2cbc0 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d  Build.pWC = &tem
2cbd0 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  pWC;.        }el
2cbe0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  se{.          co
2cbf0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2cc00 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72 2e 6e  }.        sCur.n
2cc10 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
2cc20 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2cc30 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69  LTABLE.        i
2cc40 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74  f( IsVirtual(pIt
2cc50 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20  em->pTab) ){.   
2cc60 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
2cc70 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
2cc80 26 73 53 75 62 42 75 69 6c 64 29 3b 0a 20 20 20  &sSubBuild);.   
2cc90 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
2cca0 69 3c 73 43 75 72 2e 6e 3b 20 69 2b 2b 29 20 73  i<sCur.n; i++) s
2ccb0 43 75 72 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20  Cur.a[i].prereq 
2ccc0 7c 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 20  |= mExtra;.     
2ccd0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
2cce0 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
2ccf0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2cd00 6f 70 41 64 64 42 74 72 65 65 28 26 73 53 75 62  opAddBtree(&sSub
2cd10 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a  Build, mExtra);.
2cd20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cd30 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
2cd40 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e  LITE_OK || sCur.
2cd50 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
2cd60 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b  if( sCur.n==0 ){
2cd70 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e  .          sSum.
2cd80 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
2cd90 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2cda0 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65 20 29  }else if( once )
2cdb0 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72  {.          wher
2cdc0 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26  eOrMove(&sSum, &
2cdd0 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20  sCur);.         
2cde0 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20   once = 0;.     
2cdf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ce00 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28      whereOrMove(
2ce10 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a  &sPrev, &sSum);.
2ce20 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e            sSum.n
2ce30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2ce40 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76  for(i=0; i<sPrev
2ce50 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; i++){.      
2ce60 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2ce70 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20  <sCur.n; j++){. 
2ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
2ce90 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d  reOrInsert(&sSum
2cea0 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65  , sPrev.a[i].pre
2ceb0 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e  req | sCur.a[j].
2cec0 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20  prereq,.        
2ced0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cee0 20 20 20 20 77 68 65 72 65 43 6f 73 74 41 64 64      whereCostAdd
2cef0 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e  (sPrev.a[i].rRun
2cf00 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e  , sCur.a[j].rRun
2cf10 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2cf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
2cf30 68 65 72 65 43 6f 73 74 41 64 64 28 73 50 72 65  hereCostAdd(sPre
2cf40 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75  v.a[i].nOut, sCu
2cf50 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20  r.a[j].nOut));. 
2cf60 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2cf70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2cf80 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2cf90 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
2cfa0 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  1;.      pNew->a
2cfb0 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  LTerm[0] = pTerm
2cfc0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
2cfd0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55  Flags = WHERE_MU
2cfe0 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e  LTI_OR;.      pN
2cff0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
2d000 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
2d010 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  tIdx = 0;.      
2d020 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c  memset(&pNew->u,
2d030 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d   0, sizeof(pNew-
2d040 3e 75 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  >u));.      for(
2d050 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
2d060 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20  OK && i<sSum.n; 
2d070 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  i++){.        /*
2d080 20 54 55 4e 49 4e 47 3a 20 4d 75 6c 74 69 70 6c   TUNING: Multipl
2d090 65 20 62 79 20 33 2e 35 20 66 6f 72 20 74 68 65  e by 3.5 for the
2d0a0 20 73 65 63 6f 6e 64 61 72 79 20 74 61 62 6c 65   secondary table
2d0b0 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 20   lookup */.     
2d0c0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
2d0d0 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b  sSum.a[i].rRun +
2d0e0 20 31 38 3b 0a 20 20 20 20 20 20 20 20 70 4e 65   18;.        pNe
2d0f0 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61  w->nOut = sSum.a
2d100 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20  [i].nOut;.      
2d110 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
2d120 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65   sSum.a[i].prere
2d130 71 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  q;.        rc = 
2d140 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
2d150 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
2d160 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2d170 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2d180 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  }../*.** Add all
2d190 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
2d1a0 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  ts for all table
2d1b0 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s .*/.static int
2d1c0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c   whereLoopAddAll
2d1d0 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
2d1e0 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20  r *pBuilder){.  
2d1f0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2d200 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
2d210 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20  Info;.  Bitmask 
2d220 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 42 69  mExtra = 0;.  Bi
2d230 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30  tmask mPrior = 0
2d240 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
2d250 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
2d260 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
2d270 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
2d280 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2d290 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
2d2a0 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
2d2b0 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 54  se->db;.  int nT
2d2c0 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
2d2d0 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20 72  >nLevel;.  int r
2d2e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2d2f0 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70   u8 priorJoinTyp
2d300 65 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 4c 6f  e = 0;.  WhereLo
2d310 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20  op *pNew;..  /* 
2d320 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61  Loop over the ta
2d330 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  bles in the join
2d340 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  , from left to r
2d350 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d  ight */.  pNew =
2d360 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
2d370 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  .  whereLoopInit
2d380 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69 54  (pNew);.  for(iT
2d390 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61 62  ab=0, pItem=pTab
2d3a0 4c 69 73 74 2d 3e 61 3b 20 69 54 61 62 3c 6e 54  List->a; iTab<nT
2d3b0 61 62 4c 69 73 74 3b 20 69 54 61 62 2b 2b 2c 20  abList; iTab++, 
2d3c0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 70 4e  pItem++){.    pN
2d3d0 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b  ew->iTab = iTab;
2d3e0 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  .    pNew->maskS
2d3f0 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70  elf = getMask(&p
2d400 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
2d410 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
2d420 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49 74 65  ;.    if( ((pIte
2d430 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f  m->jointype|prio
2d440 72 4a 6f 69 6e 54 79 70 65 29 20 26 20 28 4a 54  rJoinType) & (JT
2d450 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
2d460 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 45 78  !=0 ){.      mEx
2d470 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20  tra = mPrior;.  
2d480 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69    }.    priorJoi
2d490 6e 54 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e 6a  nType = pItem->j
2d4a0 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 69 66 28  ointype;.    if(
2d4b0 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d   IsVirtual(pItem
2d4c0 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
2d4d0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2d4e0 64 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64  ddVirtual(pBuild
2d4f0 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  er);.    }else{.
2d500 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2d510 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42 75  LoopAddBtree(pBu
2d520 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a  ilder, mExtra);.
2d530 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2d540 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2d550 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2d560 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65  oopAddOr(pBuilde
2d570 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20  r, mExtra);.    
2d580 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20  }.    mPrior |= 
2d590 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  pNew->maskSelf;.
2d5a0 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62      if( rc || db
2d5b0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2d5c0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68   break;.  }.  wh
2d5d0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
2d5e0 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e   pNew);.  return
2d5f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78   rc;.}../*.** Ex
2d600 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61 74  amine a WherePat
2d610 68 20 28 77 69 74 68 20 74 68 65 20 61 64 64 69  h (with the addi
2d620 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72  tion of the extr
2d630 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74  a WhereLoop of t
2d640 68 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65  he 5th.** parame
2d650 74 65 72 73 29 20 74 6f 20 73 65 65 20 69 66 20  ters) to see if 
2d660 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20  it outputs rows 
2d670 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
2d680 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72   ORDER BY.** (or
2d690 20 47 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f   GROUP BY) witho
2d6a0 75 74 20 72 65 71 75 69 72 69 6e 67 20 61 20 73  ut requiring a s
2d6b0 65 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65  eparate sort ope
2d6c0 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 3a  ration.  Return:
2d6d0 0a 2a 2a 20 0a 2a 2a 20 20 20 20 30 3a 20 20 4f  .** .**    0:  O
2d6e0 52 44 45 52 20 42 59 20 69 73 20 6e 6f 74 20 73  RDER BY is not s
2d6f0 61 74 69 73 66 69 65 64 2e 20 20 53 6f 72 74 69  atisfied.  Sorti
2d700 6e 67 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 20  ng required.**  
2d710 20 20 31 3a 20 20 4f 52 44 45 52 20 42 59 20 69    1:  ORDER BY i
2d720 73 20 73 61 74 69 73 66 69 65 64 2e 20 20 20 20  s satisfied.    
2d730 20 20 4f 6d 69 74 20 73 6f 72 74 69 6e 67 0a 2a    Omit sorting.*
2d740 2a 20 20 20 2d 31 3a 20 20 55 6e 6b 6e 6f 77 6e  *   -1:  Unknown
2d750 20 61 74 20 74 68 69 73 20 74 69 6d 65 0a 2a 2a   at this time.**
2d760 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 72  .** Note that pr
2d770 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 48 45  ocessing for WHE
2d780 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64 20 57  RE_GROUPBY and W
2d790 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
2d7a0 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72  is not as.** str
2d7b0 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f 55 50  ict.  With GROUP
2d7c0 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
2d7d0 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72   the only requir
2d7e0 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a  ement is that.**
2d7f0 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73   equivalent rows
2d800 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69 61 74   appear immediat
2d810 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74 6f 20  ely adjacent to 
2d820 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20 47 52  one another.  GR
2d830 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49  OUP BY.** and DI
2d840 53 54 49 4e 54 20 64 6f 20 6e 6f 74 20 72 65 71  STINT do not req
2d850 75 69 72 65 20 72 6f 77 73 20 74 6f 20 61 70 70  uire rows to app
2d860 65 61 72 20 69 6e 20 61 6e 79 20 70 61 72 74 69  ear in any parti
2d870 63 75 6c 61 72 20 6f 72 64 65 72 20 61 73 20 6c  cular order as l
2d880 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69 76 65  ong.** as equive
2d890 6c 65 6e 74 20 72 6f 77 73 20 61 72 65 20 67 72  lent rows are gr
2d8a0 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e 20  ouped together. 
2d8b0 20 54 68 75 73 20 66 6f 72 20 47 52 4f 55 50 20   Thus for GROUP 
2d8c0 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 0a  BY and DISTINCT.
2d8d0 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42 79 20  ** the pOrderBy 
2d8e0 74 65 72 6d 73 20 63 61 6e 20 62 65 20 6d 61 74  terms can be mat
2d8f0 63 68 65 64 20 69 6e 20 61 6e 79 20 6f 72 64 65  ched in any orde
2d900 72 2e 20 20 57 69 74 68 20 4f 52 44 45 52 20 42  r.  With ORDER B
2d910 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64 65  Y, the .** pOrde
2d920 72 42 79 20 74 65 72 6d 73 20 6d 75 73 74 20 62  rBy terms must b
2d930 65 20 6d 61 74 63 68 65 64 20 69 6e 20 73 74 72  e matched in str
2d940 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68  ict left-to-righ
2d950 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  t order..*/.stat
2d960 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68  ic int wherePath
2d970 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
2d980 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  (.  WhereInfo *p
2d990 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65  WInfo,    /* The
2d9a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
2d9b0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
2d9c0 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45  derBy,   /* ORDE
2d9d0 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
2d9e0 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63 6c 61   or DISTINCT cla
2d9f0 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  use to check */.
2da00 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 50 61    WherePath *pPa
2da10 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  th,     /* The W
2da20 68 65 72 65 50 61 74 68 20 74 6f 20 63 68 65 63  herePath to chec
2da30 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  k */.  u16 wctrl
2da40 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20  Flags,       /* 
2da50 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 57 48  Might contain WH
2da60 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72 20 57  ERE_GROUPBY or W
2da70 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
2da80 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20  */.  u16 nLoop, 
2da90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2daa0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
2dab0 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b  in pPath->aLoop[
2dac0 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ] */.  WhereLoop
2dad0 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20   *pLast,     /* 
2dae0 41 64 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f  Add this WhereLo
2daf0 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  op to the end of
2db00 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20   pPath->aLoop[] 
2db10 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70 52  */.  Bitmask *pR
2db20 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55  evMask     /* OU
2db30 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65  T: Mask of Where
2db40 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20  Loops to run in 
2db50 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
2db60 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b  .){.  u8 revSet;
2db70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2db80 72 75 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e  rue if rev is kn
2db90 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b  own */.  u8 rev;
2dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2dbb0 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74  * Composite sort
2dbc0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72   order */.  u8 r
2dbd0 65 76 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  evIdx;          
2dbe0 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20    /* Index sort 
2dbf0 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73  order */.  u8 is
2dc00 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20 20  OrderDistinct;  
2dc10 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57 68   /* All prior Wh
2dc20 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64  ereLoops are ord
2dc30 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  er-distinct */. 
2dc40 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c 75   u8 distinctColu
2dc50 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  mns;   /* True i
2dc60 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20 55  f the loop has U
2dc70 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63  NIQUE NOT NULL c
2dc80 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69  olumns */.  u8 i
2dc90 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20 20  sMatch;         
2dca0 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74    /* iColumn mat
2dcb0 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ches a term of t
2dcc0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2dcd0 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c  se */.  u16 nCol
2dce0 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  umn;          /*
2dcf0 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
2dd00 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a  ns in pIndex */.
2dd10 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 20    u16 nOrderBy; 
2dd20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2dd30 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  r terms in the O
2dd40 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
2dd50 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20  /.  int iLoop;  
2dd60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2dd70 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20  ex of WhereLoop 
2dd80 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20 70  in pPath being p
2dd90 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e  rocessed */.  in
2dda0 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
2ddb0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2ddc0 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ters */.  int iC
2ddd0 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ur;             
2dde0 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
2ddf0 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68 65   for current Whe
2de00 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  reLoop */.  int 
2de10 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  iColumn;        
2de20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75    /* A column nu
2de30 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61 62 6c  mber within tabl
2de40 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65 72  e iCur */.  Wher
2de50 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30  eLoop *pLoop = 0
2de60 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65  ; /* Current Whe
2de70 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f  reLoop being pro
2de80 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65  cessed. */.  Whe
2de90 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
2dea0 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
2deb0 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
2dec0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
2ded0 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20  r *pOBExpr;     
2dee0 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73     /* An express
2def0 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52 44  ion from the ORD
2df00 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
2df10 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
2df20 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41  ;       /* COLLA
2df30 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d  TE function from
2df40 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
2df50 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e  use term */.  In
2df60 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
2df70 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
2df80 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2df90 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69   pLoop */.  sqli
2dfa0 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f  te3 *db = pWInfo
2dfb0 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  ->pParse->db;  /
2dfc0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
2dfd0 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  ction */.  Bitma
2dfe0 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20 20  sk obSat = 0;   
2dff0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45   /* Mask of ORDE
2e000 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69 73  R BY terms satis
2e010 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  fied so far */. 
2e020 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b   Bitmask obDone;
2e030 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
2e040 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74  f all ORDER BY t
2e050 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  erms */.  Bitmas
2e060 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d  k orderDistinctM
2e070 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  ask;  /* Mask of
2e080 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65   all well-ordere
2e090 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74  d loops */.  Bit
2e0a0 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20 20  mask ready;     
2e0b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
2e0c0 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20   of inner loops 
2e0d0 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65  */..  /*.  ** We
2e0e0 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f   say the WhereLo
2e0f0 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20  op is "one-row" 
2e100 69 66 20 69 74 20 67 65 6e 65 72 61 74 65 73 20  if it generates 
2e110 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
2e120 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74  .  ** row of out
2e130 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f  put.  A WhereLoo
2e140 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20  p is one-row if 
2e150 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
2e160 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
2e170 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e 64   **  (a) All ind
2e180 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68  ex columns match
2e190 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c 55   with WHERE_COLU
2e1a0 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29  MN_EQ..  **  (b)
2e1b0 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e   The index is un
2e1c0 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68  ique.  ** Any Wh
2e1d0 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20  ereLoop with an 
2e1e0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
2e1f0 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68  constraint on th
2e200 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72  e rowid is one-r
2e210 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f  ow..  ** Every o
2e220 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70  ne-row WhereLoop
2e230 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20 57   will have the W
2e240 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20  HERE_ONEROW bit 
2e250 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a  set in wsFlags..
2e260 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79    **.  ** We say
2e270 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69   the WhereLoop i
2e280 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  s "order-distinc
2e290 74 22 20 69 66 20 74 68 65 20 73 65 74 20 6f 66  t" if the set of
2e2a0 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20   columns from.  
2e2b0 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f  ** that WhereLoo
2e2c0 70 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68  p that are in th
2e2d0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2e2e0 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20  e are different 
2e2f0 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20 72  for every.  ** r
2e300 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c  ow of the WhereL
2e310 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d  oop.  Every one-
2e320 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  row WhereLoop is
2e330 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20   automatically. 
2e340 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   ** order-distin
2e350 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f 6f  ct.   A WhereLoo
2e360 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63 6f  p that has no co
2e370 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52 44  lumns in the ORD
2e380 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a  ER BY clause.  *
2e390 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64  * is not order-d
2e3a0 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f  istinct. To be o
2e3b0 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69 73  rder-distinct is
2e3c0 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20 73   not quite the s
2e3d0 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20 2a  ame as being.  *
2e3e0 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20 61  * UNIQUE since a
2e3f0 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f   UNIQUE column o
2e400 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76 65  r index can have
2e410 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74   multiple rows t
2e420 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55  hat .  ** are NU
2e430 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75  LL and NULL valu
2e440 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e  es are equivalen
2e450 74 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73  t for the purpos
2e460 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74 69  e of order-disti
2e470 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20  nct..  ** To be 
2e480 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c 20  order-distinct, 
2e490 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74  the columns must
2e4a0 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20 4e   be UNIQUE and N
2e4b0 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20  OT NULL..  **.  
2e4c0 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
2e4d0 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61   a table is alwa
2e4e0 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f  ys UNIQUE and NO
2e4f0 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76  T NULL so whenev
2e500 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69  er the.  ** rowi
2e510 64 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  d appears in the
2e520 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2e530 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
2e540 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  ing WhereLoop is
2e550 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  .  ** automatica
2e560 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  lly order-distin
2e570 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65  ct..  */..  asse
2e580 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
2e590 29 3b 0a 0a 20 20 2f 2a 20 53 6f 72 74 61 62 69  );..  /* Sortabi
2e5a0 6c 69 74 79 20 6f 66 20 76 69 72 74 75 61 6c 20  lity of virtual 
2e5b0 74 61 62 6c 65 73 20 69 73 20 64 65 74 65 72 6d  tables is determ
2e5c0 69 6e 65 64 20 62 79 20 74 68 65 20 78 42 65 73  ined by the xBes
2e5d0 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 0a 20 20  tIndex method.  
2e5e0 2a 2a 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  ** of the virtua
2e5f0 6c 20 74 61 62 6c 65 20 69 74 73 65 6c 66 20 2a  l table itself *
2e600 2f 0a 20 20 69 66 28 20 70 4c 61 73 74 2d 3e 77  /.  if( pLast->w
2e610 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
2e620 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20  IRTUALTABLE ){. 
2e630 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 4c 6f     testcase( nLo
2e640 6f 70 3e 30 20 29 3b 20 20 2f 2a 20 54 72 75 65  op>0 );  /* True
2e650 20 77 68 65 6e 20 6f 75 74 65 72 20 6c 6f 6f 70   when outer loop
2e660 73 20 61 72 65 20 6f 6e 65 2d 72 6f 77 20 61 6e  s are one-row an
2e670 64 20 6d 61 74 63 68 20 0a 20 20 20 20 20 20 20  d match .       
2e680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e690 20 20 20 2a 2a 20 6e 6f 20 4f 52 44 45 52 20 42     ** no ORDER B
2e6a0 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 72  Y terms */.    r
2e6b0 65 74 75 72 6e 20 70 4c 61 73 74 2d 3e 75 2e 76  eturn pLast->u.v
2e6c0 74 61 62 2e 69 73 4f 72 64 65 72 65 64 3b 0a 20  tab.isOrdered;. 
2e6d0 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26   }.  if( nLoop &
2e6e0 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  & OptimizationDi
2e6f0 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
2e700 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e  E_OrderByIdxJoin
2e710 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  ) ) return 0;.. 
2e720 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
2e730 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74  erBy->nExpr;.  t
2e740 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72 42  estcase( nOrderB
2e750 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66  y==BMS-1 );.  if
2e760 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31  ( nOrderBy>BMS-1
2e770 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
2e780 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65   Cannot optimize
2e790 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f 52   overly large OR
2e7a0 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f  DER BYs */.  isO
2e7b0 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31  rderDistinct = 1
2e7c0 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53  ;.  obDone = MAS
2e7d0 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d 31  KBIT(nOrderBy)-1
2e7e0 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63  ;.  orderDistinc
2e7f0 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61  tMask = 0;.  rea
2e800 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c  dy = 0;.  for(iL
2e810 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69  oop=0; isOrderDi
2e820 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c  stinct && obSat<
2e830 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c  obDone && iLoop<
2e840 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  =nLoop; iLoop++)
2e850 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e  {.    if( iLoop>
2e860 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f  0 ) ready |= pLo
2e870 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
2e880 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c    pLoop = iLoop<
2e890 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61  nLoop ? pPath->a
2e8a0 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c  Loop[iLoop] : pL
2e8b0 61 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ast;.    assert(
2e8c0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
2e8d0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
2e8e0 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 20  TABLE)==0 );.   
2e8f0 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e   iCur = pWInfo->
2e900 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f  pTabList->a[pLoo
2e910 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72  p->iTab].iCursor
2e920 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f  ;..    /* Mark o
2e930 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20  ff any ORDER BY 
2e940 74 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61  term X that is a
2e950 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74   column in the t
2e960 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  able of.    ** t
2e970 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20  he current loop 
2e980 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20  for which there 
2e990 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57  is term in the W
2e9a0 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75  HERE.    ** clau
2e9b0 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  se of the form X
2e9c0 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20   IS NULL or X=? 
2e9d0 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f  that reference o
2e9e0 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a  nly outer.    **
2e9f0 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20   loops..    */. 
2ea00 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
2ea10 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
2ea20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
2ea30 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
2ea40 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42  tinue;.      pOB
2ea50 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
2ea60 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
2ea70 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2ea80 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
2ea90 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  OBExpr->op!=TK_C
2eaa0 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65  OLUMN ) continue
2eab0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45  ;.      if( pOBE
2eac0 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75  xpr->iTable!=iCu
2ead0 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
2eae0 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
2eaf0 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57  Term(&pWInfo->sW
2eb00 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72  C, iCur, pOBExpr
2eb10 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->iColumn,.     
2eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb30 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c    ~ready, WO_EQ|
2eb40 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20  WO_ISNULL, 0);. 
2eb50 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
2eb60 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2eb70 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
2eb80 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29  eOperator&WO_EQ)
2eb90 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e  !=0 && pOBExpr->
2eba0 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
2ebb0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2ebc0 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20   *z1, *z2;.     
2ebd0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2ebe0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
2ebf0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f  Info->pParse, pO
2ec00 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2ec10 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
2ec20 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
2ec30 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
2ec40 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43  .        z1 = pC
2ec50 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
2ec60 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
2ec70 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2ec80 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
2ec90 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Term->pExpr);.  
2eca0 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
2ecb0 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
2ecc0 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
2ecd0 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e    z2 = pColl->zN
2ece0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
2ecf0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2ed00 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e  z1, z2)!=0 ) con
2ed10 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
2ed20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
2ed30 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a  SKBIT(i);.    }.
2ed40 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
2ed50 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2ed60 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20  _ONEROW)==0 ){. 
2ed70 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
2ed80 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2ed90 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  IPK ){.        p
2eda0 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
2edb0 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a     nColumn = 0;.
2edc0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2edd0 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d  (pIndex = pLoop-
2ede0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
2edf0 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62  ==0 || pIndex->b
2ee00 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20  Unordered ){.   
2ee10 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2ee20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ee30 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49      nColumn = pI
2ee40 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  ndex->nColumn;. 
2ee50 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
2ee60 73 74 69 6e 63 74 20 3d 20 70 49 6e 64 65 78 2d  stinct = pIndex-
2ee70 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
2ee80 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
2ee90 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
2eea0 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66  h all columns of
2eeb0 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64   the index and d
2eec0 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65  eal with the one
2eed0 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  s.      ** that 
2eee0 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69  are not constrai
2eef0 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e  ned by == or IN.
2ef00 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2ef10 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30  rev = revSet = 0
2ef20 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63 74  ;.      distinct
2ef30 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20  Columns = 0;.   
2ef40 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 3d 6e     for(j=0; j<=n
2ef50 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
2ef60 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65 3b 20        u8 bOnce; 
2ef70 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e    /* True to run
2ef80 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 73 65   the ORDER BY se
2ef90 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20  arch loop */..  
2efa0 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76        /* Skip ov
2efb0 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c  er == and IS NUL
2efc0 4c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  L terms */.     
2efd0 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e     if( j<pLoop->
2efe0 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20  u.btree.nEq.    
2eff0 20 20 20 20 20 26 26 20 28 28 69 20 3d 20 70 4c       && ((i = pL
2f000 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e  oop->aLTerm[j]->
2f010 65 4f 70 65 72 61 74 6f 72 29 20 26 20 28 57 4f  eOperator) & (WO
2f020 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21  _EQ|WO_ISNULL))!
2f030 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
2f040 20 20 20 20 20 20 20 20 69 66 28 20 69 20 26 20          if( i & 
2f050 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
2f060 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2f070 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  e( isOrderDistin
2f080 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ct );.          
2f090 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2f0a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
2f0b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   }.          con
2f0c0 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20  tinue;  .       
2f0d0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47   }..        /* G
2f0e0 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75  et the column nu
2f0f0 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c  mber in the tabl
2f100 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20  e (iColumn) and 
2f110 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20  sort order.     
2f120 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66     ** (revIdx) f
2f130 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75  or the j-th colu
2f140 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  mn of the index.
2f150 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2f160 20 20 20 20 69 66 28 20 6a 3c 6e 43 6f 6c 75 6d      if( j<nColum
2f170 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  n ){.          /
2f180 2a 20 4e 6f 72 6d 61 6c 20 69 6e 64 65 78 20 63  * Normal index c
2f190 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20  olumns */.      
2f1a0 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49      iColumn = pI
2f1b0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  ndex->aiColumn[j
2f1c0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76  ];.          rev
2f1d0 49 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53  Idx = pIndex->aS
2f1e0 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20  ortOrder[j];.   
2f1f0 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
2f200 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62  mn==pIndex->pTab
2f210 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c  le->iPKey ) iCol
2f220 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
2f230 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2f240 20 20 20 2f 2a 20 54 68 65 20 52 4f 57 49 44 20     /* The ROWID 
2f250 63 6f 6c 75 6d 6e 20 61 74 20 74 68 65 20 65 6e  column at the en
2f260 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  d */.          a
2f270 73 73 65 72 74 28 20 6a 3d 3d 6e 43 6f 6c 75 6d  ssert( j==nColum
2f280 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  n );.          i
2f290 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
2f2a0 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20         revIdx = 
2f2b0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
2f2c0 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f        /* An unco
2f2d0 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e  nstrained column
2f2e0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e   that might be N
2f2f0 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ULL means that t
2f300 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57  his.        ** W
2f310 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20  hereLoop is not 
2f320 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 0a 20 20  well-ordered .  
2f330 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2f340 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74   if( isOrderDist
2f350 69 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26 26  inct.         &&
2f360 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20   iColumn>=0.    
2f370 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70       && j>=pLoop
2f380 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20  ->u.btree.nEq.  
2f390 20 20 20 20 20 20 20 26 26 20 70 49 6e 64 65 78         && pIndex
2f3a0 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  ->pTable->aCol[i
2f3b0 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d  Column].notNull=
2f3c0 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
2f3d0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
2f3e0 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
2f3f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2f400 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45  /* Find the ORDE
2f410 52 20 42 59 20 74 65 72 6d 20 74 68 61 74 20 63  R BY term that c
2f420 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
2f430 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20  e j-th column.  
2f440 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
2f450 69 6e 64 65 78 20 61 6e 64 20 61 6e 64 20 6d 61  index and and ma
2f460 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42 59  rk that ORDER BY
2f470 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20   term off .     
2f480 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f     */.        bO
2f490 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nce = 1;.       
2f4a0 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20   isMatch = 0;.  
2f4b0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62        for(i=0; b
2f4c0 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72  Once && i<nOrder
2f4d0 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
2f4e0 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
2f4f0 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
2f500 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2f510 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74   pOBExpr = sqlit
2f520 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
2f530 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  e(pOrderBy->a[i]
2f540 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
2f550 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
2f560 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2f570 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20  GROUPBY );.     
2f580 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
2f590 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2f5a0 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a  E_DISTINCTBY );.
2f5b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77            if( (w
2f5c0 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45  ctrlFlags & (WHE
2f5d0 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45  RE_GROUPBY|WHERE
2f5e0 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30  _DISTINCTBY))==0
2f5f0 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20   ) bOnce = 0;.  
2f600 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45          if( pOBE
2f610 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
2f620 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  MN ) continue;. 
2f630 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
2f640 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43  Expr->iTable!=iC
2f650 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
2f660 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
2f670 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  Expr->iColumn!=i
2f680 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
2f690 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
2f6a0 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20   iColumn>=0 ){. 
2f6b0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
2f6c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2f6d0 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50  llSeq(pWInfo->pP
2f6e0 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  arse, pOrderBy->
2f6f0 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
2f700 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43           if( !pC
2f710 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
2f720 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
2f730 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2f740 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
2f750 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78  l->zName, pIndex
2f760 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20  ->azColl[j])!=0 
2f770 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2f780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f790 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20    isMatch = 1;. 
2f7a0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2f7b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f7c0 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b    if( isMatch ){
2f7d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2f7e0 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
2f7f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2f800 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  ( distinctColumn
2f810 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  s==0 );.        
2f820 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75      distinctColu
2f830 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mns = 1;.       
2f840 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f     }.          o
2f850 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
2f860 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i);.          if
2f870 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
2f880 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
2f890 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20  OUPBY)==0 ){.   
2f8a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
2f8b0 20 73 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f   sure the sort o
2f8c0 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62  rder is compatib
2f8d0 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  le in an ORDER B
2f8e0 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20  Y clause..      
2f8f0 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72        ** Sort or
2f900 64 65 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e  der is irrelevan
2f910 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59  t for a GROUP BY
2f920 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20   clause. */.    
2f930 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76 53          if( revS
2f940 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  et ){.          
2f950 20 20 20 20 69 66 28 20 28 72 65 76 20 5e 20 72      if( (rev ^ r
2f960 65 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79  evIdx)!=pOrderBy
2f970 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
2f980 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
2f990 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2f9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2f9b0 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72  v = revIdx ^ pOr
2f9c0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
2f9d0 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20  Order;.         
2f9e0 20 20 20 20 20 69 66 28 20 72 65 76 20 29 20 2a       if( rev ) *
2f9f0 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b  pRevMask |= MASK
2fa00 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  BIT(iLoop);.    
2fa10 20 20 20 20 20 20 20 20 20 20 72 65 76 53 65 74            revSet
2fa20 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2fa30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2fa40 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2fa50 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d           /* No m
2fa60 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  atch found */.  
2fa70 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30          if( j==0
2fa80 20 7c 7c 20 6a 3c 6e 43 6f 6c 75 6d 6e 20 29 7b   || j<nColumn ){
2fa90 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
2faa0 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69  tcase( isOrderDi
2fab0 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20  stinct!=0 );.   
2fac0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
2fad0 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
2fae0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2faf0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2fb00 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20     }.      } /* 
2fb10 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c  end Loop over al
2fb20 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  l index columns 
2fb30 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69 73  */.      if( dis
2fb40 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a  tinctColumns ){.
2fb50 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2fb60 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
2fb70 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
2fb80 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2fb90 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
2fba0 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74   } /* end-if not
2fbb0 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20   one-row */..   
2fbc0 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79   /* Mark off any
2fbd0 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59 20   other ORDER BY 
2fbe0 74 65 72 6d 73 20 74 68 61 74 20 72 65 66 65 72  terms that refer
2fbf0 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20  ence pLoop */.  
2fc00 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73    if( isOrderDis
2fc10 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f  tinct ){.      o
2fc20 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
2fc30 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   |= pLoop->maskS
2fc40 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  elf;.      for(i
2fc50 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
2fc60 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  i++){.        Ex
2fc70 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 69  pr *p;.        i
2fc80 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
2fc90 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
2fca0 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f  ;.        p = pO
2fcb0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2fcc0 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
2fcd0 28 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28  (exprTableUsage(
2fce0 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
2fcf0 74 2c 20 70 29 26 7e 6f 72 64 65 72 44 69 73 74  t, p)&~orderDist
2fd00 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a  inctMask)==0 ){.
2fd10 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20            obSat 
2fd20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20  |= MASKBIT(i);. 
2fd30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2fd40 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e  .    }.  } /* En
2fd50 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20  d the loop over 
2fd60 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66  all WhereLoops f
2fd70 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64  rom outer-most d
2fd80 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73  own to inner-mos
2fd90 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74  t */.  if( obSat
2fda0 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72  ==obDone ) retur
2fdb0 6e 20 31 3b 0a 20 20 69 66 28 20 21 69 73 4f 72  n 1;.  if( !isOr
2fdc0 64 65 72 44 69 73 74 69 6e 63 74 20 29 20 72 65  derDistinct ) re
2fdd0 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
2fde0 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57   -1;.}..#ifdef W
2fdf0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
2fe00 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69  D./* For debuggi
2fe10 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a  ng use only: */.
2fe20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
2fe30 72 20 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65  r *wherePathName
2fe40 28 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74  (WherePath *pPat
2fe50 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68  h, int nLoop, Wh
2fe60 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b  ereLoop *pLast){
2fe70 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
2fe80 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20  Name[65];.  int 
2fe90 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
2fea0 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61  nLoop; i++){ zNa
2feb0 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61  me[i] = pPath->a
2fec0 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a  Loop[i]->cId; }.
2fed0 20 20 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e    if( pLast ) zN
2fee0 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74  ame[i++] = pLast
2fef0 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69  ->cId;.  zName[i
2ff00 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
2ff10 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  zName;.}.#endif.
2ff20 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
2ff30 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c  e list of WhereL
2ff40 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70  oop objects at p
2ff50 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74  WInfo->pLoops, t
2ff60 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
2ff70 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20  ttempts to find 
2ff80 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
2ff90 70 61 74 68 20 74 68 61 74 20 76 69 73 69 74 73  path that visits
2ffa0 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a   each WhereLoop.
2ffb0 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70  ** once.  This p
2ffc0 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64  ath is then load
2ffd0 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e  ed into the pWIn
2ffe0 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66  fo->a[].pWLoop f
2fff0 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73  ields..**.** Ass
30000 75 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f 74  ume that the tot
30010 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  al number of out
30020 70 75 74 20 72 6f 77 73 20 74 68 61 74 20 77 69  put rows that wi
30030 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f  ll need to be so
30040 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  rted.** will be 
30050 6e 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20  nRowEst (in the 
30060 31 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e  10*log2 represen
30070 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67  tation).  Or, ig
30080 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20  nore sorting.** 
30090 63 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74  costs if nRowEst
300a0 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ==0..**.** Retur
300b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
300c0 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45  uccess or SQLITE
300d0 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f  _NOMEM of a memo
300e0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ry allocation.**
300f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
30100 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
30110 72 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65  rePathSolver(Whe
30120 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
30130 57 68 65 72 65 43 6f 73 74 20 6e 52 6f 77 45 73  WhereCost nRowEs
30140 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69  t){.  int mxChoi
30150 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
30160 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
30170 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75  r of simultaneou
30180 73 20 70 61 74 68 73 20 74 72 61 63 6b 65 64 20  s paths tracked 
30190 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20  */.  int nLoop; 
301a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
301b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
301c0 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s in the join */
301d0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
301e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
301f0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
30200 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
30210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
30220 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
30230 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
30240 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt iLoop;       
30250 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
30260 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20 74 68   counter over th
30270 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6a  e terms of the j
30280 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c  oin */.  int ii,
30290 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20   jj;            
302a0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
302b0 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  ers */.  WhereCo
302c0 73 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20  st rCost;       
302d0 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66        /* Cost of
302e0 20 61 20 70 61 74 68 20 2a 2f 0a 20 20 57 68 65   a path */.  Whe
302f0 72 65 43 6f 73 74 20 6d 78 43 6f 73 74 20 3d 20  reCost mxCost = 
30300 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78  0;        /* Max
30310 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73  imum cost of a s
30320 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20  et of paths */. 
30330 20 57 68 65 72 65 43 6f 73 74 20 72 53 6f 72 74   WhereCost rSort
30340 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Cost;         /*
30350 20 43 6f 73 74 20 74 6f 20 64 6f 20 61 20 73 6f   Cost to do a so
30360 72 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c  rt */.  int nTo,
30370 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20   nFrom;         
30380 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
30390 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20  alid entries in 
303a0 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b  aTo[] and aFrom[
303b0 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  ] */.  WherePath
303c0 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20   *aFrom;        
303d0 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61   /* All nFrom pa
303e0 74 68 73 20 61 74 20 74 68 65 20 70 72 65 76 69  ths at the previ
303f0 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57  ous level */.  W
30400 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20  herePath *aTo;  
30410 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
30420 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73 20 61  nTo best paths a
30430 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  t the current le
30440 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
30450 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20  th *pFrom;      
30460 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74     /* An element
30470 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74   of aFrom[] that
30480 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
30490 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  on */.  WherePat
304a0 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20  h *pTo;         
304b0 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20    /* An element 
304c0 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65  of aTo[] that we
304d0 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
304e0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
304f0 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f  pWLoop;        /
30500 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65  * One of the Whe
30510 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a  reLoop objects *
30520 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  /.  WhereLoop **
30530 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pX;           /*
30540 20 55 73 65 64 20 74 6f 20 64 69 76 79 20 75 70   Used to divy up
30550 20 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f   the pSpace memo
30560 72 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53  ry */.  char *pS
30570 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
30580 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d    /* Temporary m
30590 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68  emory used by th
305a0 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20  is routine */.. 
305b0 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
305c0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d  ->pParse;.  db =
305d0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e   pParse->db;.  n
305e0 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e  Loop = pWInfo->n
305f0 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49  Level;.  /* TUNI
30600 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71  NG: For simple q
30610 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65  ueries, only the
30620 20 62 65 73 74 20 70 61 74 68 20 69 73 20 74 72   best path is tr
30630 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20  acked..  ** For 
30640 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65  2-way joins, the
30650 20 35 20 62 65 73 74 20 70 61 74 68 73 20 61 72   5 best paths ar
30660 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a  e followed..  **
30670 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20   For joins of 3 
30680 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20  or more tables, 
30690 74 72 61 63 6b 20 74 68 65 20 31 30 20 62 65 73  track the 10 bes
306a0 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43  t paths */.  mxC
306b0 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3d 3d  hoice = (nLoop==
306c0 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d  1) ? 1 : (nLoop=
306d0 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20  =2 ? 5 : 10);.  
306e0 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70  assert( nLoop<=p
306f0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
30700 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45  >nSrc );.  WHERE
30710 54 52 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d  TRACE(0x002, ("-
30720 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72  --- begin solver
30730 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  \n"));..  /* All
30740 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
30750 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61  lize space for a
30760 54 6f 20 61 6e 64 20 61 46 72 6f 6d 20 2a 2f 0a  To and aFrom */.
30770 20 20 69 69 20 3d 20 28 73 69 7a 65 6f 66 28 57    ii = (sizeof(W
30780 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66  herePath)+sizeof
30790 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f  (WhereLoop*)*nLo
307a0 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a  op)*mxChoice*2;.
307b0 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74    pSpace = sqlit
307c0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
307d0 2c 20 69 69 29 3b 0a 20 20 69 66 28 20 70 53 70  , ii);.  if( pSp
307e0 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ace==0 ) return 
307f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
30800 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68  aTo = (WherePath
30810 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f  *)pSpace;.  aFro
30820 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65  m = aTo+mxChoice
30830 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d  ;.  memset(aFrom
30840 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f  , 0, sizeof(aFro
30850 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28  m[0]));.  pX = (
30860 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72  WhereLoop**)(aFr
30870 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20  om+mxChoice);.  
30880 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a  for(ii=mxChoice*
30890 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69  2, pFrom=aTo; ii
308a0 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b  >0; ii--, pFrom+
308b0 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b  +, pX += nLoop){
308c0 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  .    pFrom->aLoo
308d0 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20 20 2f  p = pX;.  }..  /
308e0 2a 20 53 65 65 64 20 74 68 65 20 73 65 61 72 63  * Seed the searc
308f0 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  h with a single 
30900 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69  WherePath contai
30910 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c  ning zero WhereL
30920 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oops..  **.  ** 
30930 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c  TUNING: Do not l
30940 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
30950 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61   iterations go a
30960 62 6f 76 65 20 32 35 2e 20 20 49 66 20 74 68 65  bove 25.  If the
30970 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f   cost.  ** of co
30980 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d  mputing an autom
30990 61 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f  atic index is no
309a0 74 20 70 61 69 64 20 62 61 63 6b 20 77 69 74 68  t paid back with
309b0 69 6e 20 74 68 65 20 66 69 72 73 74 20 32 35 0a  in the first 25.
309c0 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20    ** rows, then 
309d0 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61  do not use the a
309e0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20  utomatic index. 
309f0 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52  */.  aFrom[0].nR
30a00 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d  ow = MIN(pParse-
30a10 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 36 29  >nQueryLoop, 46)
30a20 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 77  ;  assert( 46==w
30a30 68 65 72 65 43 6f 73 74 28 32 35 29 20 29 3b 0a  hereCost(25) );.
30a40 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 0a 20 20    nFrom = 1;..  
30a50 2f 2a 20 50 72 65 63 6f 6d 70 75 74 65 20 74 68  /* Precompute th
30a60 65 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  e cost of sortin
30a70 67 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75  g the final resu
30a80 6c 74 20 73 65 74 2c 20 69 66 20 74 68 65 20 63  lt set, if the c
30a90 61 6c 6c 65 72 0a 20 20 2a 2a 20 74 6f 20 73 71  aller.  ** to sq
30aa0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
30ab0 29 20 77 61 73 20 63 6f 6e 63 65 72 6e 65 64 20  ) was concerned 
30ac0 61 62 6f 75 74 20 73 6f 72 74 69 6e 67 20 2a 2f  about sorting */
30ad0 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 30  .  rSortCost = 0
30ae0 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  ;.  if( pWInfo->
30af0 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e  pOrderBy==0 || n
30b00 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20  RowEst==0 ){.   
30b10 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65   aFrom[0].isOrde
30b20 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  redValid = 1;.  
30b30 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 55  }else{.    /* TU
30b40 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20  NING: Estimated 
30b50 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
30b60 69 73 20 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65  is N*log2(N) whe
30b70 72 65 20 4e 20 69 73 20 74 68 65 0a 20 20 20 20  re N is the.    
30b80 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ** number of out
30b90 70 75 74 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20  put rows. */.   
30ba0 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f   rSortCost = nRo
30bb0 77 45 73 74 20 2b 20 65 73 74 4c 6f 67 28 6e 52  wEst + estLog(nR
30bc0 6f 77 45 73 74 29 3b 0a 20 20 20 20 57 48 45 52  owEst);.    WHER
30bd0 45 54 52 41 43 45 28 30 78 30 30 32 2c 28 22 2d  ETRACE(0x002,("-
30be0 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d  --- sort cost=%-
30bf0 33 64 5c 6e 22 2c 20 72 53 6f 72 74 43 6f 73 74  3d\n", rSortCost
30c00 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  ));.  }..  /* Co
30c10 6d 70 75 74 65 20 73 75 63 63 65 73 73 69 76 65  mpute successive
30c20 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50  ly longer WhereP
30c30 61 74 68 73 20 75 73 69 6e 67 20 74 68 65 20 70  aths using the p
30c40 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69  revious generati
30c50 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65  on.  ** of Where
30c60 50 61 74 68 73 20 61 73 20 74 68 65 20 62 61 73  Paths as the bas
30c70 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e  is for the next.
30c80 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20    Keep track of 
30c90 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a  the mxChoice.  *
30ca0 2a 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20  * best paths at 
30cb0 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20  each generation 
30cc0 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  */.  for(iLoop=0
30cd0 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69  ; iLoop<nLoop; i
30ce0 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f  Loop++){.    nTo
30cf0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69   = 0;.    for(ii
30d00 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b  =0, pFrom=aFrom;
30d10 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c   ii<nFrom; ii++,
30d20 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
30d30 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e   for(pWLoop=pWIn
30d40 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f  fo->pLoops; pWLo
30d50 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f  op; pWLoop=pWLoo
30d60 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20  p->pNextLoop){. 
30d70 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
30d80 61 73 6b 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  askNew;.        
30d90 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20  Bitmask revMask 
30da0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20  = 0;.        u8 
30db0 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d  isOrderedValid =
30dc0 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
30dd0 64 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20  dValid;.        
30de0 75 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70  u8 isOrdered = p
30df0 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b  From->isOrdered;
30e00 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
30e10 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e  Loop->prereq & ~
30e20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29  pFrom->maskLoop)
30e30 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
30e40 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c          if( (pWL
30e50 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20  oop->maskSelf & 
30e60 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29  pFrom->maskLoop)
30e70 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
30e80 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
30e90 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70  is point, pWLoop
30ea0 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
30eb0 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c  to be the next l
30ec0 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  oop. .        **
30ed0 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73   Compute its cos
30ee0 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 43 6f  t */.        rCo
30ef0 73 74 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64  st = whereCostAd
30f00 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70  d(pWLoop->rSetup
30f10 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20  ,pWLoop->rRun + 
30f20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20  pFrom->nRow);.  
30f30 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 77 68        rCost = wh
30f40 65 72 65 43 6f 73 74 41 64 64 28 72 43 6f 73 74  ereCostAdd(rCost
30f50 2c 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 29 3b  , pFrom->rCost);
30f60 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77  .        maskNew
30f70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   = pFrom->maskLo
30f80 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73  op | pWLoop->mas
30f90 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69  kSelf;.        i
30fa0 66 28 20 21 69 73 4f 72 64 65 72 65 64 56 61 6c  f( !isOrderedVal
30fb0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
30fc0 73 77 69 74 63 68 28 20 77 68 65 72 65 50 61 74  switch( wherePat
30fd0 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
30fe0 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20  y(pWInfo,.      
30ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31000 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
31010 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f  y, pFrom, pWInfo
31020 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20  ->wctrlFlags,.  
31030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31040 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f       iLoop, pWLo
31050 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 20 29 7b  op, &revMask) ){
31060 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73  .            cas
31070 65 20 31 3a 20 20 2f 2a 20 59 65 73 2e 20 20 70  e 1:  /* Yes.  p
31080 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 64 6f 65 73  From+pWLoop does
31090 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
310a0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
310b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
310c0 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20 20 20  Ordered = 1;.   
310d0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
310e0 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20  eredValid = 1;. 
310f0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
31100 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
31110 63 61 73 65 20 30 3a 20 20 2f 2a 20 4e 6f 2e 20  case 0:  /* No. 
31120 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 77 69   pFrom+pWLoop wi
31130 6c 6c 20 72 65 71 75 69 72 65 20 61 20 73 65 70  ll require a sep
31140 61 72 61 74 65 20 73 6f 72 74 20 2a 2f 0a 20 20  arate sort */.  
31150 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
31160 64 65 72 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  dered = 0;.     
31170 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
31180 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  edValid = 1;.   
31190 20 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74             rCost
311a0 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28   = whereCostAdd(
311b0 72 43 6f 73 74 2c 20 72 53 6f 72 74 43 6f 73 74  rCost, rSortCost
311c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
311d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
311e0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20      default: /* 
311f0 43 61 6e 6e 6f 74 20 74 65 6c 6c 20 79 65 74 2e  Cannot tell yet.
31200 20 20 54 72 79 20 61 67 61 69 6e 20 6f 6e 20 74    Try again on t
31210 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
31220 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
31230 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
31240 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
31250 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
31260 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e  evMask = pFrom->
31270 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  revLoop;.       
31280 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68   }.        /* Ch
31290 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57  eck to see if pW
312a0 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61  Loop should be a
312b0 64 64 65 64 20 74 6f 20 74 68 65 20 6d 78 43 68  dded to the mxCh
312c0 6f 69 63 65 20 62 65 73 74 20 73 6f 20 66 61 72  oice best so far
312d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
312e0 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a  jj=0, pTo=aTo; j
312f0 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f  j<nTo; jj++, pTo
31300 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
31310 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70  f( pTo->maskLoop
31320 3d 3d 6d 61 73 6b 4e 65 77 20 26 26 20 70 54 6f  ==maskNew && pTo
31330 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
31340 3d 3d 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ==isOrderedValid
31350 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31360 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54  testcase( jj==nT
31370 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  o-1 );.         
31380 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
31390 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
313a0 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d          if( jj>=
313b0 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nTo ){.         
313c0 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69   if( nTo>=mxChoi
313d0 63 65 20 26 26 20 72 43 6f 73 74 3e 3d 6d 78 43  ce && rCost>=mxC
313e0 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20 57 48  ost ){.#ifdef WH
313f0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
31400 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
31410 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
31420 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
31430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
31440 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70  ebugPrintf("Skip
31450 20 20 20 25 73 20 63 6f 73 74 3d 25 33 64 20 6f     %s cost=%3d o
31460 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
31470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
31480 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
31490 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
314a0 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20  ), rCost,.      
314b0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
314c0 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73  deredValid ? (is
314d0 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
314e0 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
314f0 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
31500 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  f.            co
31510 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
31520 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a    }.          /*
31530 20 41 64 64 20 61 20 6e 65 77 20 50 61 74 68 20   Add a new Path 
31540 74 6f 20 74 68 65 20 61 54 6f 5b 5d 20 73 65 74  to the aTo[] set
31550 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
31560 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29  ( nTo<mxChoice )
31570 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
31580 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 73 69   Increase the si
31590 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65  ze of the aTo se
315a0 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20  t by one */.    
315b0 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f          jj = nTo
315c0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ++;.          }e
315d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
315e0 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70   /* New path rep
315f0 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f 72 20  laces the prior 
31600 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f  worst to keep co
31610 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69  unt below mxChoi
31620 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ce */.          
31630 20 20 66 6f 72 28 6a 6a 3d 6e 54 6f 2d 31 3b 20    for(jj=nTo-1; 
31640 61 54 6f 5b 6a 6a 5d 2e 72 43 6f 73 74 3c 6d 78  aTo[jj].rCost<mx
31650 43 6f 73 74 3b 20 6a 6a 2d 2d 29 7b 20 61 73 73  Cost; jj--){ ass
31660 65 72 74 28 6a 6a 3e 30 29 3b 20 7d 0a 20 20 20  ert(jj>0); }.   
31670 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31680 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a     pTo = &aTo[jj
31690 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ];.#ifdef WHERET
316a0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
316b0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
316c0 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
316d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
316e0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
316f0 74 66 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f  tf("New    %s co
31700 73 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63  st=%-3d order=%c
31710 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
31720 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
31730 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
31740 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
31750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31760 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20   isOrderedValid 
31770 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27  ? (isOrdered ? '
31780 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29  Y' : 'N') : '?')
31790 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
317a0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c  ndif.        }el
317b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
317c0 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43  ( pTo->rCost<=rC
317d0 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20 57 48  ost ){.#ifdef WH
317e0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
317f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
31800 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
31810 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
31820 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
31830 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
31840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
31850 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  kip   %s cost=%-
31860 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20  3d order=%c",.  
31870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31880 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
31890 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
318a0 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20  op), rCost,.    
318b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
318c0 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28  OrderedValid ? (
318d0 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20  isOrdered ? 'Y' 
318e0 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20  : 'N') : '?');. 
318f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
31900 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
31910 22 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25  "   vs %s cost=%
31920 2d 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  -3d order=%c\n",
31930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31940 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
31950 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
31960 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 0a 20  ), pTo->rCost,. 
31970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31980 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56   pTo->isOrderedV
31990 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f  alid ? (pTo->isO
319a0 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27  rdered ? 'Y' : '
319b0 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  N') : '?');.    
319c0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
319d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
319e0 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73  tcase( pTo->rCos
319f0 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20 20  t==rCost );.    
31a00 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
31a10 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
31a20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
31a30 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43  ( pTo->rCost==rC
31a40 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 20  ost+1 );.       
31a50 20 20 20 2f 2a 20 41 20 6e 65 77 20 61 6e 64 20     /* A new and 
31a60 62 65 74 74 65 72 20 73 63 6f 72 65 20 66 6f 72  better score for
31a70 20 61 20 70 72 65 76 69 6f 75 73 6c 79 20 63 72   a previously cr
31a80 65 61 74 65 64 20 65 71 75 69 76 61 6c 65 6e 74  eated equivalent
31a90 20 70 61 74 68 20 2a 2f 0a 23 69 66 64 65 66 20   path */.#ifdef 
31aa0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
31ab0 45 44 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ED.          if(
31ac0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
31ad0 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
31ae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
31af0 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
31b00 20 20 20 20 20 20 20 20 20 20 22 55 70 64 61 74            "Updat
31b10 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f  e %s cost=%-3d o
31b20 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20  rder=%c",.      
31b30 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
31b40 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
31b50 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
31b60 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Cost,.          
31b70 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56        isOrderedV
31b80 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65  alid ? (isOrdere
31b90 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a  d ? 'Y' : 'N') :
31ba0 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
31bb0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
31bc0 72 69 6e 74 66 28 22 20 20 77 61 73 20 25 73 20  rintf("  was %s 
31bd0 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d  cost=%-3d order=
31be0 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
31bf0 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
31c00 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b  Name(pTo, iLoop+
31c10 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73  1, 0), pTo->rCos
31c20 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
31c30 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
31c40 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69  dValid ? (pTo->i
31c50 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a  sOrdered ? 'Y' :
31c60 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20   'N') : '?');.  
31c70 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
31c80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31c90 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20     /* pWLoop is 
31ca0 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69  a winner.  Add i
31cb0 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20  t to the set of 
31cc0 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20  best so far */. 
31cd0 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b         pTo->mask
31ce0 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61  Loop = pFrom->ma
31cf0 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d  skLoop | pWLoop-
31d00 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
31d10 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20     pTo->revLoop 
31d20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20  = revMask;.     
31d30 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 70     pTo->nRow = p
31d40 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c  From->nRow + pWL
31d50 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20  oop->nOut;.     
31d60 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20     pTo->rCost = 
31d70 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70  rCost;.        p
31d80 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c  To->isOrderedVal
31d90 69 64 20 3d 20 69 73 4f 72 64 65 72 65 64 56 61  id = isOrderedVa
31da0 6c 69 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  lid;.        pTo
31db0 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73  ->isOrdered = is
31dc0 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20  Ordered;.       
31dd0 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f   memcpy(pTo->aLo
31de0 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  op, pFrom->aLoop
31df0 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
31e00 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20  op*)*iLoop);.   
31e10 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b       pTo->aLoop[
31e20 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b  iLoop] = pWLoop;
31e30 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f  .        if( nTo
31e40 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20  >=mxChoice ){.  
31e50 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d          mxCost =
31e60 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20   aTo[0].rCost;. 
31e70 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d           for(jj=
31e80 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20  1, pTo=&aTo[1]; 
31e90 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b  jj<mxChoice; jj+
31ea0 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
31eb0 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
31ec0 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 29 20 6d  rCost>mxCost ) m
31ed0 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f  xCost = pTo->rCo
31ee0 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  st;.          }.
31ef0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31f00 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  }.    }..#ifdef 
31f10 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
31f20 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ED.    if( sqlit
31f30 65 33 57 68 65 72 65 54 72 61 63 65 3e 3d 32 20  e3WhereTrace>=2 
31f40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
31f50 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d  DebugPrintf("---
31f60 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25 64  - after round %d
31f70 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29   ----\n", iLoop)
31f80 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
31f90 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54  , pTo=aTo; ii<nT
31fa0 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b  o; ii++, pTo++){
31fb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31fc0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 73  DebugPrintf(" %s
31fd0 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d   cost=%-3d nrow=
31fe0 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  %-3d order=%c",.
31ff0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
32000 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
32010 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
32020 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
32030 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 6f  ,.           pTo
32040 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
32050 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   ? (pTo->isOrder
32060 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20  ed ? 'Y' : 'N') 
32070 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
32080 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72  if( pTo->isOrder
32090 65 64 56 61 6c 69 64 20 26 26 20 70 54 6f 2d 3e  edValid && pTo->
320a0 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20 20 20  isOrdered ){.   
320b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
320c0 62 75 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d  bugPrintf(" rev=
320d0 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e  0x%llx\n", pTo->
320e0 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  revLoop);.      
320f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32100 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
32110 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
32120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
32130 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
32140 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c   /* Swap the rol
32150 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20  es of aFrom and 
32160 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74  aTo for the next
32170 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20   generation */. 
32180 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a     pFrom = aTo;.
32190 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b      aTo = aFrom;
321a0 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72  .    aFrom = pFr
321b0 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20  om;.    nFrom = 
321c0 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  nTo;.  }..  if( 
321d0 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  nFrom==0 ){.    
321e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
321f0 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72  pParse, "no quer
32200 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20  y solution");.  
32210 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
32220 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20  db, pSpace);.   
32230 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
32240 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  RROR;.  }.  .  /
32250 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73  * Find the lowes
32260 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46  t cost path.  pF
32270 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74  rom will be left
32280 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61   pointing to tha
32290 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f  t path */.  pFro
322a0 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 61 73 73  m = aFrom;.  ass
322b0 65 72 74 28 20 6e 46 72 6f 6d 3d 3d 31 20 29 3b  ert( nFrom==1 );
322c0 0a 23 69 66 20 30 20 2f 2a 20 54 68 65 20 66 6f  .#if 0 /* The fo
322d0 6c 6c 6f 77 69 6e 67 20 69 73 20 6e 65 65 64 65  llowing is neede
322e0 64 20 69 66 20 6e 46 72 6f 6d 20 69 73 20 65 76  d if nFrom is ev
322f0 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 2a  er more than 1 *
32300 2f 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69  /.  for(ii=1; ii
32310 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20  <nFrom; ii++){. 
32320 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43     if( pFrom->rC
32330 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43  ost>aFrom[ii].rC
32340 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61  ost ) pFrom = &a
32350 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 23 65  From[ii];.  }.#e
32360 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
32370 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e  WInfo->nLevel==n
32380 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61  Loop );.  /* Loa
32390 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
323a0 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e  t path into pWIn
323b0 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f  fo */.  for(iLoo
323c0 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70  p=0; iLoop<nLoop
323d0 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20  ; iLoop++){.    
323e0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
323f0 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b  el = pWInfo->a +
32400 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76   iLoop;.    pLev
32410 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c  el->pWLoop = pWL
32420 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f  oop = pFrom->aLo
32430 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70  op[iLoop];.    p
32440 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70  Level->iFrom = p
32450 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20  WLoop->iTab;.   
32460 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
32470 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
32480 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
32490 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  From].iCursor;. 
324a0 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f   }.  if( (pWInfo
324b0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
324c0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
324d0 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57  CT)!=0.   && (pW
324e0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
324f0 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
32500 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57  TBY)==0.   && pW
32510 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d  Info->eDistinct=
32520 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
32530 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45  NOOP.   && nRowE
32540 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d  st.  ){.    Bitm
32550 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20  ask notUsed;.   
32560 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50   int rc = whereP
32570 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
32580 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e  rBy(pWInfo, pWIn
32590 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20  fo->pResultSet, 
325a0 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20  pFrom,.         
325b0 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 44 49          WHERE_DI
325c0 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d  STINCTBY, nLoop-
325d0 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b  1, pFrom->aLoop[
325e0 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73  nLoop-1], &notUs
325f0 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
32600 3d 31 20 29 20 70 57 49 6e 66 6f 2d 3e 65 44 69  =1 ) pWInfo->eDi
32610 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
32620 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b  ISTINCT_ORDERED;
32630 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72 6f 6d  .  }.  if( pFrom
32640 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20  ->isOrdered ){. 
32650 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77     if( pWInfo->w
32660 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
32670 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b 0a  E_DISTINCTBY ){.
32680 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
32690 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
326a0 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
326b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
326c0 20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61     pWInfo->bOBSa
326d0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 57 49  t = 1;.      pWI
326e0 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70  nfo->revMask = p
326f0 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20  From->revLoop;. 
32700 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e 66     }.  }.  pWInf
32710 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72  o->nRowOut = pFr
32720 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20  om->nRow;..  /* 
32730 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d  Free temporary m
32740 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e  emory and return
32750 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71   success */.  sq
32760 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
32770 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72  pSpace);.  retur
32780 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
32790 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69  /*.** Most queri
327a0 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69  es use only a si
327b0 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79  ngle table (they
327c0 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20   are not joins) 
327d0 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70  and have.** simp
327e0 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  le == constraint
327f0 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65  s against indexe
32800 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20  d fields.  This 
32810 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
32820 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73  .** to plan thos
32830 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75  e simple cases u
32840 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63  sing much less c
32850 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65  eremony than the
32860 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70  .** general-purp
32870 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  ose query planne
32880 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79 20 79  r, and thereby y
32890 69 65 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69  ield faster sqli
328a0 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a  te3_prepare().**
328b0 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63   times for the c
328c0 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a  ommon case..**.*
328d0 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
328e0 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66  o on success, if
328f0 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20   this query can 
32900 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68  be handled by th
32910 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20  is.** no-frills 
32920 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20  query planner.  
32930 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74  Return zero if t
32940 68 69 73 20 71 75 65 72 79 20 6e 65 65 64 73 20  his query needs 
32950 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d  the .** general-
32960 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c  purpose query pl
32970 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  anner..*/.static
32980 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43   int whereShortC
32990 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  ut(WhereLoopBuil
329a0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a  der *pBuilder){.
329b0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
329c0 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72  nfo;.  struct Sr
329d0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
329e0 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  m;.  WhereClause
329f0 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65   *pWC;.  WhereTe
32a00 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65  rm *pTerm;.  Whe
32a10 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20  reLoop *pLoop;. 
32a20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74   int iCur;.  int
32a30 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   j;.  Table *pTa
32a40 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
32a50 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20 3d 20  ;.  .  pWInfo = 
32a60 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
32a70 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  ;.  if( pWInfo->
32a80 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
32a90 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 29  RE_FORCE_TABLE )
32aa0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
32ab0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ert( pWInfo->pTa
32ac0 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29  bList->nSrc>=1 )
32ad0 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e  ;.  pItem = pWIn
32ae0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b  fo->pTabList->a;
32af0 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  .  pTab = pItem-
32b00 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49 73 56  >pTab;.  if( IsV
32b10 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
32b20 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
32b30 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 29 20 72  Item->zIndex ) r
32b40 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72 20  eturn 0;.  iCur 
32b50 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
32b60 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66  ;.  pWC = &pWInf
32b70 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20  o->sWC;.  pLoop 
32b80 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
32b90 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  ;.  pLoop->wsFla
32ba0 67 73 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20  gs = 0;.  pTerm 
32bb0 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
32bc0 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f  iCur, -1, 0, WO_
32bd0 45 51 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54  EQ, 0);.  if( pT
32be0 65 72 6d 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70  erm ){.    pLoop
32bf0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
32c00 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
32c10 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52  E_IPK|WHERE_ONER
32c20 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61  OW;.    pLoop->a
32c30 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  LTerm[0] = pTerm
32c40 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54  ;.    pLoop->nLT
32c50 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f  erm = 1;.    pLo
32c60 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
32c70 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49  = 1;.    /* TUNI
32c80 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72 6f  NG: Cost of a ro
32c90 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30  wid lookup is 10
32ca0 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72   */.    pLoop->r
32cb0 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33  Run = 33;  /* 33
32cc0 3d 3d 77 68 65 72 65 43 6f 73 74 28 31 30 29 20  ==whereCost(10) 
32cd0 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
32ce0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
32cf0 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
32d00 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
32d10 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
32d20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
32d30 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49   || pIdx->pPartI
32d40 64 78 57 68 65 72 65 21 3d 30 20 29 20 63 6f 6e  dxWhere!=0 ) con
32d50 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
32d60 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43  (j=0; j<pIdx->nC
32d70 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
32d80 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e       pTerm = fin
32d90 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
32da0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
32db0 6a 5d 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 70 49  j], 0, WO_EQ, pI
32dc0 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  dx);.        if(
32dd0 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61   pTerm==0 ) brea
32de0 6b 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  k;.        where
32df0 4c 6f 6f 70 52 65 73 69 7a 65 28 70 57 49 6e 66  LoopResize(pWInf
32e00 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  o->pParse->db, p
32e10 4c 6f 6f 70 2c 20 6a 29 3b 0a 20 20 20 20 20 20  Loop, j);.      
32e20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b    pLoop->aLTerm[
32e30 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  j] = pTerm;.    
32e40 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 21    }.      if( j!
32e50 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  =pIdx->nColumn )
32e60 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
32e70 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
32e80 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
32e90 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57  Q|WHERE_ONEROW|W
32ea0 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20  HERE_INDEXED;.  
32eb0 20 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e      if( (pItem->
32ec0 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d  colUsed & ~colum
32ed0 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78 29 29  nsInIndex(pIdx))
32ee0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
32ef0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
32f00 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b   WHERE_IDX_ONLY;
32f10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
32f20 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a  Loop->nLTerm = j
32f30 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  ;.      pLoop->u
32f40 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a  .btree.nEq = j;.
32f50 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62        pLoop->u.b
32f60 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49  tree.pIndex = pI
32f70 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e  dx;.      /* TUN
32f80 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75  ING: Cost of a u
32f90 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b  nique index look
32fa0 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20  up is 15 */.    
32fb0 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20    pLoop->rRun = 
32fc0 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 77 68 65 72  39;  /* 39==wher
32fd0 65 43 6f 73 74 28 31 35 29 20 2a 2f 0a 20 20 20  eCost(15) */.   
32fe0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
32ff0 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d    }.  if( pLoop-
33000 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  >wsFlags ){.    
33010 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 57  pLoop->nOut = (W
33020 68 65 72 65 43 6f 73 74 29 31 3b 0a 20 20 20 20  hereCost)1;.    
33030 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
33040 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20  oop = pLoop;.   
33050 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
33060 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e   = getMask(&pWIn
33070 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43  fo->sMaskSet, iC
33080 75 72 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  ur);.    pWInfo-
33090 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d 20  >a[0].iTabCur = 
330a0 69 43 75 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f  iCur;.    pWInfo
330b0 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20  ->nRowOut = 1;. 
330c0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70     if( pWInfo->p
330d0 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f  OrderBy ) pWInfo
330e0 2d 3e 62 4f 42 53 61 74 20 3d 20 20 31 3b 0a 20  ->bOBSat =  1;. 
330f0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77     if( pWInfo->w
33100 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
33110 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
33120 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
33130 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
33140 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
33150 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  UE;.    }.#ifdef
33160 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
33170 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27    pLoop->cId = '
33180 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  0';.#endif.    r
33190 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
331a0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
331b0 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62  * Generate the b
331c0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
331d0 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48  loop used for WH
331e0 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
331f0 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65  ssing..** The re
33200 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20  turn value is a 
33210 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70  pointer to an op
33220 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74  aque structure t
33230 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  hat contains.** 
33240 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64  information need
33250 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  ed to terminate 
33260 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72  the loop.  Later
33270 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  , the calling ro
33280 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20  utine.** should 
33290 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68  invoke sqlite3Wh
332a0 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68  ereEnd() with th
332b0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
332c0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  f this function.
332d0 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ** in order to c
332e0 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52  omplete the WHER
332f0 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
33300 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
33310 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
33320 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
33330 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  rns NULL..**.** 
33340 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69  The basic idea i
33350 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64  s to do a nested
33360 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20   loop, one loop 
33370 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
33380 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c  n.** the FROM cl
33390 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74  ause of a select
333a0 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55  .  (INSERT and U
333b0 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
333c0 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65   are the.** same
333d0 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74   as a SELECT wit
333e0 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  h only a single 
333f0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
33400 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a  M clause.)  For.
33410 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  ** example, if t
33420 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a  he SQL is this:.
33430 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45  **.**       SELE
33440 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
33450 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a  , t3 WHERE ...;.
33460 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63  **.** Then the c
33470 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73  ode generated is
33480 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69   conceptually li
33490 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ke the following
334a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72  :.**.**      for
334b0 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
334c0 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f  do       \    Co
334d0 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
334e0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
334f0 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20  ow2 in t2 do    
33500 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
33510 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20  WhereBegin().** 
33520 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
33530 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20   row3 in t3 do  
33540 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   /.**           
33550 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
33560 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
33570 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f           \    Co
33580 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
33590 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20         end      
335a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
335b0 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
335c0 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20  WhereEnd().**   
335d0 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
335e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
335f0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
33600 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74   the loops might
33610 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69   not be nested i
33620 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77  n the order in w
33630 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70  hich they.** app
33640 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
33650 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66 66  clause if a diff
33660 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62  erent order is b
33670 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61  etter able to ma
33680 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64  ke.** use of ind
33690 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f  ices.  Note also
336a0 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 49   that when the I
336b0 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61  N operator appea
336c0 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45  rs in.** the WHE
336d0 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69  RE clause, it mi
336e0 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64  ght result in ad
336f0 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20  ditional nested 
33700 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61  loops for.** sca
33710 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c  nning through al
33720 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20  l values on the 
33730 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
33740 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a  of the IN..**.**
33750 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65   There are Btree
33760 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
33770 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61  ted with each ta
33780 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75  ble.  t1 uses cu
33790 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70  rsor.** number p
337a0 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43  TabList->a[0].iC
337b0 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20  ursor.  t2 uses 
337c0 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c  the cursor pTabL
337d0 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f  ist->a[1].iCurso
337e0 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72  r..** And so for
337f0 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  th.  This routin
33800 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
33810 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56   to open those V
33820 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61  DBE cursors.** a
33830 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  nd sqlite3WhereE
33840 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74  nd() generates t
33850 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65  he code to close
33860 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   them..**.** The
33870 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74   code that sqlit
33880 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67  e3WhereBegin() g
33890 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20  enerates leaves 
338a0 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65  the cursors name
338b0 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74  d.** in pTabList
338c0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
338d0 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  ir appropriate e
338e0 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e  ntries.  The [..
338f0 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75  .] code.** can u
33900 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64  se OP_Column and
33910 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65   OP_Rowid opcode
33920 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f  s on these curso
33930 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a  rs to extract.**
33940 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76   data from the v
33950 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66  arious tables of
33960 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
33970 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   If the WHERE cl
33980 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74  ause is empty, t
33990 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73  he foreach loops
339a0 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20   must each scan 
339b0 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20  their.** entire 
339c0 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20  tables.  Thus a 
339d0 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69  three-way join i
339e0 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72  s an O(N^3) oper
339f0 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a  ation.  But if.*
33a00 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76  * the tables hav
33a10 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68  e indices and th
33a20 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e  ere are terms in
33a30 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
33a40 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20  e that.** refer 
33a50 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73  to those indices
33a60 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62  , a complete tab
33a70 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61  le scan can be a
33a80 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a  voided and the.*
33a90 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20  * code will run 
33aa0 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f  much faster.  Mo
33ab0 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f  st of the work o
33ac0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
33ad0 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f  s checking.** to
33ae0 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
33af0 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63  e indices that c
33b00 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70  an be used to sp
33b10 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e  eed up the loop.
33b20 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20  .**.** Terms of 
33b30 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
33b40 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74   are also used t
33b50 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f  o limit which ro
33b60 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d  ws actually.** m
33b70 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e  ake it to the ".
33b80 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  .." in the middl
33b90 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
33ba0 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65  After each "fore
33bb0 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f  ach",.** terms o
33bc0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
33bd0 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79  se that use only
33be0 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c   terms in that l
33bf0 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a  oop and outer.**
33c00 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75   loops are evalu
33c10 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73  ated and if fals
33c20 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  e a jump is made
33c30 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73   around all subs
33c40 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20  equent.** inner 
33c50 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64  loops (or around
33c60 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68   the "..." if th
33c70 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69  e test occurs wi
33c80 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a  thin the inner-.
33c90 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a  ** most loop).**
33ca0 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a  .** OUTER JOINS.
33cb0 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a  **.** An outer j
33cc0 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31  oin of tables t1
33cd0 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65   and t2 is conce
33ce0 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20  ptally coded as 
33cf0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
33d00 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69    foreach row1 i
33d10 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t1 do.**      
33d20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20  flag = 0.**     
33d30 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
33d40 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20   t2 do.**       
33d50 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20   start:.**      
33d60 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
33d70 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20      flag = 1.** 
33d80 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20       end.**     
33d90 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e   if flag==0 then
33da0 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20  .**        move 
33db0 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20  the row2 cursor 
33dc0 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a  to a null row.**
33dd0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61          goto sta
33de0 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a  rt.**      fi.**
33df0 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52      end.**.** OR
33e00 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52  DER BY CLAUSE PR
33e10 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70  OCESSING.**.** p
33e20 4f 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69  OrderBy is a poi
33e30 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45  nter to the ORDE
33e40 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f 72 20  R BY clause (or 
33e50 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  the GROUP BY cla
33e60 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20 57 48  use.** if the WH
33e70 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67  ERE_GROUPBY flag
33e80 20 69 73 20 73 65 74 20 69 6e 20 77 63 74 72 6c   is set in wctrl
33e90 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45 4c 45  Flags) of a SELE
33ea0 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  CT statement.** 
33eb0 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
33ec0 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
33ed0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
33ee0 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
33ef0 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
33f00 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20   from an UPDATE 
33f10 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
33f20 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72  ent, then pOrder
33f30 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 57  By is NULL..*/.W
33f40 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65  hereInfo *sqlite
33f50 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50  3WhereBegin(.  P
33f60 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
33f70 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
33f80 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
33f90 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
33fa0 74 2c 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  t,    /* FROM cl
33fb0 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20  ause: A list of 
33fc0 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65  all tables to be
33fd0 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78   scanned */.  Ex
33fe0 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
33ff0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
34000 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
34010 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
34020 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42     /* An ORDER B
34030 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c  Y clause, or NUL
34040 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
34050 2a 70 52 65 73 75 6c 74 53 65 74 2c 20 2f 2a 20  *pResultSet, /* 
34060 52 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  Result set of th
34070 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 75 31 36  e query */.  u16
34080 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20   wctrlFlags,    
34090 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
340a0 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64   WHERE_* flags d
340b0 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65  efined in sqlite
340c0 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69  Int.h */.  int i
340d0 49 64 78 43 75 72 20 20 20 20 20 20 20 20 20 20  IdxCur          
340e0 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e 45   /* If WHERE_ONE
340f0 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65  TABLE_ONLY is se
34100 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  t, index cursor 
34110 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  number */.){.  i
34120 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20  nt nByteWInfo;  
34130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
34140 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  . bytes allocate
34150 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20  d for WhereInfo 
34160 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20  struct */.  int 
34170 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20  nTabList;       
34180 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
34190 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
341a0 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68  pTabList */.  Wh
341b0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
341c0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c           /* Will
341d0 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75   become the retu
341e0 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
341f0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56   function */.  V
34200 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
34210 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65  >pVdbe;   /* The
34220 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73   virtual databas
34230 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69  e engine */.  Bi
34240 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20  tmask notReady; 
34250 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
34260 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
34270 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20   yet positioned 
34280 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
34290 69 6c 64 65 72 20 73 57 4c 42 3b 20 20 20 20 20  ilder sWLB;     
342a0 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70  /* The WhereLoop
342b0 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68   builder */.  Wh
342c0 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
342d0 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  kSet;    /* The 
342e0 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20  expression mask 
342f0 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  set */.  WhereLe
34300 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20  vel *pLevel;    
34310 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
34320 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d  level in pWInfo-
34330 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  >a[] */.  WhereL
34340 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  oop *pLoop;     
34350 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
34360 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72  to a single Wher
34370 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
34380 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
34390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
343a0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
343b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
343c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
343d0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
343e0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ion */.  int rc;
343f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34400 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
34410 64 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72  de */...  /* Var
34420 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61  iable initializa
34430 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70  tion */.  db = p
34440 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d  Parse->db;.  mem
34450 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69  set(&sWLB, 0, si
34460 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 20 20 73  zeof(sWLB));.  s
34470 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  WLB.pOrderBy = p
34480 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 44  OrderBy;..  /* D
34490 69 73 61 62 6c 65 20 74 68 65 20 44 49 53 54 49  isable the DISTI
344a0 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  NCT optimization
344b0 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69   if SQLITE_Disti
344c0 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20 76 69  nctOpt is set vi
344d0 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74  a.  ** sqlite3_t
344e0 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f  est_ctrl(SQLITE_
344f0 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
34500 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20  ATIONS,...) */. 
34510 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
34520 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
34530 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74  LITE_DistinctOpt
34540 29 20 29 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c  ) ){.    wctrlFl
34550 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 57 41  ags &= ~WHERE_WA
34560 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d  NT_DISTINCT;.  }
34570 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65  ..  /* The numbe
34580 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  r of tables in t
34590 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
345a0 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65  s limited by the
345b0 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
345c0 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73  bits in a Bitmas
345d0 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  k .  */.  testca
345e0 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  se( pTabList->nS
345f0 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28  rc==BMS );.  if(
34600 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
34610 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  BMS ){.    sqlit
34620 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
34630 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74  e, "at most %d t
34640 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22  ables in a join"
34650 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75  , BMS);.    retu
34660 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
34670 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  This function no
34680 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73  rmally generates
34690 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66   a nested loop f
346a0 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  or all tables in
346b0 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e   .  ** pTabList.
346c0 20 20 42 75 74 20 69 66 20 74 68 65 20 57 48 45    But if the WHE
346d0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
346e0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
346f0 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a  en we should.  *
34700 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20  * only generate 
34710 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69 72  code for the fir
34720 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62  st table in pTab
34730 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20  List and assume 
34740 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75  that.  ** any cu
34750 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
34760 20 77 69 74 68 20 73 75 62 73 65 71 75 65 6e 74   with subsequent
34770 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e   tables are unin
34780 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
34790 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63    nTabList = (wc
347a0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
347b0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20  _ONETABLE_ONLY) 
347c0 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e  ? 1 : pTabList->
347d0 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  nSrc;..  /* Allo
347e0 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
347f0 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ize the WhereInf
34800 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
34810 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
34820 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  .  ** return val
34830 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c  ue. A single all
34840 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  ocation is used 
34850 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65  to store the Whe
34860 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75  reInfo.  ** stru
34870 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ct, the contents
34880 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b   of WhereInfo.a[
34890 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  ], the WhereClau
348a0 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
348b0 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d  * and the WhereM
348c0 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65  askSet structure
348d0 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61  . Since WhereCla
348e0 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  use contains an 
348f0 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c  8-byte.  ** fiel
34900 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29  d (type Bitmask)
34910 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67   it must be alig
34920 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65  ned on an 8-byte
34930 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a   boundary on.  *
34940 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74  * some architect
34950 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20  ures. Hence the 
34960 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a  ROUND8() below..
34970 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66    */.  nByteWInf
34980 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  o = ROUND8(sizeo
34990 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54  f(WhereInfo)+(nT
349a0 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66  abList-1)*sizeof
349b0 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20  (WhereLevel));. 
349c0 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
349d0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
349e0 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 73  , nByteWInfo + s
349f0 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29  izeof(WhereLoop)
34a00 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
34a10 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
34a20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
34a30 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  b, pWInfo);.    
34a40 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20  pWInfo = 0;.    
34a50 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
34a60 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  rror;.  }.  pWIn
34a70 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61  fo->nLevel = nTa
34a80 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  bList;.  pWInfo-
34a90 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  >pParse = pParse
34aa0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  ;.  pWInfo->pTab
34ab0 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
34ac0 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  .  pWInfo->pOrde
34ad0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
34ae0 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c    pWInfo->pResul
34af0 74 53 65 74 20 3d 20 70 52 65 73 75 6c 74 53 65  tSet = pResultSe
34b00 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72  t;.  pWInfo->iBr
34b10 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
34b20 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
34b30 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
34b40 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73  ags = wctrlFlags
34b50 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  ;.  pWInfo->save
34b60 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50  dNQueryLoop = pP
34b70 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
34b80 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26  ;.  pMaskSet = &
34b90 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
34ba0 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20  ;.  sWLB.pWInfo 
34bb0 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42  = pWInfo;.  sWLB
34bc0 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  .pWC = &pWInfo->
34bd0 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77  sWC;.  sWLB.pNew
34be0 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28   = (WhereLoop*)(
34bf0 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b  ((char*)pWInfo)+
34c00 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61  nByteWInfo);.  a
34c10 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
34c20 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42  E_ALIGNMENT(sWLB
34c30 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72  .pNew) );.  wher
34c40 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70  eLoopInit(sWLB.p
34c50 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  New);.#ifdef SQL
34c60 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42  ITE_DEBUG.  sWLB
34c70 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27  .pNew->cId = '*'
34c80 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  ;.#endif..  /* S
34c90 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63  plit the WHERE c
34ca0 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72  lause into separ
34cb0 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  ate subexpressio
34cc0 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20  ns where each.  
34cd0 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
34ce0 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
34cf0 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
34d00 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73  ..  */.  initMas
34d10 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a  kSet(pMaskSet);.
34d20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
34d30 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  t(&pWInfo->sWC, 
34d40 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74  pWInfo);.  sqlit
34d50 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61  e3ExprCodeConsta
34d60 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57 68 65  nts(pParse, pWhe
34d70 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69  re);.  whereSpli
34d80 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  t(&pWInfo->sWC, 
34d90 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b  pWhere, TK_AND);
34da0 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  .  sqlite3CodeVe
34db0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
34dc0 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72  e, -1); /* Inser
34dd0 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72  t the cookie ver
34de0 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20  ifier Goto */.  
34df0 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20    .  /* Special 
34e00 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c  case: a WHERE cl
34e10 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e  ause that is con
34e20 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65  stant.  Evaluate
34e30 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73   the.  ** expres
34e40 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20  sion and either 
34e50 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66  jump over all of
34e60 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c   the code or fal
34e70 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69  l thru..  */.  i
34e80 66 28 20 70 57 68 65 72 65 20 26 26 20 28 6e 54  f( pWhere && (nT
34e90 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c  abList==0 || sql
34ea0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
34eb0 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72 65  ntNotJoin(pWhere
34ec0 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  )) ){.    sqlite
34ed0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
34ee0 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49  rse, pWhere, pWI
34ef0 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51 4c  nfo->iBreak, SQL
34f00 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
34f10 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b  .    pWhere = 0;
34f20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69  .  }..  /* Speci
34f30 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d  al case: No FROM
34f40 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69   clause.  */.  i
34f50 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29  f( nTabList==0 )
34f60 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  {.    if( pOrder
34f70 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 62 4f 42  By ) pWInfo->bOB
34f80 53 61 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Sat = 1;.    if(
34f90 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
34fa0 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
34fb0 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  T ){.      pWInf
34fc0 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
34fd0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
34fe0 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  IQUE;.    }.  }.
34ff0 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62  .  /* Assign a b
35000 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d  it from the bitm
35010 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72  ask to every ter
35020 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  m in the FROM cl
35030 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ause..  **.  ** 
35040 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62  When assigning b
35050 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f  itmask values to
35060 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72   FROM clause cur
35070 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65  sors, it must be
35080 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74  .  ** the case t
35090 68 61 74 20 69 66 20 58 20 69 73 20 74 68 65 20  hat if X is the 
350a0 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
350b0 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65  N-th FROM clause
350c0 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20   term then.  ** 
350d0 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
350e0 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  all FROM clause 
350f0 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66  terms to the lef
35100 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65  t of the N-th te
35110 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29  rm.  ** is (X-1)
35120 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f  .   An expressio
35130 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c  n from the ON cl
35140 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
35150 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a  OIN can use.  **
35160 20 69 74 73 20 45 78 70 72 2e 69 52 69 67 68 74   its Expr.iRight
35170 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20  JoinTable value 
35180 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d  to find the bitm
35190 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74  ask of the right
351a0 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74   table.  ** of t
351b0 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61  he join.  Subtra
351c0 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74  cting one from t
351d0 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 62  he right table b
351e0 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20  itmask gives a. 
351f0 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20   ** bitmask for 
35200 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
35210 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f  e left of the jo
35220 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65  in.  Knowing the
35230 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f   bitmask.  ** fo
35240 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
35250 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65  the left of a le
35260 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72  ft join is impor
35270 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33  tant.  Ticket #3
35280 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  015..  **.  ** N
35290 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b  ote that bitmask
352a0 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
352b0 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e  r all pTabList->
352c0 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20  nSrc tables in. 
352d0 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f   ** pTabList, no
352e0 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74  t just the first
352f0 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73   nTabList tables
35300 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e  .  nTabList is n
35310 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75  ormally.  ** equ
35320 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e  al to pTabList->
35330 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20 62  nSrc but might b
35340 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31  e shortened to 1
35350 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45   if the.  ** WHE
35360 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
35370 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20   flag is set..  
35380 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
35390 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
353a0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65  ; ii++){.    cre
353b0 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  ateMask(pMaskSet
353c0 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69  , pTabList->a[ii
353d0 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  ].iCursor);.  }.
353e0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
353f0 20 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74   {.    Bitmask t
35400 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20  oTheLeft = 0;.  
35410 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
35420 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
35430 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  i++){.      Bitm
35440 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28  ask m = getMask(
35450 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
35460 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f  st->a[ii].iCurso
35470 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
35480 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65  ( (m-1)==toTheLe
35490 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68  ft );.      toTh
354a0 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20  eLeft |= m;.    
354b0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
354c0 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f  /* Analyze all o
354d0 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  f the subexpress
354e0 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74  ions.  Note that
354f0 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d   exprAnalyze() m
35500 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65  ight.  ** add ne
35510 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20  w virtual terms 
35520 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
35530 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
35540 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a  .  We do not.  *
35550 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a  * want to analyz
35560 65 20 74 68 65 73 65 20 76 69 72 74 75 61 6c 20  e these virtual 
35570 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20  terms, so start 
35580 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65  analyzing at the
35590 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f   end.  ** and wo
355a0 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68  rk forward so th
355b0 61 74 20 74 68 65 20 61 64 64 65 64 20 76 69 72  at the added vir
355c0 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e  tual terms are n
355d0 65 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a  ever processed..
355e0 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79    */.  exprAnaly
355f0 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20  zeAll(pTabList, 
35600 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20  &pWInfo->sWC);. 
35610 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
35620 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
35630 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
35640 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  r;.  }..  /* If 
35650 74 68 65 20 4f 52 44 45 52 20 42 59 20 28 6f 72  the ORDER BY (or
35660 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61 75 73   GROUP BY) claus
35670 65 20 63 6f 6e 74 61 69 6e 73 20 72 65 66 65 72  e contains refer
35680 65 6e 63 65 73 20 74 6f 20 67 65 6e 65 72 61 6c  ences to general
35690 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
356a0 73 2c 20 74 68 65 6e 20 77 65 20 77 6f 6e 27 74  s, then we won't
356b0 20 62 65 20 61 62 6c 65 20 74 6f 20 73 61 74 69   be able to sati
356c0 73 66 79 20 69 74 20 75 73 69 6e 67 20 69 6e 64  sfy it using ind
356d0 69 63 65 73 2c 20 73 6f 0a 20 20 2a 2a 20 67 6f  ices, so.  ** go
356e0 20 61 68 65 61 64 20 61 6e 64 20 64 69 73 61 62   ahead and disab
356f0 6c 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  le it now..  */.
35700 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26    if( pOrderBy &
35710 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
35720 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
35730 4e 43 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 66  NCT)!=0 ){.    f
35740 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 64  or(ii=0; ii<pOrd
35750 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  erBy->nExpr; ii+
35760 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
35770 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
35780 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
35790 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 70  OrderBy->a[ii].p
357a0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
357b0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
357c0 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
357d0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
357e0 79 20 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 30  y = pOrderBy = 0
357f0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
35800 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
35810 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
35820 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  0 ){.        bre
35830 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
35840 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 63 74  }.  }..  if( wct
35850 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
35860 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
35870 0a 20 20 20 20 69 66 28 20 69 73 44 69 73 74 69  .    if( isDisti
35880 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61  nctRedundant(pPa
35890 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26  rse, pTabList, &
358a0 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65  pWInfo->sWC, pRe
358b0 73 75 6c 74 53 65 74 29 20 29 7b 0a 20 20 20 20  sultSet) ){.    
358c0 20 20 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43    /* The DISTINC
358d0 54 20 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69  T marking is poi
358e0 6e 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20  ntless.  Ignore 
358f0 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49  it. */.      pWI
35900 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
35910 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
35920 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73  UNIQUE;.    }els
35930 65 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d  e if( pOrderBy==
35940 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72  0 ){.      /* Tr
35950 79 20 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68  y to ORDER BY th
35960 65 20 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20  e result set to 
35970 6d 61 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72  make distinct pr
35980 6f 63 65 73 73 69 6e 67 20 65 61 73 69 65 72 20  ocessing easier 
35990 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  */.      pWInfo-
359a0 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57  >wctrlFlags |= W
359b0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b  HERE_DISTINCTBY;
359c0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70  .      pWInfo->p
359d0 4f 72 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c  OrderBy = pResul
359e0 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tSet;.    }.  }.
359f0 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
35a00 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
35a10 6a 65 63 74 73 20 2a 2f 0a 20 20 57 48 45 52 45  jects */.  WHERE
35a20 54 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a  TRACE(0xffff,("*
35a30 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61  ** Optimizer Sta
35a40 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 69  rt ***\n"));.  i
35a50 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c  f( nTabList!=1 |
35a60 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28  | whereShortCut(
35a70 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20  &sWLB)==0 ){.   
35a80 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
35a90 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20  ddAll(&sWLB);.  
35aa0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
35ab0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
35ac0 0a 20 20 0a 20 20 20 20 2f 2a 20 44 69 73 70 6c  .  .    /* Displ
35ad0 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68  ay all of the Wh
35ae0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
35af0 69 66 20 77 68 65 72 65 74 72 61 63 65 20 69 73  if wheretrace is
35b00 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 23 69 66 64   enabled */.#ifd
35b10 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
35b20 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71  ABLED.    if( sq
35b30 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
35b40 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f  ){.      WhereLo
35b50 6f 70 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74  op *p;.      int
35b60 20 69 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63   i;.      static
35b70 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d   char zLabel[] =
35b80 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64   "0123456789abcd
35b90 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
35ba0 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20  uvwyxz".        
35bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
35bd0 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
35be0 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20  QRSTUVWYXZ";.   
35bf0 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d     for(p=pWInfo-
35c00 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b  >pLoops, i=0; p;
35c10 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c   p=p->pNextLoop,
35c20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
35c30 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69  ->cId = zLabel[i
35c40 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d  %sizeof(zLabel)]
35c50 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
35c60 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 54 61 62  oopPrint(p, pTab
35c70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
35c80 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20     }.#endif.  . 
35c90 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76     wherePathSolv
35ca0 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20  er(pWInfo, 0);. 
35cb0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
35cc0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
35cd0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
35ce0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
35cf0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
35d00 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76     wherePathSolv
35d10 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  er(pWInfo, pWInf
35d20 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20  o->nRowOut+1);. 
35d30 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
35d40 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
35d50 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
35d60 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  r;.    }.  }.  i
35d70 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
35d80 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66  rBy==0 && (db->f
35d90 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
35da0 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30 20 29  verseOrder)!=0 )
35db0 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72  {.     pWInfo->r
35dc0 65 76 4d 61 73 6b 20 3d 20 28 42 69 74 6d 61 73  evMask = (Bitmas
35dd0 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 69 66  k)(-1);.  }.  if
35de0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
35df0 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c  | NEVER(db->mall
35e00 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20  ocFailed) ){.   
35e10 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
35e20 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65  Error;.  }.#ifde
35e30 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
35e40 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
35e50 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a  e3WhereTrace ){.
35e60 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
35e70 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
35e80 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f  tf("---- Solutio
35e90 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e  n nRow=%d", pWIn
35ea0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20  fo->nRowOut);.  
35eb0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 62 4f    if( pWInfo->bO
35ec0 42 53 61 74 20 29 7b 0a 20 20 20 20 20 20 73 71  BSat ){.      sq
35ed0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
35ee0 28 22 20 4f 52 44 45 52 42 59 3d 30 78 25 6c 6c  (" ORDERBY=0x%ll
35ef0 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d  x", pWInfo->revM
35f00 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ask);.    }.    
35f10 73 77 69 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e  switch( pWInfo->
35f20 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  eDistinct ){.   
35f30 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
35f40 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b  STINCT_UNIQUE: {
35f50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35f60 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44  DebugPrintf("  D
35f70 49 53 54 49 4e 43 54 3d 75 6e 69 71 75 65 22 29  ISTINCT=unique")
35f80 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
35f90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
35fa0 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
35fb0 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  CT_ORDERED: {.  
35fc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
35fd0 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54  ugPrintf("  DIST
35fe0 49 4e 43 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a  INCT=ordered");.
35ff0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
36000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
36010 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
36020 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  _UNORDERED: {.  
36030 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
36040 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54  ugPrintf("  DIST
36050 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64 22 29  INCT=unordered")
36060 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
36070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
36080 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
36090 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
360a0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57   for(ii=0; ii<pW
360b0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69  Info->nLevel; ii
360c0 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  ++){.      where
360d0 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e 66 6f  LoopPrint(pWInfo
360e0 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20  ->a[ii].pWLoop, 
360f0 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d  pTabList);.    }
36100 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  .  }.#endif.  /*
36110 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74   Attempt to omit
36120 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74 68 65   tables from the
36130 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f   join that do no
36140 74 20 65 66 66 65 63 74 20 74 68 65 20 72 65 73  t effect the res
36150 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20 70 57 49  ult */.  if( pWI
36160 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20  nfo->nLevel>=2. 
36170 20 20 26 26 20 70 52 65 73 75 6c 74 53 65 74 21    && pResultSet!
36180 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  =0.   && Optimiz
36190 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
361a0 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70   SQLITE_OmitNoop
361b0 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 42  Join).  ){.    B
361c0 69 74 6d 61 73 6b 20 74 61 62 55 73 65 64 20 3d  itmask tabUsed =
361d0 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
361e0 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
361f0 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69  esultSet);.    i
36200 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 74 61  f( pOrderBy ) ta
36210 62 55 73 65 64 20 7c 3d 20 65 78 70 72 4c 69 73  bUsed |= exprLis
36220 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
36230 6b 53 65 74 2c 20 70 4f 72 64 65 72 42 79 29 3b  kSet, pOrderBy);
36240 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e  .    while( pWIn
36250 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b  fo->nLevel>=2 ){
36260 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
36270 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a   *pTerm, *pEnd;.
36280 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57        pLoop = pW
36290 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e  Info->a[pWInfo->
362a0 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70  nLevel-1].pWLoop
362b0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 57 49  ;.      if( (pWI
362c0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
362d0 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 6a 6f  [pLoop->iTab].jo
362e0 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
362f0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
36300 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
36310 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
36320 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20  _DISTINCT)==0.  
36330 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e       && (pLoop->
36340 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
36350 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20  ONEROW)==0.     
36360 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
36370 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
36380 20 69 66 28 20 28 74 61 62 55 73 65 64 20 26 20   if( (tabUsed & 
36390 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
363a0 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
363b0 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70     pEnd = sWLB.p
363c0 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43  WC->a + sWLB.pWC
363d0 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66  ->nTerm;.      f
363e0 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57  or(pTerm=sWLB.pW
363f0 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64  C->a; pTerm<pEnd
36400 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
36410 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
36420 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f  prereqAll & pLoo
36430 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a  p->maskSelf)!=0.
36440 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70           && !Exp
36450 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
36460 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
36470 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20  omJoin).        
36480 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
36490 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
364a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
364b0 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72 65  pTerm<pEnd ) bre
364c0 61 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  ak;.      WHERET
364d0 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d  RACE(0xffff, ("-
364e0 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e  > drop loop %c n
364f0 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f  ot used\n", pLoo
36500 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20  p->cId));.      
36510 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d  pWInfo->nLevel--
36520 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74  ;.      nTabList
36530 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
36540 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
36550 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  f,("*** Optimize
36560 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e  r Finished ***\n
36570 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  "));.  pWInfo->p
36580 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
36590 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  p += pWInfo->nRo
365a0 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  wOut;..  /* If t
365b0 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20  he caller is an 
365c0 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
365d0 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
365e0 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20  is requesting.  
365f0 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d  ** to use a one-
36600 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20  pass algorithm, 
36610 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69  determine if thi
36620 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  s is appropriate
36630 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70  ..  ** The one-p
36640 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e  ass algorithm on
36650 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20  ly works if the 
36660 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
36670 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68  straints.  ** th
36680 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75  e statement to u
36690 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72  pdate a single r
366a0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ow..  */.  asser
366b0 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  t( (wctrlFlags &
366c0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
366d0 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57  ESIRED)==0 || pW
366e0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20  Info->nLevel==1 
366f0 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46  );.  if( (wctrlF
36700 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
36710 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30  PASS_DESIRED)!=0
36720 20 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d   .   && (pWInfo-
36730 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73  >a[0].pWLoop->ws
36740 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
36750 45 52 4f 57 29 21 3d 30 20 29 7b 0a 20 20 20 20  EROW)!=0 ){.    
36760 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
36770 73 20 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66  s = 1;.    pWInf
36780 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e  o->a[0].pWLoop->
36790 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52  wsFlags &= ~WHER
367a0 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_IDX_ONLY;.  }.
367b0 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74  .  /* Open all t
367c0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61  ables in the pTa
367d0 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e  bList and any in
367e0 64 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66  dices selected f
367f0 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e  or.  ** searchin
36800 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a  g those tables..
36810 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20    */.  notReady 
36820 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
36830 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65   for(ii=0, pLeve
36840 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c  l=pWInfo->a; ii<
36850 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20  nTabList; ii++, 
36860 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54  pLevel++){.    T
36870 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
36880 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e  /* Table to open
36890 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b   */.    int iDb;
368a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
368b0 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f  x of database co
368c0 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69  ntaining table/i
368d0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75  ndex */.    stru
368e0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
368f0 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20  *pTabItem;..    
36900 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
36910 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
36920 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62  iFrom];.    pTab
36930 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
36940 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  b;.    iDb = sql
36950 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
36960 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
36970 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  ema);.    pLoop 
36980 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
36990 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  ;.    if( (pTab-
369a0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
369b0 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20  phemeral)!=0 || 
369c0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
369d0 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
369e0 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  hing */.    }els
369f0 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  e.#ifndef SQLITE
36a00 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
36a10 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  LE.    if( (pLoo
36a20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
36a30 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
36a40 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  !=0 ){.      con
36a50 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d  st char *pVTab =
36a60 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
36a70 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28  qlite3GetVTable(
36a80 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  db, pTab);.     
36a90 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62   int iCur = pTab
36aa0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
36ab0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36ac0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70  AddOp4(v, OP_VOp
36ad0 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20  en, iCur, 0, 0, 
36ae0 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b  pVTab, P4_VTAB);
36af0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49  .    }else if( I
36b00 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
36b10 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20  {.      /* noop 
36b20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  */.    }else.#en
36b30 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  dif.    if( (pLo
36b40 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
36b50 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
36b60 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63  .         && (wc
36b70 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
36b80 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45  _OMIT_OPEN_CLOSE
36b90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
36ba0 74 20 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f  t op = pWInfo->o
36bb0 6b 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70  kOnePass ? OP_Op
36bc0 65 6e 57 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65  enWrite : OP_Ope
36bd0 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 73 71 6c  nRead;.      sql
36be0 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
36bf0 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  arse, pTabItem->
36c00 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54  iCursor, iDb, pT
36c10 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 74  ab, op);.      t
36c20 65 73 74 63 61 73 65 28 20 21 70 57 49 6e 66 6f  estcase( !pWInfo
36c30 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70  ->okOnePass && p
36c40 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31  Tab->nCol==BMS-1
36c50 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
36c60 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  se( !pWInfo->okO
36c70 6e 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e  nePass && pTab->
36c80 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  nCol==BMS );.   
36c90 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e     if( !pWInfo->
36ca0 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61  okOnePass && pTa
36cb0 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20  b->nCol<BMS ){. 
36cc0 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62         Bitmask b
36cd0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c   = pTabItem->col
36ce0 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  Used;.        in
36cf0 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t n = 0;.       
36d00 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31   for(; b; b=b>>1
36d10 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  , n++){}.       
36d20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
36d30 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33 56  geP4(v, sqlite3V
36d40 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
36d50 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20  )-1, .          
36d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d70 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f    SQLITE_INT_TO_
36d80 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32  PTR(n), P4_INT32
36d90 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
36da0 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c  t( n<=pTab->nCol
36db0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
36dc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
36dd0 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
36de0 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
36df0 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
36e00 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69  zName);.    }.#i
36e10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
36e20 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
36e30 58 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  X.    if( (pLoop
36e40 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
36e50 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
36e60 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72   ){.      constr
36e70 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  uctAutomaticInde
36e80 78 28 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66  x(pParse, &pWInf
36e90 6f 2d 3e 73 57 43 2c 20 70 54 61 62 49 74 65 6d  o->sWC, pTabItem
36ea0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76  , notReady, pLev
36eb0 65 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  el);.    }else.#
36ec0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 4c  endif.    if( pL
36ed0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
36ee0 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a  HERE_INDEXED ){.
36ef0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78        Index *pIx
36f00 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
36f10 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  e.pIndex;.      
36f20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20  KeyInfo *pKey = 
36f30 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
36f40 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29  nfo(pParse, pIx)
36f50 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 4d 45  ;.      /* FIXME
36f60 3a 20 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a  :  As an optimiz
36f70 61 74 69 6f 6e 20 75 73 65 20 70 54 61 62 49 74  ation use pTabIt
36f80 65 6d 2d 3e 69 43 75 72 73 6f 72 20 69 66 20 57  em->iCursor if W
36f90 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 2a 2f  HERE_IDX_ONLY */
36fa0 0a 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64 65  .      int iInde
36fb0 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
36fc0 49 64 78 43 75 72 20 3d 20 69 49 64 78 43 75 72  IdxCur = iIdxCur
36fd0 20 3f 20 69 49 64 78 43 75 72 20 3a 20 70 50 61   ? iIdxCur : pPa
36fe0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
36ff0 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e     assert( pIx->
37000 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
37010 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
37020 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 43 75  assert( iIndexCu
37030 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  r>=0 );.      sq
37040 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
37050 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
37060 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e  iIndexCur, pIx->
37070 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20  tnum, iDb,.     
37080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37090 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20     (char*)pKey, 
370a0 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
370b0 46 46 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  FF);.      VdbeC
370c0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
370d0 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20   pIx->zName));. 
370e0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
370f0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
37100 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
37110 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e     notReady &= ~
37120 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
37130 3e 73 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49  >sMaskSet, pTabI
37140 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
37150 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f   }.  pWInfo->iTo
37160 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
37170 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
37180 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
37190 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
371a0 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20  reBeginError;.. 
371b0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
371c0 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20   code to do the 
371d0 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69 74  search.  Each it
371e0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  eration of the f
371f0 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c  or.  ** loop bel
37200 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ow generates cod
37210 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e  e for a single n
37220 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68  ested loop of th
37230 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61  e VM.  ** progra
37240 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61  m..  */.  notRea
37250 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  dy = ~(Bitmask)0
37260 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
37270 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29  <nTabList; ii++)
37280 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  {.    pLevel = &
37290 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20  pWInfo->a[ii];. 
372a0 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61     explainOneSca
372b0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
372c0 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c 20  st, pLevel, ii, 
372d0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77  pLevel->iFrom, w
372e0 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20  ctrlFlags);.    
372f0 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f 64 65 4f  notReady = codeO
37300 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e  neLoopStart(pWIn
37310 66 6f 2c 20 69 69 2c 20 6e 6f 74 52 65 61 64 79  fo, ii, notReady
37320 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69  );.    pWInfo->i
37330 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65  Continue = pLeve
37340 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 7d  l->addrCont;.  }
37350 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a  ..  /* Done. */.
37360 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b    return pWInfo;
37370 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
37380 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
37390 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72   */.whereBeginEr
373a0 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66  ror:.  if( pWInf
373b0 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  o ){.    pParse-
373c0 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
373d0 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
373e0 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65  yLoop;.    where
373f0 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
37400 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nfo);.  }.  retu
37410 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
37420 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20  enerate the end 
37430 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f  of the WHERE loo
37440 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  p.  See comments
37450 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57   on .** sqlite3W
37460 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20  hereBegin() for 
37470 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
37480 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  mation..*/.void 
37490 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
374a0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
374b0 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  o){.  Parse *pPa
374c0 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
374d0 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20  arse;.  Vdbe *v 
374e0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
374f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
37500 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a  eLevel *pLevel;.
37510 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
37520 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  op;.  SrcList *p
37530 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
37540 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71  ->pTabList;.  sq
37550 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
37560 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65  se->db;..  /* Ge
37570 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d  nerate loop term
37580 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20  ination code..  
37590 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
375a0 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
375b0 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e  e);.  for(i=pWIn
375c0 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e  fo->nLevel-1; i>
375d0 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c  =0; i--){.    pL
375e0 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
375f0 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  a[i];.    pLoop 
37600 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
37610 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
37620 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
37630 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
37640 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  t);.    if( pLev
37650 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  el->op!=OP_Noop 
37660 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
37670 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c  VdbeAddOp2(v, pL
37680 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c  evel->op, pLevel
37690 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  ->p1, pLevel->p2
376a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
376b0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
376c0 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20  pLevel->p5);.   
376d0 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70   }.    if( pLoop
376e0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
376f0 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65  E_IN_ABLE && pLe
37700 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20  vel->u.in.nIn>0 
37710 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
37720 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20  InLoop *pIn;.   
37730 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
37740 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
37750 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
37760 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  l->addrNxt);.   
37770 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d     for(j=pLevel-
37780 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26  >u.in.nIn, pIn=&
37790 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
377a0 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20  Loop[j-1]; j>0; 
377b0 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20  j--, pIn--){.   
377c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
377d0 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d  JumpHere(v, pIn-
377e0 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20  >addrInTop+1);. 
377f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
37800 62 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d  beAddOp2(v, pIn-
37810 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e  >eEndLoopOp, pIn
37820 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64  ->iCur, pIn->add
37830 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20  rInTop);.       
37840 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
37850 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64  Here(v, pIn->add
37860 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20  rInTop-1);.     
37870 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
37880 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65  DbFree(db, pLeve
37890 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29  l->u.in.aInLoop)
378a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
378b0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
378c0 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
378d0 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28  ddrBrk);.    if(
378e0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
378f0 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  in ){.      int 
37900 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72  addr;.      addr
37910 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
37920 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
37930 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
37940 6f 69 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65  oin);.      asse
37950 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
37960 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
37970 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20  ONLY)==0.       
37980 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77      || (pLoop->w
37990 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
379a0 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20  NDEXED)!=0 );.  
379b0 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
379c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
379d0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
379e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
379f0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
37a00 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73  NullRow, pTabLis
37a10 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
37a20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
37a30 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
37a40 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
37a50 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ED ){.        sq
37a60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
37a70 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70  v, OP_NullRow, p
37a80 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b  Level->iIdxCur);
37a90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
37aa0 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  f( pLevel->op==O
37ab0 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20  P_Return ){.    
37ac0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
37ad0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
37ae0 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70  b, pLevel->p1, p
37af0 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74  Level->addrFirst
37b00 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
37b10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
37b20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
37b30 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  Goto, 0, pLevel-
37b40 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20  >addrFirst);.   
37b50 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
37b60 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
37b70 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20  , addr);.    }. 
37b80 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72   }..  /* The "br
37b90 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65  eak" point is he
37ba0 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68  re, just past th
37bb0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74  e end of the out
37bc0 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65  er loop..  ** Se
37bd0 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  t it..  */.  sql
37be0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
37bf0 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e  abel(v, pWInfo->
37c00 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43  iBreak);..  /* C
37c10 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  lose all of the 
37c20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 72  cursors that wer
37c30 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69  e opened by sqli
37c40 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20  te3WhereBegin.. 
37c50 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 57   */.  assert( pW
37c60 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54  Info->nLevel<=pT
37c70 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
37c80 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
37c90 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
37ca0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
37cb0 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
37cc0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
37cd0 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53   0;.    struct S
37ce0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
37cf0 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
37d00 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
37d10 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  om];.    Table *
37d20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
37d30 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72  >pTab;.    asser
37d40 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
37d50 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
37d60 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66  ->pWLoop;.    if
37d70 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
37d80 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
37d90 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 54 61  )==0.     && pTa
37da0 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20  b->pSelect==0.  
37db0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
37dc0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
37dd0 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53  E_OMIT_OPEN_CLOS
37de0 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  E)==0.    ){.   
37df0 20 20 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f     int ws = pLoo
37e00 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  p->wsFlags;.    
37e10 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f    if( !pWInfo->o
37e20 6b 4f 6e 65 50 61 73 73 20 26 26 20 28 77 73 20  kOnePass && (ws 
37e30 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
37e40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
37e50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
37e60 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  1(v, OP_Close, p
37e70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
37e80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
37e90 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52 45   if( (ws & WHERE
37ea0 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26 20  _INDEXED)!=0 && 
37eb0 28 77 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b  (ws & (WHERE_IPK
37ec0 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45  |WHERE_AUTO_INDE
37ed0 58 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  X))==0 ){.      
37ee0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
37ef0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
37f00 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
37f10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
37f20 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
37f30 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e   scan uses an in
37f40 64 65 78 2c 20 6d 61 6b 65 20 56 44 42 45 20 63  dex, make VDBE c
37f50 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ode substitution
37f60 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20  s to read data. 
37f70 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69     ** from the i
37f80 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20  ndex instead of 
37f90 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 77  from the table w
37fa0 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 20 20  here possible.  
37fb0 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a 20 20  In some cases.  
37fc0 20 20 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d 69    ** this optimi
37fd0 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e 74 73 20  zation prevents 
37fe0 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 65  the table from e
37ff0 76 65 72 20 62 65 69 6e 67 20 72 65 61 64 2c 20  ver being read, 
38000 77 68 69 63 68 20 63 61 6e 0a 20 20 20 20 2a 2a  which can.    **
38010 20 79 69 65 6c 64 20 61 20 73 69 67 6e 69 66 69   yield a signifi
38020 63 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63 65  cant performance
38030 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20 0a   boost..    ** .
38040 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20      ** Calls to 
38050 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
38060 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71  or in between sq
38070 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20  lite3WhereBegin 
38080 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  and.    ** sqlit
38090 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20  e3WhereEnd will 
380a0 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64  have created cod
380b0 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  e that reference
380c0 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  s the table.    
380d0 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ** directly.  Th
380e0 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c  is loop scans al
380f0 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b  l that code look
38100 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a  ing for opcodes.
38110 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65      ** that refe
38120 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20  rence the table 
38130 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65  and converts the
38140 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74  m into opcodes t
38150 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  hat.    ** refer
38160 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a  ence the index..
38170 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
38180 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
38190 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57  (WHERE_INDEXED|W
381a0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29  HERE_IDX_ONLY) )
381b0 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70  {.      pIdx = p
381c0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
381d0 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ndex;.    }else 
381e0 69 66 28