/ Hex Artifact Content
Login

Artifact a9ec7caba7697f152bd34853b98500dd54c4b240:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 4b 2c 58  e WHERETRACE(K,X
0430: 29 20 20 69 66 28 73 71 6c 69 74 65 33 57 68 65  )  if(sqlite3Whe
0440: 72 65 54 72 61 63 65 26 28 4b 29 29 20 73 71 6c  reTrace&(K)) sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
0460: 58 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  X.# define WHERE
0470: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 31 0a  TRACE_ENABLED 1.
0480: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 57  #else.# define W
0490: 48 45 52 45 54 52 41 43 45 28 4b 2c 58 29 0a 23  HERETRACE(K,X).#
04a0: 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72  endif../* Forwar
04b0: 64 20 72 65 66 65 72 65 6e 63 65 73 0a 2a 2f 0a  d references.*/.
04c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
04d0: 68 65 72 65 43 6c 61 75 73 65 20 57 68 65 72 65  hereClause Where
04e0: 43 6c 61 75 73 65 3b 0a 74 79 70 65 64 65 66 20  Clause;.typedef 
04f0: 73 74 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b  struct WhereMask
0500: 53 65 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74  Set WhereMaskSet
0510: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
0520: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 57 68 65   WhereOrInfo Whe
0530: 72 65 4f 72 49 6e 66 6f 3b 0a 74 79 70 65 64 65  reOrInfo;.typede
0540: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 41 6e  f struct WhereAn
0550: 64 49 6e 66 6f 20 57 68 65 72 65 41 6e 64 49 6e  dInfo WhereAndIn
0560: 66 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  fo;.typedef stru
0570: 63 74 20 57 68 65 72 65 4c 65 76 65 6c 20 57 68  ct WhereLevel Wh
0580: 65 72 65 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65  ereLevel;.typede
0590: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f  f struct WhereLo
05a0: 6f 70 20 57 68 65 72 65 4c 6f 6f 70 3b 0a 74 79  op WhereLoop;.ty
05b0: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
05c0: 72 65 50 61 74 68 20 57 68 65 72 65 50 61 74 68  rePath WherePath
05d0: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
05e0: 20 57 68 65 72 65 54 65 72 6d 20 57 68 65 72 65   WhereTerm Where
05f0: 54 65 72 6d 3b 0a 74 79 70 65 64 65 66 20 73 74  Term;.typedef st
0600: 72 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 42 75  ruct WhereLoopBu
0610: 69 6c 64 65 72 20 57 68 65 72 65 4c 6f 6f 70 42  ilder WhereLoopB
0620: 75 69 6c 64 65 72 3b 0a 74 79 70 65 64 65 66 20  uilder;.typedef 
0630: 73 74 72 75 63 74 20 57 68 65 72 65 53 63 61 6e  struct WhereScan
0640: 20 57 68 65 72 65 53 63 61 6e 3b 0a 74 79 70 65   WhereScan;.type
0650: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
0660: 4f 72 43 6f 73 74 20 57 68 65 72 65 4f 72 43 6f  OrCost WhereOrCo
0670: 73 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  st;.typedef stru
0680: 63 74 20 57 68 65 72 65 4f 72 53 65 74 20 57 68  ct WhereOrSet Wh
0690: 65 72 65 4f 72 53 65 74 3b 0a 0a 2f 2a 0a 2a 2a  ereOrSet;../*.**
06a0: 20 43 6f 73 74 20 58 20 69 73 20 74 72 61 63 6b   Cost X is track
06b0: 65 64 20 61 73 20 31 30 2a 6c 6f 67 32 28 58 29  ed as 10*log2(X)
06c0: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 31 36 2d   stored in a 16-
06d0: 62 69 74 20 69 6e 74 65 67 65 72 2e 20 20 54 68  bit integer.  Th
06e0: 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 63 6f 73  e.** maximum cos
06f0: 74 20 66 6f 72 20 6f 72 64 69 6e 61 72 79 20 74  t for ordinary t
0700: 61 62 6c 65 73 20 69 73 20 36 34 2a 28 32 2a 2a  ables is 64*(2**
0710: 36 33 29 20 77 68 69 63 68 20 62 65 63 6f 6d 65  63) which become
0720: 73 20 36 39 30 30 2e 0a 2a 2a 20 28 56 69 72 74  s 6900..** (Virt
0730: 75 61 6c 20 74 61 62 6c 65 73 20 63 61 6e 20 72  ual tables can r
0740: 65 74 75 72 6e 20 61 20 6c 61 72 67 65 72 20 63  eturn a larger c
0750: 6f 73 74 2c 20 62 75 74 20 6c 65 74 27 73 20 61  ost, but let's a
0760: 73 73 75 6d 65 20 74 68 65 79 20 64 6f 20 6e 6f  ssume they do no
0770: 74 2e 29 0a 2a 2a 20 53 6f 20 61 6c 6c 20 63 6f  t.).** So all co
0780: 73 74 73 20 63 61 6e 20 62 65 20 73 74 6f 72 65  sts can be store
0790: 64 20 69 6e 20 61 20 31 36 2d 62 69 74 20 75 6e  d in a 16-bit un
07a0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 77  signed integer w
07b0: 69 74 68 6f 75 74 20 72 69 73 6b 0a 2a 2a 20 6f  ithout risk.** o
07c0: 66 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2a 0a 2a  f overflow..**.*
07d0: 2a 20 43 6f 73 74 73 20 61 72 65 20 65 73 74 69  * Costs are esti
07e0: 6d 61 74 65 73 2c 20 73 6f 20 6e 6f 20 65 66 66  mates, so no eff
07f0: 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  ort is made to c
0800: 6f 6d 70 75 74 65 20 31 30 2a 6c 6f 67 32 28 58  ompute 10*log2(X
0810: 29 20 65 78 61 63 74 6c 79 2e 0a 2a 2a 20 49 6e  ) exactly..** In
0820: 73 74 65 61 64 2c 20 61 20 63 6c 6f 73 65 20 65  stead, a close e
0830: 73 74 69 6d 61 74 65 20 69 73 20 75 73 65 64 2e  stimate is used.
0840: 20 20 41 6e 79 20 76 61 6c 75 65 20 6f 66 20 58    Any value of X
0850: 3c 3d 31 20 69 73 20 73 74 6f 72 65 64 20 61 73  <=1 is stored as
0860: 20 30 2e 0a 2a 2a 20 58 3d 32 20 69 73 20 31 30   0..** X=2 is 10
0870: 2e 20 20 58 3d 33 20 69 73 20 31 36 2e 20 20 58  .  X=3 is 16.  X
0880: 3d 31 30 30 30 20 69 73 20 39 39 2e 20 65 74 63  =1000 is 99. etc
0890: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 6f 6f 6c  ..**.** The tool
08a0: 2f 77 68 65 72 65 63 6f 73 74 74 65 73 74 2e 63  /wherecosttest.c
08b0: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 69 6d 70   source file imp
08c0: 6c 65 6d 65 6e 74 73 20 61 20 63 6f 6d 6d 61 6e  lements a comman
08d0: 64 2d 6c 69 6e 65 20 70 72 6f 67 72 61 6d 0a 2a  d-line program.*
08e0: 2a 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 6e 76  * that will conv
08f0: 65 72 74 20 57 68 65 72 65 43 6f 73 74 73 20 74  ert WhereCosts t
0900: 6f 20 69 6e 74 65 67 65 72 73 2c 20 63 6f 6e 76  o integers, conv
0910: 65 72 74 20 69 6e 74 65 67 65 72 73 20 74 6f 20  ert integers to 
0920: 57 68 65 72 65 43 6f 73 74 73 0a 2a 2a 20 61 6e  WhereCosts.** an
0930: 64 20 64 6f 20 61 64 64 69 74 69 6f 6e 20 61 6e  d do addition an
0940: 64 20 6d 75 6c 74 69 70 6c 69 63 61 74 69 6f 6e  d multiplication
0950: 20 6f 6e 20 57 68 65 72 65 43 6f 73 74 20 76 61   on WhereCost va
0960: 6c 75 65 73 2e 20 20 54 68 65 20 77 68 65 72 65  lues.  The where
0970: 63 6f 73 74 74 65 73 74 0a 2a 2a 20 63 6f 6d 6d  costtest.** comm
0980: 61 6e 64 2d 6c 69 6e 65 20 70 72 6f 67 72 61 6d  and-line program
0990: 20 69 73 20 61 20 75 73 65 66 75 6c 20 75 74 69   is a useful uti
09a0: 6c 69 74 79 20 74 6f 20 68 61 76 65 20 61 72 6f  lity to have aro
09b0: 75 6e 64 20 77 68 65 6e 20 77 6f 72 6b 69 6e 67  und when working
09c0: 20 77 69 74 68 0a 2a 2a 20 74 68 69 73 20 6d 6f   with.** this mo
09d0: 64 75 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  dule..*/.typedef
09e0: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
09f0: 69 6e 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a  int WhereCost;..
0a00: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6f 62 6a 65 63  /*.** This objec
0a10: 74 20 63 6f 6e 74 61 69 6e 73 20 69 6e 66 6f 72  t contains infor
0a20: 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f  mation needed to
0a30: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 73 69 6e   implement a sin
0a40: 67 6c 65 20 6e 65 73 74 65 64 0a 2a 2a 20 6c 6f  gle nested.** lo
0a50: 6f 70 20 69 6e 20 57 48 45 52 45 20 63 6c 61 75  op in WHERE clau
0a60: 73 65 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 74 72 61  se..**.** Contra
0a70: 73 74 20 74 68 69 73 20 6f 62 6a 65 63 74 20 77  st this object w
0a80: 69 74 68 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20  ith WhereLoop.  
0a90: 54 68 69 73 20 6f 62 6a 65 63 74 20 64 65 73 63  This object desc
0aa0: 72 69 62 65 73 20 74 68 65 0a 2a 2a 20 69 6d 70  ribes the.** imp
0ab0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ac0: 68 65 20 6c 6f 6f 70 2e 20 20 57 68 65 72 65 4c  he loop.  WhereL
0ad0: 6f 6f 70 20 64 65 73 63 72 69 62 65 73 20 74 68  oop describes th
0ae0: 65 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2a 20  e algorithm..** 
0af0: 54 68 69 73 20 6f 62 6a 65 63 74 20 63 6f 6e 74  This object cont
0b00: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
0b10: 6f 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  o the WhereLoop 
0b20: 61 6c 67 6f 72 69 74 68 6d 20 61 73 20 6f 6e 65  algorithm as one
0b30: 20 6f 66 0a 2a 2a 20 69 74 73 20 65 6c 65 6d 65   of.** its eleme
0b40: 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 57  nts..**.** The W
0b50: 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  hereInfo object 
0b60: 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c  contains a singl
0b70: 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
0b80: 69 73 20 6f 62 6a 65 63 74 20 66 6f 72 0a 2a 2a  is object for.**
0b90: 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68   each term in th
0ba0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 28 77  e FROM clause (w
0bb0: 68 69 63 68 20 69 73 20 74 6f 20 73 61 79 2c 20  hich is to say, 
0bc0: 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a  for each of the.
0bd0: 2a 2a 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  ** nested loops 
0be0: 61 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 29 2e  as implemented).
0bf0: 20 20 54 68 65 20 6f 72 64 65 72 20 6f 66 20 57    The order of W
0c00: 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74  hereLevel object
0c10: 73 20 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20  s determines.** 
0c20: 74 68 65 20 6c 6f 6f 70 20 6e 65 73 74 65 64 20  the loop nested 
0c30: 6f 72 64 65 72 2c 20 77 69 74 68 20 57 68 65 72  order, with Wher
0c40: 65 49 6e 66 6f 2e 61 5b 30 5d 20 62 65 69 6e 67  eInfo.a[0] being
0c50: 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20   the outer loop 
0c60: 61 6e 64 0a 2a 2a 20 57 68 65 72 65 49 6e 66 6f  and.** WhereInfo
0c70: 2e 61 5b 57 68 65 72 65 49 6e 66 6f 2e 6e 4c 65  .a[WhereInfo.nLe
0c80: 76 65 6c 2d 31 5d 20 62 65 69 6e 67 20 74 68 65  vel-1] being the
0c90: 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 0a 2a 2f 0a   inner loop..*/.
0ca0: 73 74 72 75 63 74 20 57 68 65 72 65 4c 65 76 65  struct WhereLeve
0cb0: 6c 20 7b 0a 20 20 69 6e 74 20 69 4c 65 66 74 4a  l {.  int iLeftJ
0cc0: 6f 69 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  oin;        /* M
0cd0: 65 6d 6f 72 79 20 63 65 6c 6c 20 75 73 65 64 20  emory cell used 
0ce0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 45 46  to implement LEF
0cf0: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 2a 2f 0a  T OUTER JOIN */.
0d00: 20 20 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20    int iTabCur;  
0d10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
0d20: 44 42 45 20 63 75 72 73 6f 72 20 75 73 65 64 20  DBE cursor used 
0d30: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 74 61  to access the ta
0d40: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ble */.  int iId
0d50: 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 2f  xCur;          /
0d60: 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
0d70: 72 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  r used to access
0d80: 20 70 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 61   pIdx */.  int a
0d90: 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20  ddrBrk;         
0da0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
0db0: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
0dc0: 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  e loop */.  int 
0dd0: 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20  addrNxt;        
0de0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
0df0: 6f 20 73 74 61 72 74 20 74 68 65 20 6e 65 78 74  o start the next
0e00: 20 49 4e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20   IN combination 
0e10: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
0e20: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t;         /* Ju
0e30: 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
0e40: 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
0e50: 74 20 6c 6f 6f 70 20 63 79 63 6c 65 20 2a 2f 0a  t loop cycle */.
0e60: 20 20 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b    int addrFirst;
0e70: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
0e80: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20   instruction of 
0e90: 69 6e 74 65 72 69 6f 72 20 6f 66 20 74 68 65 20  interior of the 
0ea0: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
0eb0: 64 72 42 6f 64 79 3b 20 20 20 20 20 20 20 20 20  drBody;         
0ec0: 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20  /* Beginning of 
0ed0: 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 69 73  the body of this
0ee0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75 38 20 69 46   loop */.  u8 iF
0ef0: 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  rom;            
0f00: 20 2f 2a 20 57 68 69 63 68 20 65 6e 74 72 79 20   /* Which entry 
0f10: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
0f20: 73 65 20 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 70  se */.  u8 op, p
0f30: 35 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  5;            /*
0f40: 20 4f 70 63 6f 64 65 20 61 6e 64 20 50 35 20 6f   Opcode and P5 o
0f50: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 74 68 61  f the opcode tha
0f60: 74 20 65 6e 64 73 20 74 68 65 20 6c 6f 6f 70 20  t ends the loop 
0f70: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 70 32 3b  */.  int p1, p2;
0f80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
0f90: 65 72 61 6e 64 73 20 6f 66 20 74 68 65 20 6f 70  erands of the op
0fa0: 63 6f 64 65 20 75 73 65 64 20 74 6f 20 65 6e 64  code used to end
0fb0: 73 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  s the loop */.  
0fc0: 75 6e 69 6f 6e 20 7b 20 20 20 20 20 20 20 20 20  union {         
0fd0: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
0fe0: 74 69 6f 6e 20 74 68 61 74 20 64 65 70 65 6e 64  tion that depend
0ff0: 73 20 6f 6e 20 70 57 4c 6f 6f 70 2d 3e 77 73 46  s on pWLoop->wsF
1000: 6c 61 67 73 20 2a 2f 0a 20 20 20 20 73 74 72 75  lags */.    stru
1010: 63 74 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ct {.      int n
1020: 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  In;             
1030: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
1040: 74 72 69 65 73 20 69 6e 20 61 49 6e 4c 6f 6f 70  tries in aInLoop
1050: 5b 5d 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  [] */.      stru
1060: 63 74 20 49 6e 4c 6f 6f 70 20 7b 0a 20 20 20 20  ct InLoop {.    
1070: 20 20 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20      int iCur;   
1080: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1090: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 75 73  e VDBE cursor us
10a0: 65 64 20 62 79 20 74 68 69 73 20 49 4e 20 6f 70  ed by this IN op
10b0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
10c0: 20 20 69 6e 74 20 61 64 64 72 49 6e 54 6f 70 3b    int addrInTop;
10d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
10e0: 6f 66 20 74 68 65 20 49 4e 20 6c 6f 6f 70 20 2a  of the IN loop *
10f0: 2f 0a 20 20 20 20 20 20 20 20 75 38 20 65 45 6e  /.        u8 eEn
1100: 64 4c 6f 6f 70 4f 70 3b 20 20 20 20 20 20 20 20  dLoopOp;        
1110: 20 2f 2a 20 49 4e 20 4c 6f 6f 70 20 74 65 72 6d   /* IN Loop term
1120: 69 6e 61 74 6f 72 2e 20 4f 50 5f 4e 65 78 74 20  inator. OP_Next 
1130: 6f 72 20 4f 50 5f 50 72 65 76 20 2a 2f 0a 20 20  or OP_Prev */.  
1140: 20 20 20 20 7d 20 2a 61 49 6e 4c 6f 6f 70 3b 20      } *aInLoop; 
1150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
1160: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 65  ormation about e
1170: 61 63 68 20 6e 65 73 74 65 64 20 49 4e 20 6f 70  ach nested IN op
1180: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 20  erator */.    } 
1190: 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
11a0: 20 20 20 20 2f 2a 20 55 73 65 64 20 77 68 65 6e      /* Used when
11b0: 20 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   pWLoop->wsFlags
11c0: 26 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 2a  &WHERE_IN_ABLE *
11d0: 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f  /.    Index *pCo
11e0: 76 69 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 50  vidx;       /* P
11f0: 6f 73 73 69 62 6c 65 20 63 6f 76 65 72 69 6e 67  ossible covering
1200: 20 69 6e 64 65 78 20 66 6f 72 20 57 48 45 52 45   index for WHERE
1210: 5f 4d 55 4c 54 49 5f 4f 52 20 2a 2f 0a 20 20 7d  _MULTI_OR */.  }
1220: 20 75 3b 0a 20 20 73 74 72 75 63 74 20 57 68 65   u;.  struct Whe
1230: 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20  reLoop *pWLoop; 
1240: 20 2f 2a 20 54 68 65 20 73 65 6c 65 63 74 65 64   /* The selected
1250: 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1260: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45  t */.};../*.** E
1270: 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ach instance of 
1280: 74 68 69 73 20 6f 62 6a 65 63 74 20 72 65 70 72  this object repr
1290: 65 73 65 6e 74 73 20 61 6e 20 61 6c 67 6f 72 69  esents an algori
12a0: 74 68 6d 20 66 6f 72 20 65 76 61 6c 75 61 74 69  thm for evaluati
12b0: 6e 67 20 6f 6e 65 0a 2a 2a 20 74 65 72 6d 20 6f  ng one.** term o
12c0: 66 20 61 20 6a 6f 69 6e 2e 20 20 45 76 65 72 79  f a join.  Every
12d0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
12e0: 4d 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 68 61  M clause will ha
12f0: 76 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f  ve at least.** o
1300: 6e 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ne corresponding
1310: 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1320: 74 20 28 75 6e 6c 65 73 73 20 49 4e 44 45 58 45  t (unless INDEXE
1330: 44 20 42 59 20 63 6f 6e 73 74 72 61 69 6e 74 73  D BY constraints
1340: 0a 2a 2a 20 70 72 65 76 65 6e 74 20 61 20 71 75  .** prevent a qu
1350: 65 72 79 20 73 6f 6c 75 74 69 6f 6e 20 2d 20 77  ery solution - w
1360: 68 69 63 68 20 69 73 20 61 6e 20 65 72 72 6f 72  hich is an error
1370: 29 20 61 6e 64 20 6d 61 6e 79 20 74 65 72 6d 73  ) and many terms
1380: 20 6f 66 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20   of the.** FROM 
1390: 63 6c 61 75 73 65 20 77 69 6c 6c 20 68 61 76 65  clause will have
13a0: 20 6d 75 6c 74 69 70 6c 65 20 57 68 65 72 65 4c   multiple WhereL
13b0: 6f 6f 70 20 6f 62 6a 65 63 74 73 2c 20 65 61 63  oop objects, eac
13c0: 68 20 64 65 73 63 72 69 62 69 6e 67 20 61 0a 2a  h describing a.*
13d0: 2a 20 70 6f 74 65 6e 74 69 61 6c 20 77 61 79 20  * potential way 
13e0: 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  of implementing 
13f0: 74 68 61 74 20 46 52 4f 4d 2d 63 6c 61 75 73 65  that FROM-clause
1400: 20 74 65 72 6d 2c 20 74 6f 67 65 74 68 65 72 20   term, together 
1410: 77 69 74 68 0a 2a 2a 20 64 65 70 65 6e 64 65 6e  with.** dependen
1420: 63 69 65 73 20 61 6e 64 20 63 6f 73 74 20 65 73  cies and cost es
1430: 74 69 6d 61 74 65 73 20 66 6f 72 20 75 73 69 6e  timates for usin
1440: 67 20 74 68 65 20 63 68 6f 73 65 6e 20 61 6c 67  g the chosen alg
1450: 6f 72 69 74 68 6d 2e 0a 2a 2a 0a 2a 2a 20 51 75  orithm..**.** Qu
1460: 65 72 79 20 70 6c 61 6e 6e 69 6e 67 20 63 6f 6e  ery planning con
1470: 73 69 73 74 73 20 6f 66 20 62 75 69 6c 64 69 6e  sists of buildin
1480: 67 20 75 70 20 61 20 63 6f 6c 6c 65 63 74 69 6f  g up a collectio
1490: 6e 20 6f 66 20 74 68 65 73 65 20 57 68 65 72 65  n of these Where
14a0: 4c 6f 6f 70 0a 2a 2a 20 6f 62 6a 65 63 74 73 2c  Loop.** objects,
14b0: 20 74 68 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20   then computing 
14c0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 73 65 71  a particular seq
14d0: 75 65 6e 63 65 20 6f 66 20 57 68 65 72 65 4c 6f  uence of WhereLo
14e0: 6f 70 20 6f 62 6a 65 63 74 73 2c 20 77 69 74 68  op objects, with
14f0: 0a 2a 2a 20 6f 6e 65 20 57 68 65 72 65 4c 6f 6f  .** one WhereLoo
1500: 70 20 6f 62 6a 65 63 74 20 70 65 72 20 46 52 4f  p object per FRO
1510: 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2c 20 74  M clause term, t
1520: 68 61 74 20 73 61 74 69 73 66 79 20 61 6c 6c 20  hat satisfy all 
1530: 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 2a 2a 20  dependencies.** 
1540: 61 6e 64 20 74 68 61 74 20 6d 69 6e 69 6d 69 7a  and that minimiz
1550: 65 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 63 6f  e the overall co
1560: 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68  st..*/.struct Wh
1570: 65 72 65 4c 6f 6f 70 20 7b 0a 20 20 42 69 74 6d  ereLoop {.  Bitm
1580: 61 73 6b 20 70 72 65 72 65 71 3b 20 20 20 20 20  ask prereq;     
1590: 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20    /* Bitmask of 
15a0: 6f 74 68 65 72 20 6c 6f 6f 70 73 20 74 68 61 74  other loops that
15b0: 20 6d 75 73 74 20 72 75 6e 20 66 69 72 73 74 20   must run first 
15c0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  */.  Bitmask mas
15d0: 6b 53 65 6c 66 3b 20 20 20 20 20 2f 2a 20 42 69  kSelf;     /* Bi
15e0: 74 6d 61 73 6b 20 69 64 65 6e 74 69 66 79 69 6e  tmask identifyin
15f0: 67 20 74 61 62 6c 65 20 69 54 61 62 20 2a 2f 0a  g table iTab */.
1600: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1610: 42 55 47 0a 20 20 63 68 61 72 20 63 49 64 3b 20  BUG.  char cId; 
1620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1630: 79 6d 62 6f 6c 69 63 20 49 44 20 6f 66 20 74 68  ymbolic ID of th
1640: 69 73 20 6c 6f 6f 70 20 66 6f 72 20 64 65 62 75  is loop for debu
1650: 67 67 69 6e 67 20 75 73 65 20 2a 2f 0a 23 65 6e  gging use */.#en
1660: 64 69 66 0a 20 20 75 38 20 69 54 61 62 3b 20 20  dif.  u8 iTab;  
1670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1680: 6f 73 69 74 69 6f 6e 20 69 6e 20 46 52 4f 4d 20  osition in FROM 
1690: 63 6c 61 75 73 65 20 6f 66 20 74 61 62 6c 65 20  clause of table 
16a0: 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f  for this loop */
16b0: 0a 20 20 75 38 20 69 53 6f 72 74 49 64 78 3b 20  .  u8 iSortIdx; 
16c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74           /* Sort
16d0: 69 6e 67 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ing index number
16e0: 2e 20 20 30 3d 3d 4e 6f 6e 65 20 2a 2f 0a 20 20  .  0==None */.  
16f0: 57 68 65 72 65 43 6f 73 74 20 72 53 65 74 75 70  WhereCost rSetup
1700: 3b 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d  ;     /* One-tim
1710: 65 20 73 65 74 75 70 20 63 6f 73 74 20 28 65 78  e setup cost (ex
1720: 3a 20 63 72 65 61 74 65 20 74 72 61 6e 73 69 65  : create transie
1730: 6e 74 20 69 6e 64 65 78 29 20 2a 2f 0a 20 20 57  nt index) */.  W
1740: 68 65 72 65 43 6f 73 74 20 72 52 75 6e 3b 20 20  hereCost rRun;  
1750: 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20       /* Cost of 
1760: 72 75 6e 6e 69 6e 67 20 65 61 63 68 20 6c 6f 6f  running each loo
1770: 70 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  p */.  WhereCost
1780: 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 2f 2a 20   nOut;       /* 
1790: 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  Estimated number
17a0: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
17b0: 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  */.  union {.   
17c0: 20 73 74 72 75 63 74 20 7b 20 20 20 20 20 20 20   struct {       
17d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72          /* Infor
17e0: 6d 61 74 69 6f 6e 20 66 6f 72 20 69 6e 74 65 72  mation for inter
17f0: 6e 61 6c 20 62 74 72 65 65 20 74 61 62 6c 65 73  nal btree tables
1800: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45   */.      int nE
1810: 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
1820: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 71   /* Number of eq
1830: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1840: 74 73 20 2a 2f 0a 20 20 20 20 20 20 49 6e 64 65  ts */.      Inde
1850: 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
1860: 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64     /* Index used
1870: 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20  , or NULL */.   
1880: 20 7d 20 62 74 72 65 65 3b 0a 20 20 20 20 73 74   } btree;.    st
1890: 72 75 63 74 20 7b 20 20 20 20 20 20 20 20 20 20  ruct {          
18a0: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
18b0: 69 6f 6e 20 66 6f 72 20 76 69 72 74 75 61 6c 20  ion for virtual 
18c0: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20  tables */.      
18d0: 69 6e 74 20 69 64 78 4e 75 6d 3b 20 20 20 20 20  int idxNum;     
18e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
18f0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20  number */.      
1900: 75 38 20 6e 65 65 64 46 72 65 65 3b 20 20 20 20  u8 needFree;    
1910: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1920: 66 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 69  f sqlite3_free(i
1930: 64 78 53 74 72 29 20 69 73 20 6e 65 65 64 65 64  dxStr) is needed
1940: 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 69 73 4f   */.      u8 isO
1950: 72 64 65 72 65 64 3b 20 20 20 20 20 20 20 20 20  rdered;         
1960: 20 2f 2a 20 54 72 75 65 20 69 66 20 73 61 74 69   /* True if sati
1970: 73 66 69 65 73 20 4f 52 44 45 52 20 42 59 20 2a  sfies ORDER BY *
1980: 2f 0a 20 20 20 20 20 20 75 31 36 20 6f 6d 69 74  /.      u16 omit
1990: 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  Mask;          /
19a0: 2a 20 54 65 72 6d 73 20 74 68 61 74 20 6d 61 79  * Terms that may
19b0: 20 62 65 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20   be omitted */. 
19c0: 20 20 20 20 20 63 68 61 72 20 2a 69 64 78 53 74       char *idxSt
19d0: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  r;          /* I
19e0: 6e 64 65 78 20 69 64 65 6e 74 69 66 69 65 72 20  ndex identifier 
19f0: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 20  string */.    } 
1a00: 76 74 61 62 3b 0a 20 20 7d 20 75 3b 0a 20 20 75  vtab;.  } u;.  u
1a10: 33 32 20 77 73 46 6c 61 67 73 3b 20 20 20 20 20  32 wsFlags;     
1a20: 20 20 20 20 20 2f 2a 20 57 48 45 52 45 5f 2a 20       /* WHERE_* 
1a30: 66 6c 61 67 73 20 64 65 73 63 72 69 62 69 6e 67  flags describing
1a40: 20 74 68 65 20 70 6c 61 6e 20 2a 2f 0a 20 20 75   the plan */.  u
1a50: 31 36 20 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20  16 nLTerm;      
1a60: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a70: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 4c 54  f entries in aLT
1a80: 65 72 6d 5b 5d 20 2a 2f 0a 20 20 2f 2a 2a 2a 2a  erm[] */.  /****
1a90: 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 29   whereLoopXfer()
1aa0: 20 63 6f 70 69 65 73 20 66 69 65 6c 64 73 20 61   copies fields a
1ab0: 62 6f 76 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  bove ***********
1ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 20  ************/.# 
1ad0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4c 4f 4f  define WHERE_LOO
1ae0: 50 5f 58 46 45 52 5f 53 5a 20 6f 66 66 73 65 74  P_XFER_SZ offset
1af0: 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2c 6e 4c 53  of(WhereLoop,nLS
1b00: 6c 6f 74 29 0a 20 20 75 31 36 20 6e 4c 53 6c 6f  lot).  u16 nLSlo
1b10: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
1b20: 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20  Number of slots 
1b30: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4c  allocated for aL
1b40: 54 65 72 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  Term[] */.  Wher
1b50: 65 54 65 72 6d 20 2a 2a 61 4c 54 65 72 6d 3b 20  eTerm **aLTerm; 
1b60: 20 20 2f 2a 20 57 68 65 72 65 54 65 72 6d 73 20    /* WhereTerms 
1b70: 75 73 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  used */.  WhereL
1b80: 6f 6f 70 20 2a 70 4e 65 78 74 4c 6f 6f 70 3b 20  oop *pNextLoop; 
1b90: 2f 2a 20 4e 65 78 74 20 57 68 65 72 65 4c 6f 6f  /* Next WhereLoo
1ba0: 70 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20  p object in the 
1bb0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 2f 0a 20  WhereClause */. 
1bc0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 4c 54 65   WhereTerm *aLTe
1bd0: 72 6d 53 70 61 63 65 5b 34 5d 3b 20 20 2f 2a 20  rmSpace[4];  /* 
1be0: 49 6e 69 74 69 61 6c 20 61 4c 54 65 72 6d 5b 5d  Initial aLTerm[]
1bf0: 20 73 70 61 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   space */.};../*
1c00: 20 54 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c   This object hol
1c10: 64 73 20 74 68 65 20 70 72 65 72 65 71 75 69 73  ds the prerequis
1c20: 69 74 65 73 20 61 6e 64 20 74 68 65 20 63 6f 73  ites and the cos
1c30: 74 20 6f 66 20 72 75 6e 6e 69 6e 67 20 61 0a 2a  t of running a.*
1c40: 2a 20 73 75 62 71 75 65 72 79 20 6f 6e 20 6f 6e  * subquery on on
1c50: 65 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20  e operand of an 
1c60: 4f 52 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 74  OR operator in t
1c70: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
1c80: 0a 2a 2a 20 53 65 65 20 57 68 65 72 65 4f 72 53  .** See WhereOrS
1c90: 65 74 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  et for additiona
1ca0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 0a 2a  l information .*
1cb0: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4f 72  /.struct WhereOr
1cc0: 43 6f 73 74 20 7b 0a 20 20 42 69 74 6d 61 73 6b  Cost {.  Bitmask
1cd0: 20 70 72 65 72 65 71 3b 20 20 20 20 20 2f 2a 20   prereq;     /* 
1ce0: 50 72 65 72 65 71 75 69 73 69 74 65 73 20 2a 2f  Prerequisites */
1cf0: 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72 52 75  .  WhereCost rRu
1d00: 6e 3b 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f  n;     /* Cost o
1d10: 66 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 73  f running this s
1d20: 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 57 68 65  ubquery */.  Whe
1d30: 72 65 43 6f 73 74 20 6e 4f 75 74 3b 20 20 20 20  reCost nOut;    
1d40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
1d50: 74 70 75 74 73 20 66 6f 72 20 74 68 69 73 20 73  tputs for this s
1d60: 75 62 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a 0a 2f  ubquery */.};../
1d70: 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74  * The WhereOrSet
1d80: 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73 20 61 20   object holds a 
1d90: 73 65 74 20 6f 66 20 70 6f 73 73 69 62 6c 65 20  set of possible 
1da0: 57 68 65 72 65 4f 72 43 6f 73 74 73 20 74 68 61  WhereOrCosts tha
1db0: 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20  t.** correspond 
1dc0: 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 28  to the subquery(
1dd0: 73 29 20 6f 66 20 4f 52 2d 63 6c 61 75 73 65 20  s) of OR-clause 
1de0: 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 4f 6e 6c  processing.  Onl
1df0: 79 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 4e 5f  y the.** best N_
1e00: 4f 52 5f 43 4f 53 54 20 65 6c 65 6d 65 6e 74 73  OR_COST elements
1e10: 20 61 72 65 20 72 65 74 61 69 6e 65 64 2e 0a 2a   are retained..*
1e20: 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 4f 52 5f 43  /.#define N_OR_C
1e30: 4f 53 54 20 33 0a 73 74 72 75 63 74 20 57 68 65  OST 3.struct Whe
1e40: 72 65 4f 72 53 65 74 20 7b 0a 20 20 75 31 36 20  reOrSet {.  u16 
1e50: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1e60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e70: 72 20 6f 66 20 76 61 6c 69 64 20 61 5b 5d 20 65  r of valid a[] e
1e80: 6e 74 72 69 65 73 20 2a 2f 0a 20 20 57 68 65 72  ntries */.  Wher
1e90: 65 4f 72 43 6f 73 74 20 61 5b 4e 5f 4f 52 5f 43  eOrCost a[N_OR_C
1ea0: 4f 53 54 5d 3b 20 20 20 2f 2a 20 53 65 74 20 6f  OST];   /* Set o
1eb0: 66 20 62 65 73 74 20 63 6f 73 74 73 20 2a 2f 0a  f best costs */.
1ec0: 7d 3b 0a 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  };.../* Forward 
1ed0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20 6d  declaration of m
1ee0: 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63  ethods */.static
1ef0: 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65   int whereLoopRe
1f00: 73 69 7a 65 28 73 71 6c 69 74 65 33 2a 2c 20 57  size(sqlite3*, W
1f10: 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e 74 29 3b  hereLoop*, int);
1f20: 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73  ../*.** Each ins
1f30: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
1f40: 6a 65 63 74 20 68 6f 6c 64 73 20 61 20 73 65 71  ject holds a seq
1f50: 75 65 6e 63 65 20 6f 66 20 57 68 65 72 65 4c 6f  uence of WhereLo
1f60: 6f 70 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 74 68  op objects.** th
1f70: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 73 6f 6d  at implement som
1f80: 65 20 6f 72 20 61 6c 6c 20 6f 66 20 61 20 71 75  e or all of a qu
1f90: 65 72 79 20 70 6c 61 6e 2e 0a 2a 2a 0a 2a 2a 20  ery plan..**.** 
1fa0: 54 68 69 6e 6b 20 6f 66 20 65 61 63 68 20 57 68  Think of each Wh
1fb0: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 61  ereLoop object a
1fc0: 73 20 61 20 6e 6f 64 65 20 69 6e 20 61 20 67 72  s a node in a gr
1fd0: 61 70 68 20 77 69 74 68 20 61 72 63 73 0a 2a 2a  aph with arcs.**
1fe0: 20 73 68 6f 77 69 6e 67 20 64 65 70 65 6e 64 65   showing depende
1ff0: 6e 63 65 73 20 61 6e 64 20 63 6f 73 74 73 20 66  nces and costs f
2000: 6f 72 20 74 72 61 76 65 6c 6c 69 6e 67 20 62 65  or travelling be
2010: 74 77 65 65 6e 20 6e 6f 64 65 73 2e 20 20 28 54  tween nodes.  (T
2020: 68 61 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 61 20  hat is.** not a 
2030: 63 6f 6d 70 6c 65 74 65 6c 79 20 61 63 63 75 72  completely accur
2040: 61 74 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ate description 
2050: 62 65 63 61 75 73 65 20 57 68 65 72 65 4c 6f 6f  because WhereLoo
2060: 70 20 63 6f 73 74 73 20 61 72 65 20 61 0a 2a 2a  p costs are a.**
2070: 20 76 65 63 74 6f 72 2c 20 6e 6f 74 20 61 20 73   vector, not a s
2080: 63 61 6c 61 72 2c 20 61 6e 64 20 62 65 63 61 75  calar, and becau
2090: 73 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20 61  se dependences a
20a0: 72 65 20 6d 61 6e 79 2d 74 6f 2d 6f 6e 65 2c 20  re many-to-one, 
20b0: 6e 6f 74 0a 2a 2a 20 6f 6e 65 2d 74 6f 2d 6f 6e  not.** one-to-on
20c0: 65 20 61 73 20 61 72 65 20 67 72 61 70 68 20 6e  e as are graph n
20d0: 6f 64 65 73 2e 20 20 42 75 74 20 69 74 20 69 73  odes.  But it is
20e0: 20 61 20 75 73 65 66 75 6c 20 76 69 73 75 61 6c   a useful visual
20f0: 69 7a 61 74 69 6f 6e 20 61 69 64 2e 29 0a 2a 2a  ization aid.).**
2100: 20 54 68 65 6e 20 61 20 57 68 65 72 65 50 61 74   Then a WherePat
2110: 68 20 6f 62 6a 65 63 74 20 69 73 20 61 20 70 61  h object is a pa
2120: 74 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 67  th through the g
2130: 72 61 70 68 20 74 68 61 74 20 76 69 73 69 74 73  raph that visits
2140: 20 73 6f 6d 65 0a 2a 2a 20 6f 72 20 61 6c 6c 20   some.** or all 
2150: 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
2160: 20 6f 62 6a 65 63 74 73 20 6f 6e 63 65 2e 0a 2a   objects once..*
2170: 2a 0a 2a 2a 20 54 68 65 20 22 73 6f 6c 76 65 72  *.** The "solver
2180: 22 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74  " works by creat
2190: 69 6e 67 20 74 68 65 20 4e 20 62 65 73 74 20 57  ing the N best W
21a0: 68 65 72 65 50 61 74 68 20 6f 62 6a 65 63 74 73  herePath objects
21b0: 20 6f 66 20 6c 65 6e 67 74 68 0a 2a 2a 20 31 2e   of length.** 1.
21c0: 20 20 54 68 65 6e 20 75 73 69 6e 67 20 74 68 6f    Then using tho
21d0: 73 65 20 61 73 20 61 20 62 61 73 69 73 20 74 6f  se as a basis to
21e0: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 4e 20 62   compute the N b
21f0: 65 73 74 20 57 68 65 72 65 50 61 74 68 20 6f 62  est WherePath ob
2200: 6a 65 63 74 73 0a 2a 2a 20 6f 66 20 6c 65 6e 67  jects.** of leng
2210: 74 68 20 32 2e 20 20 41 6e 64 20 73 6f 20 66 6f  th 2.  And so fo
2220: 72 74 68 20 75 6e 74 69 6c 20 74 68 65 20 6c 65  rth until the le
2230: 6e 67 74 68 20 6f 66 20 57 68 65 72 65 50 61 74  ngth of WherePat
2240: 68 73 20 65 71 75 61 6c 73 20 74 68 65 0a 2a 2a  hs equals the.**
2250: 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 64 65 73   number of nodes
2260: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2270: 75 73 65 2e 20 20 54 68 65 20 62 65 73 74 20 28  use.  The best (
2280: 6c 6f 77 65 73 74 20 63 6f 73 74 29 20 57 68 65  lowest cost) Whe
2290: 72 65 50 61 74 68 0a 2a 2a 20 61 74 20 74 68 65  rePath.** at the
22a0: 20 65 6e 64 20 69 73 20 74 68 65 20 63 68 6f 6f   end is the choo
22b0: 73 65 6e 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a  sen query plan..
22c0: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 50  */.struct WhereP
22d0: 61 74 68 20 7b 0a 20 20 42 69 74 6d 61 73 6b 20  ath {.  Bitmask 
22e0: 6d 61 73 6b 4c 6f 6f 70 3b 20 20 20 20 20 2f 2a  maskLoop;     /*
22f0: 20 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20   Bitmask of all 
2300: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2310: 73 20 69 6e 20 74 68 69 73 20 70 61 74 68 20 2a  s in this path *
2320: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4c  /.  Bitmask revL
2330: 6f 6f 70 3b 20 20 20 20 20 20 2f 2a 20 61 4c 6f  oop;      /* aLo
2340: 6f 70 5b 5d 73 20 74 68 61 74 20 73 68 6f 75 6c  op[]s that shoul
2350: 64 20 62 65 20 72 65 76 65 72 73 65 64 20 66 6f  d be reversed fo
2360: 72 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20  r ORDER BY */.  
2370: 57 68 65 72 65 43 6f 73 74 20 6e 52 6f 77 3b 20  WhereCost nRow; 
2380: 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74        /* Estimat
2390: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ed number of row
23a0: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  s generated by t
23b0: 68 69 73 20 70 61 74 68 20 2a 2f 0a 20 20 57 68  his path */.  Wh
23c0: 65 72 65 43 6f 73 74 20 72 43 6f 73 74 3b 20 20  ereCost rCost;  
23d0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63 6f 73      /* Total cos
23e0: 74 20 6f 66 20 74 68 69 73 20 70 61 74 68 20 2a  t of this path *
23f0: 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72 65 64  /.  u8 isOrdered
2400: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
2410: 65 20 69 66 20 74 68 69 73 20 70 61 74 68 20 73  e if this path s
2420: 61 74 69 73 66 69 65 73 20 4f 52 44 45 52 20 42  atisfies ORDER B
2430: 59 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65  Y */.  u8 isOrde
2440: 72 65 64 56 61 6c 69 64 3b 20 20 20 20 2f 2a 20  redValid;    /* 
2450: 54 72 75 65 20 69 66 20 74 68 65 20 69 73 4f 72  True if the isOr
2460: 64 65 72 65 64 20 66 69 65 6c 64 20 69 73 20 76  dered field is v
2470: 61 6c 69 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  alid */.  WhereL
2480: 6f 6f 70 20 2a 2a 61 4c 6f 6f 70 3b 20 20 20 20  oop **aLoop;    
2490: 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 68 65 72  /* Array of Wher
24a0: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69 6d  eLoop objects im
24b0: 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  plementing this 
24c0: 70 61 74 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  path */.};../*.*
24d0: 2a 20 54 68 65 20 71 75 65 72 79 20 67 65 6e 65  * The query gene
24e0: 72 61 74 6f 72 20 75 73 65 73 20 61 6e 20 61 72  rator uses an ar
24f0: 72 61 79 20 6f 66 20 69 6e 73 74 61 6e 63 65 73  ray of instances
2500: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
2510: 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70 20 69 74  re to.** help it
2520: 20 61 6e 61 6c 79 7a 65 20 74 68 65 20 73 75 62   analyze the sub
2530: 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
2540: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
2550: 20 20 45 61 63 68 20 57 48 45 52 45 0a 2a 2a 20    Each WHERE.** 
2560: 63 6c 61 75 73 65 20 73 75 62 65 78 70 72 65 73  clause subexpres
2570: 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65  sion is separate
2580: 64 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  d from the other
2590: 73 20 62 79 20 41 4e 44 20 6f 70 65 72 61 74 6f  s by AND operato
25a0: 72 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c 79 2c 20  rs,.** usually, 
25b0: 6f 72 20 73 6f 6d 65 74 69 6d 65 73 20 73 75 62  or sometimes sub
25c0: 65 78 70 72 65 73 73 69 6f 6e 73 20 73 65 70 61  expressions sepa
25d0: 72 61 74 65 64 20 62 79 20 4f 52 2e 0a 2a 2a 0a  rated by OR..**.
25e0: 2a 2a 20 41 6c 6c 20 57 68 65 72 65 54 65 72 6d  ** All WhereTerm
25f0: 73 20 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 20  s are collected 
2600: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68  into a single Wh
2610: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
2620: 75 72 65 2e 20 20 0a 2a 2a 20 54 68 65 20 66 6f  ure.  .** The fo
2630: 6c 6c 6f 77 69 6e 67 20 69 64 65 6e 74 69 74 79  llowing identity
2640: 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   holds:.**.**   
2650: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 70       WhereTerm.p
2660: 57 43 2d 3e 61 5b 57 68 65 72 65 54 65 72 6d 2e  WC->a[WhereTerm.
2670: 69 64 78 5d 20 3d 3d 20 57 68 65 72 65 54 65 72  idx] == WhereTer
2680: 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 74  m.**.** When a t
2690: 65 72 6d 20 69 73 20 6f 66 20 74 68 65 20 66 6f  erm is of the fo
26a0: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  rm:.**.**       
26b0: 20 20 20 20 20 20 20 58 20 3c 6f 70 3e 20 3c 65         X <op> <e
26c0: 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  xpr>.**.** where
26d0: 20 58 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6e   X is a column n
26e0: 61 6d 65 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20  ame and <op> is 
26f0: 6f 6e 65 20 6f 66 20 63 65 72 74 61 69 6e 20 6f  one of certain o
2700: 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 74 68 65  perators,.** the
2710: 6e 20 57 68 65 72 65 54 65 72 6d 2e 6c 65 66 74  n WhereTerm.left
2720: 43 75 72 73 6f 72 20 61 6e 64 20 57 68 65 72 65  Cursor and Where
2730: 54 65 72 6d 2e 75 2e 6c 65 66 74 43 6f 6c 75 6d  Term.u.leftColum
2740: 6e 20 72 65 63 6f 72 64 20 74 68 65 0a 2a 2a 20  n record the.** 
2750: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 61 6e  cursor number an
2760: 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  d column number 
2770: 66 6f 72 20 58 2e 20 20 57 68 65 72 65 54 65 72  for X.  WhereTer
2780: 6d 2e 65 4f 70 65 72 61 74 6f 72 20 72 65 63 6f  m.eOperator reco
2790: 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f 70 3e 20  rds.** the <op> 
27a0: 75 73 69 6e 67 20 61 20 62 69 74 6d 61 73 6b 20  using a bitmask 
27b0: 65 6e 63 6f 64 69 6e 67 20 64 65 66 69 6e 65 64  encoding defined
27c0: 20 62 79 20 57 4f 5f 78 78 78 20 62 65 6c 6f 77   by WO_xxx below
27d0: 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65 20 6f 66  .  The.** use of
27e0: 20 61 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64   a bitmask encod
27f0: 69 6e 67 20 66 6f 72 20 74 68 65 20 6f 70 65 72  ing for the oper
2800: 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75 73 20 74  ator allows us t
2810: 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71 75 69 63  o search.** quic
2820: 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73 20 74 68  kly for terms th
2830: 61 74 20 6d 61 74 63 68 20 61 6e 79 20 6f 66 20  at match any of 
2840: 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e  several differen
2850: 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a  t operators..**.
2860: 2a 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20 6d  ** A WhereTerm m
2870: 69 67 68 74 20 61 6c 73 6f 20 62 65 20 74 77 6f  ight also be two
2880: 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d   or more subterm
2890: 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f  s connected by O
28a0: 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  R:.**.**        
28b0: 20 28 74 31 2e 58 20 3c 6f 70 3e 20 3c 65 78 70   (t1.X <op> <exp
28c0: 72 3e 29 20 4f 52 20 28 74 31 2e 59 20 3c 6f 70  r>) OR (t1.Y <op
28d0: 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 2e 2e 2e  > <expr>) OR ...
28e0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ..**.** In this 
28f0: 73 65 63 6f 6e 64 20 63 61 73 65 2c 20 77 74 46  second case, wtF
2900: 6c 61 67 20 68 61 73 20 74 68 65 20 54 45 52 4d  lag has the TERM
2910: 5f 4f 52 49 4e 46 4f 20 62 69 74 20 73 65 74 20  _ORINFO bit set 
2920: 61 6e 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57  and eOperator==W
2930: 4f 5f 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65 20  O_OR.** and the 
2940: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49  WhereTerm.u.pOrI
2950: 6e 66 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74 73  nfo field points
2960: 20 74 6f 20 61 75 78 69 6c 69 61 72 79 20 69 6e   to auxiliary in
2970: 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a 2a  formation that.*
2980: 2a 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 61  * is collected a
2990: 62 6f 75 74 20 74 68 65 20 4f 52 20 63 6c 61 75  bout the OR clau
29a0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  se..**.** If a t
29b0: 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
29c0: 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
29d0: 20 6d 61 74 63 68 20 65 69 74 68 65 72 20 6f 66   match either of
29e0: 20 74 68 65 20 74 77 6f 20 70 72 65 76 69 6f 75   the two previou
29f0: 73 0a 2a 2a 20 63 61 74 65 67 6f 72 69 65 73 2c  s.** categories,
2a00: 20 74 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 3d   then eOperator=
2a10: 3d 30 2e 20 20 54 68 65 20 57 68 65 72 65 54 65  =0.  The WhereTe
2a20: 72 6d 2e 70 45 78 70 72 20 66 69 65 6c 64 20 69  rm.pExpr field i
2a30: 73 20 73 74 69 6c 6c 20 73 65 74 0a 2a 2a 20 74  s still set.** t
2a40: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73  o the original s
2a50: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e  ubexpression con
2a60: 74 65 6e 74 20 61 6e 64 20 77 74 46 6c 61 67 73  tent and wtFlags
2a70: 20 69 73 20 73 65 74 20 75 70 20 61 70 70 72 6f   is set up appro
2a80: 70 72 69 61 74 65 6c 79 0a 2a 2a 20 62 75 74 20  priately.** but 
2a90: 6e 6f 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  no other fields 
2aa0: 69 6e 20 74 68 65 20 57 68 65 72 65 54 65 72 6d  in the WhereTerm
2ab0: 20 6f 62 6a 65 63 74 20 61 72 65 20 6d 65 61 6e   object are mean
2ac0: 69 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20 57 68  ingful..**.** Wh
2ad0: 65 6e 20 65 4f 70 65 72 61 74 6f 72 21 3d 30 2c  en eOperator!=0,
2ae0: 20 70 72 65 72 65 71 52 69 67 68 74 20 61 6e 64   prereqRight and
2af0: 20 70 72 65 72 65 71 41 6c 6c 20 72 65 63 6f 72   prereqAll recor
2b00: 64 20 73 65 74 73 20 6f 66 20 63 75 72 73 6f 72  d sets of cursor
2b10: 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20 62 75 74   numbers,.** but
2b20: 20 74 68 65 79 20 64 6f 20 73 6f 20 69 6e 64 69   they do so indi
2b30: 72 65 63 74 6c 79 2e 20 20 41 20 73 69 6e 67 6c  rectly.  A singl
2b40: 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73  e WhereMaskSet s
2b50: 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 6c 61  tructure transla
2b60: 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75  tes.** cursor nu
2b70: 6d 62 65 72 20 69 6e 74 6f 20 62 69 74 73 20 61  mber into bits a
2b80: 6e 64 20 74 68 65 20 74 72 61 6e 73 6c 61 74 65  nd the translate
2b90: 64 20 62 69 74 20 69 73 20 73 74 6f 72 65 64 20  d bit is stored 
2ba0: 69 6e 20 74 68 65 20 70 72 65 72 65 71 0a 2a 2a  in the prereq.**
2bb0: 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20 74 72   fields.  The tr
2bc0: 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75 73 65  anslation is use
2bd0: 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  d in order to ma
2be0: 78 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d 62 65  ximize the numbe
2bf0: 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74 68 61  r of.** bits tha
2c00: 74 20 77 69 6c 6c 20 66 69 74 20 69 6e 20 61 20  t will fit in a 
2c10: 42 69 74 6d 61 73 6b 2e 20 20 54 68 65 20 56 44  Bitmask.  The VD
2c20: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
2c30: 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 73 70  s might be.** sp
2c40: 72 65 61 64 20 6f 75 74 20 6f 76 65 72 20 74 68  read out over th
2c50: 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  e non-negative i
2c60: 6e 74 65 67 65 72 73 2e 20 20 46 6f 72 20 65 78  ntegers.  For ex
2c70: 61 6d 70 6c 65 2c 20 74 68 65 20 63 75 72 73 6f  ample, the curso
2c80: 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d 69 67  r.** numbers mig
2c90: 68 74 20 62 65 20 33 2c 20 38 2c 20 39 2c 20 31  ht be 3, 8, 9, 1
2ca0: 30 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c 20 61  0, 20, 23, 41, a
2cb0: 6e 64 20 34 35 2e 20 20 54 68 65 20 57 68 65 72  nd 45.  The Wher
2cc0: 65 4d 61 73 6b 53 65 74 0a 2a 2a 20 74 72 61 6e  eMaskSet.** tran
2cd0: 73 6c 61 74 65 73 20 74 68 65 73 65 20 73 70 61  slates these spa
2ce0: 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  rse cursor numbe
2cf0: 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74  rs into consecut
2d00: 69 76 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20  ive integers.** 
2d10: 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30  beginning with 0
2d20: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
2d30: 65 20 74 68 65 20 62 65 73 74 20 70 6f 73 73 69  e the best possi
2d40: 62 6c 65 20 75 73 65 20 6f 66 20 74 68 65 20 61  ble use of the a
2d50: 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62 69 74 73  vailable.** bits
2d60: 20 69 6e 20 74 68 65 20 42 69 74 6d 61 73 6b 2e   in the Bitmask.
2d70: 20 20 53 6f 2c 20 69 6e 20 74 68 65 20 65 78 61    So, in the exa
2d80: 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20  mple above, the 
2d90: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 0a 2a  cursor numbers.*
2da0: 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61 70 70 65  * would be mappe
2db0: 64 20 69 6e 74 6f 20 69 6e 74 65 67 65 72 73 20  d into integers 
2dc0: 30 20 74 68 72 6f 75 67 68 20 37 2e 0a 2a 2a 0a  0 through 7..**.
2dd0: 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
2de0: 20 74 65 72 6d 73 20 69 6e 20 61 20 6a 6f 69 6e   terms in a join
2df0: 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74   is limited by t
2e00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
2e10: 73 0a 2a 2a 20 69 6e 20 70 72 65 72 65 71 52 69  s.** in prereqRi
2e20: 67 68 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c  ght and prereqAl
2e30: 6c 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  l.  The default 
2e40: 69 73 20 36 34 20 62 69 74 73 2c 20 68 65 6e 63  is 64 bits, henc
2e50: 65 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73 20 6f  e SQLite.** is o
2e60: 6e 6c 79 20 61 62 6c 65 20 74 6f 20 70 72 6f 63  nly able to proc
2e70: 65 73 73 20 6a 6f 69 6e 73 20 77 69 74 68 20 36  ess joins with 6
2e80: 34 20 6f 72 20 66 65 77 65 72 20 74 61 62 6c 65  4 or fewer table
2e90: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  s..*/.struct Whe
2ea0: 72 65 54 65 72 6d 20 7b 0a 20 20 45 78 70 72 20  reTerm {.  Expr 
2eb0: 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  *pExpr;         
2ec0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2ed0: 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
2ee0: 6f 6e 20 74 68 61 74 20 69 73 20 74 68 69 73 20  on that is this 
2ef0: 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 50  term */.  int iP
2f00: 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  arent;          
2f10: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 70 57 43    /* Disable pWC
2f20: 2d 3e 61 5b 69 50 61 72 65 6e 74 5d 20 77 68 65  ->a[iParent] whe
2f30: 6e 20 74 68 69 73 20 74 65 72 6d 20 64 69 73 61  n this term disa
2f40: 62 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  bled */.  int le
2f50: 66 74 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20  ftCursor;       
2f60: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
2f70: 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f  er of X in "X <o
2f80: 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20  p> <expr>" */.  
2f90: 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 69 6e 74 20  union {.    int 
2fa0: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  leftColumn;     
2fb0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75      /* Column nu
2fc0: 6d 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20  mber of X in "X 
2fd0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a  <op> <expr>" */.
2fe0: 20 20 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20      WhereOrInfo 
2ff0: 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 2f 2a 20 45  *pOrInfo;   /* E
3000: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
3010: 20 69 66 20 28 65 4f 70 65 72 61 74 6f 72 20 26   if (eOperator &
3020: 20 57 4f 5f 4f 52 29 21 3d 30 20 2a 2f 0a 20 20   WO_OR)!=0 */.  
3030: 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a    WhereAndInfo *
3040: 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78 74  pAndInfo; /* Ext
3050: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ra information i
3060: 66 20 28 65 4f 70 65 72 61 74 6f 72 26 20 57 4f  f (eOperator& WO
3070: 5f 41 4e 44 29 21 3d 30 20 2a 2f 0a 20 20 7d 20  _AND)!=0 */.  } 
3080: 75 3b 0a 20 20 75 31 36 20 65 4f 70 65 72 61 74  u;.  u16 eOperat
3090: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or;          /* 
30a0: 41 20 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65  A WO_xx value de
30b0: 73 63 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f  scribing <op> */
30c0: 0a 20 20 75 38 20 77 74 46 6c 61 67 73 3b 20 20  .  u8 wtFlags;  
30d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 45             /* TE
30e0: 52 4d 5f 78 78 78 20 62 69 74 20 66 6c 61 67 73  RM_xxx bit flags
30f0: 2e 20 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a  .  See below */.
3100: 20 20 75 38 20 6e 43 68 69 6c 64 3b 20 20 20 20    u8 nChild;    
3110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3120: 62 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20  ber of children 
3130: 74 68 61 74 20 6d 75 73 74 20 64 69 73 61 62 6c  that must disabl
3140: 65 20 75 73 20 2a 2f 0a 20 20 57 68 65 72 65 43  e us */.  WhereC
3150: 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20  lause *pWC;     
3160: 20 20 2f 2a 20 54 68 65 20 63 6c 61 75 73 65 20    /* The clause 
3170: 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72  this term is par
3180: 74 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73  t of */.  Bitmas
3190: 6b 20 70 72 65 72 65 71 52 69 67 68 74 3b 20 20  k prereqRight;  
31a0: 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20    /* Bitmask of 
31b0: 74 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 70  tables used by p
31c0: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 2a 2f 0a  Expr->pRight */.
31d0: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
31e0: 41 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74  All;      /* Bit
31f0: 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72  mask of tables r
3200: 65 66 65 72 65 6e 63 65 64 20 62 79 20 70 45 78  eferenced by pEx
3210: 70 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  pr */.};../*.** 
3220: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f  Allowed values o
3230: 66 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c  f WhereTerm.wtFl
3240: 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54  ags.*/.#define T
3250: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20 30  ERM_DYNAMIC    0
3260: 78 30 31 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  x01   /* Need to
3270: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70   call sqlite3Exp
3280: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
3290: 72 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45  r) */.#define TE
32a0: 52 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78  RM_VIRTUAL    0x
32b0: 30 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62 79  02   /* Added by
32c0: 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20   the optimizer. 
32d0: 20 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a   Do not code */.
32e0: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44  #define TERM_COD
32f0: 45 44 20 20 20 20 20 20 30 78 30 34 20 20 20 2f  ED      0x04   /
3300: 2a 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 61  * This term is a
3310: 6c 72 65 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a  lready coded */.
3320: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50  #define TERM_COP
3330: 49 45 44 20 20 20 20 20 30 78 30 38 20 20 20 2f  IED     0x08   /
3340: 2a 20 48 61 73 20 61 20 63 68 69 6c 64 20 2a 2f  * Has a child */
3350: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52  .#define TERM_OR
3360: 49 4e 46 4f 20 20 20 20 20 30 78 31 30 20 20 20  INFO     0x10   
3370: 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20  /* Need to free 
3380: 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  the WhereTerm.u.
3390: 70 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a  pOrInfo object *
33a0: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 41  /.#define TERM_A
33b0: 4e 44 49 4e 46 4f 20 20 20 20 30 78 32 30 20 20  NDINFO    0x20  
33c0: 20 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65   /* Need to free
33d0: 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75   the WhereTerm.u
33e0: 2e 70 41 6e 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f  .pAndInfo obj */
33f0: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52  .#define TERM_OR
3400: 5f 4f 4b 20 20 20 20 20 20 30 78 34 30 20 20 20  _OK      0x40   
3410: 2f 2a 20 55 73 65 64 20 64 75 72 69 6e 67 20 4f  /* Used during O
3420: 52 2d 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  R-clause process
3430: 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ing */.#ifdef SQ
3440: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
3450: 33 0a 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d  3.#  define TERM
3460: 5f 56 4e 55 4c 4c 20 20 20 20 30 78 38 30 20 20  _VNULL    0x80  
3470: 20 2f 2a 20 4d 61 6e 75 66 61 63 74 75 72 65 64   /* Manufactured
3480: 20 78 3e 4e 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55   x>NULL or x<=NU
3490: 4c 4c 20 74 65 72 6d 20 2a 2f 0a 23 65 6c 73 65  LL term */.#else
34a0: 0a 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f  .#  define TERM_
34b0: 56 4e 55 4c 4c 20 20 20 20 30 78 30 30 20 20 20  VNULL    0x00   
34c0: 2f 2a 20 44 69 73 61 62 6c 65 64 20 69 66 20 6e  /* Disabled if n
34d0: 6f 74 20 75 73 69 6e 67 20 73 74 61 74 33 20 2a  ot using stat3 *
34e0: 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
34f0: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
3500: 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f 62 6a  he WhereScan obj
3510: 65 63 74 20 69 73 20 75 73 65 64 20 61 73 20 61  ect is used as a
3520: 6e 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 6c  n iterator for l
3530: 6f 63 61 74 69 6e 67 0a 2a 2a 20 74 65 72 6d 73  ocating.** terms
3540: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
3550: 61 75 73 65 20 74 68 61 74 20 61 72 65 20 75 73  ause that are us
3560: 65 66 75 6c 20 74 6f 20 74 68 65 20 71 75 65 72  eful to the quer
3570: 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74  y planner..*/.st
3580: 72 75 63 74 20 57 68 65 72 65 53 63 61 6e 20 7b  ruct WhereScan {
3590: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
35a0: 70 4f 72 69 67 57 43 3b 20 20 20 20 20 20 2f 2a  pOrigWC;      /*
35b0: 20 4f 72 69 67 69 6e 61 6c 2c 20 69 6e 6e 65 72   Original, inner
35c0: 6d 6f 73 74 20 57 68 65 72 65 43 6c 61 75 73 65  most WhereClause
35d0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
35e0: 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
35f0: 20 2f 2a 20 57 68 65 72 65 43 6c 61 75 73 65 20   /* WhereClause 
3600: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
3610: 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 63 68 61  scanned */.  cha
3620: 72 20 2a 7a 43 6f 6c 6c 4e 61 6d 65 3b 20 20 20  r *zCollName;   
3630: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
3640: 72 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  red collating se
3650: 71 75 65 6e 63 65 2c 20 69 66 20 6e 6f 74 20 4e  quence, if not N
3660: 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 69 64  ULL */.  char id
3670: 78 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  xaff;           
3680: 20 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61 74 63      /* Must matc
3690: 68 20 74 68 69 73 20 61 66 66 69 6e 69 74 79 2c  h this affinity,
36a0: 20 69 66 20 7a 43 6f 6c 6c 4e 61 6d 65 21 3d 4e   if zCollName!=N
36b0: 55 4c 4c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ULL */.  unsigne
36c0: 64 20 63 68 61 72 20 6e 45 71 75 69 76 3b 20 20  d char nEquiv;  
36d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
36e0: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 45 71 75   entries in aEqu
36f0: 69 76 5b 5d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  iv[] */.  unsign
3700: 65 64 20 63 68 61 72 20 69 45 71 75 69 76 3b 20  ed char iEquiv; 
3710: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75       /* Next unu
3720: 73 65 64 20 73 6c 6f 74 20 69 6e 20 61 45 71 75  sed slot in aEqu
3730: 69 76 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 6f 70  iv[] */.  u32 op
3740: 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
3750: 20 20 20 20 20 2f 2a 20 41 63 63 65 70 74 61 62       /* Acceptab
3760: 6c 65 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  le operators */.
3770: 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20    int k;        
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3790: 52 65 73 75 6d 65 20 73 63 61 6e 6e 69 6e 67 20  Resume scanning 
37a0: 61 74 20 74 68 69 73 2d 3e 70 57 43 2d 3e 61 5b  at this->pWC->a[
37b0: 74 68 69 73 2d 3e 6b 5d 20 2a 2f 0a 20 20 69 6e  this->k] */.  in
37c0: 74 20 61 45 71 75 69 76 5b 32 32 5d 3b 20 20 20  t aEquiv[22];   
37d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
37e0: 6f 72 2c 43 6f 6c 75 6d 6e 20 70 61 69 72 73 20  or,Column pairs 
37f0: 66 6f 72 20 65 71 75 69 76 61 6c 65 6e 63 65 20  for equivalence 
3800: 63 6c 61 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f  classes */.};../
3810: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
3820: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
3830: 67 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64  g structure hold
3840: 73 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  s all informatio
3850: 6e 20 61 62 6f 75 74 20 61 0a 2a 2a 20 57 48 45  n about a.** WHE
3860: 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 6f 73 74  RE clause.  Most
3870: 6c 79 20 74 68 69 73 20 69 73 20 61 20 63 6f 6e  ly this is a con
3880: 74 61 69 6e 65 72 20 66 6f 72 20 6f 6e 65 20 6f  tainer for one o
3890: 72 20 6d 6f 72 65 20 57 68 65 72 65 54 65 72 6d  r more WhereTerm
38a0: 73 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 6c 61 6e 61  s..**.** Explana
38b0: 74 69 6f 6e 20 6f 66 20 70 4f 75 74 65 72 3a 20  tion of pOuter: 
38c0: 20 46 6f 72 20 61 20 57 48 45 52 45 20 63 6c 61   For a WHERE cla
38d0: 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a  use of the form.
38e0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
38f0: 61 20 41 4e 44 20 28 28 62 20 41 4e 44 20 63 29  a AND ((b AND c)
3900: 20 4f 52 20 28 64 20 41 4e 44 20 65 29 29 20 41   OR (d AND e)) A
3910: 4e 44 20 66 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ND f.**.** There
3920: 20 61 72 65 20 73 65 70 61 72 61 74 65 20 57 68   are separate Wh
3930: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
3940: 73 20 66 6f 72 20 74 68 65 20 77 68 6f 6c 65 20  s for the whole 
3950: 63 6c 61 75 73 65 20 61 6e 64 20 66 6f 72 0a 2a  clause and for.*
3960: 2a 20 74 68 65 20 73 75 62 63 6c 61 75 73 65 73  * the subclauses
3970: 20 22 28 62 20 41 4e 44 20 63 29 22 20 61 6e 64   "(b AND c)" and
3980: 20 22 28 64 20 41 4e 44 20 65 29 22 2e 20 20 54   "(d AND e)".  T
3990: 68 65 20 70 4f 75 74 65 72 20 66 69 65 6c 64 20  he pOuter field 
39a0: 6f 66 20 74 68 65 0a 2a 2a 20 73 75 62 63 6c 61  of the.** subcla
39b0: 75 73 65 73 20 70 6f 69 6e 74 73 20 74 6f 20 74  uses points to t
39c0: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  he WhereClause o
39d0: 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 77 68  bject for the wh
39e0: 6f 6c 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73  ole clause..*/.s
39f0: 74 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73  truct WhereClaus
3a00: 65 20 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  e {.  WhereInfo 
3a10: 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 2f  *pWInfo;       /
3a20: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  * WHERE clause p
3a30: 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78  rocessing contex
3a40: 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
3a50: 73 65 20 2a 70 4f 75 74 65 72 3b 20 20 20 20 20  se *pOuter;     
3a60: 2f 2a 20 4f 75 74 65 72 20 63 6f 6e 6a 75 6e 63  /* Outer conjunc
3a70: 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6f 70 3b  tion */.  u8 op;
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a90: 20 20 20 2f 2a 20 53 70 6c 69 74 20 6f 70 65 72     /* Split oper
3aa0: 61 74 6f 72 2e 20 20 54 4b 5f 41 4e 44 20 6f 72  ator.  TK_AND or
3ab0: 20 54 4b 5f 4f 52 20 2a 2f 0a 20 20 69 6e 74 20   TK_OR */.  int 
3ac0: 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nTerm;          
3ad0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3ae0: 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  f terms */.  int
3af0: 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20   nSlot;         
3b00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3b10: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 5b  of entries in a[
3b20: 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  ] */.  WhereTerm
3b30: 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20   *a;            
3b40: 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64 65 73 63  /* Each a[] desc
3b50: 72 69 62 65 73 20 61 20 74 65 72 6d 20 6f 66 20  ribes a term of 
3b60: 74 68 65 20 57 48 45 52 45 20 63 6c 75 61 73 65  the WHERE cluase
3b70: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
3b80: 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f 53 54 41  SQLITE_SMALL_STA
3b90: 43 4b 29 0a 20 20 57 68 65 72 65 54 65 72 6d 20  CK).  WhereTerm 
3ba0: 61 53 74 61 74 69 63 5b 31 5d 3b 20 20 20 20 2f  aStatic[1];    /
3bb0: 2a 20 49 6e 69 74 69 61 6c 20 73 74 61 74 69 63  * Initial static
3bc0: 20 73 70 61 63 65 20 66 6f 72 20 61 5b 5d 20 2a   space for a[] *
3bd0: 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65 72 65 54  /.#else.  WhereT
3be0: 65 72 6d 20 61 53 74 61 74 69 63 5b 38 5d 3b 20  erm aStatic[8]; 
3bf0: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74     /* Initial st
3c00: 61 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61  atic space for a
3c10: 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  [] */.#endif.};.
3c20: 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65  ./*.** A WhereTe
3c30: 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74 6f  rm with eOperato
3c40: 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20 69 74 73  r==WO_OR has its
3c50: 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f 69 6e 74   u.pOrInfo point
3c60: 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61 20 64  er set to.** a d
3c70: 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
3c80: 61 74 65 64 20 69 6e 73 74 61 6e 63 65 20 6f 66  ated instance of
3c90: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
3ca0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
3cb0: 75 63 74 20 57 68 65 72 65 4f 72 49 6e 66 6f 20  uct WhereOrInfo 
3cc0: 7b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  {.  WhereClause 
3cd0: 77 63 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  wc;          /* 
3ce0: 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 69 6e  Decomposition in
3cf0: 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20  to subterms */. 
3d00: 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62   Bitmask indexab
3d10: 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74  le;       /* Bit
3d20: 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69 6e 64 65  mask of all inde
3d30: 78 61 62 6c 65 20 74 61 62 6c 65 73 20 69 6e 20  xable tables in 
3d40: 74 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 7d 3b  the clause */.};
3d50: 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54  ../*.** A WhereT
3d60: 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74  erm with eOperat
3d70: 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61 73 20 69  or==WO_AND has i
3d80: 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f 20 70 6f  ts u.pAndInfo po
3d90: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
3da0: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
3db0: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
3dc0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
3dd0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
3de0: 73 74 72 75 63 74 20 57 68 65 72 65 41 6e 64 49  struct WhereAndI
3df0: 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61  nfo {.  WhereCla
3e00: 75 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20  use wc;         
3e10: 20 2f 2a 20 54 68 65 20 73 75 62 65 78 70 72 65   /* The subexpre
3e20: 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20 6f 75 74  ssion broken out
3e30: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e   */.};../*.** An
3e40: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3e50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
3e60: 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b  ture keeps track
3e70: 20 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a   of a mapping.**
3e80: 20 62 65 74 77 65 65 6e 20 56 44 42 45 20 63 75   between VDBE cu
3e90: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e 64  rsor numbers and
3ea0: 20 62 69 74 73 20 6f 66 20 74 68 65 20 62 69 74   bits of the bit
3eb0: 6d 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54 65  masks in WhereTe
3ec0: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  rm..**.** The VD
3ed0: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
3ee0: 73 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65  s are small inte
3ef0: 67 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  gers contained i
3f00: 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69 74  n .** SrcList_it
3f10: 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20 45  em.iCursor and E
3f20: 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64  xpr.iTable field
3f30: 73 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76 65  s.  For any give
3f40: 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75  n WHERE .** clau
3f50: 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e  se, the cursor n
3f60: 75 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f 74  umbers might not
3f70: 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e   begin with 0 an
3f80: 64 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a 20  d they might.** 
3f90: 63 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e 20  contain gaps in 
3fa0: 74 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73 65  the numbering se
3fb0: 71 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65 20  quence.  But we 
3fc0: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61 78  want to make max
3fd0: 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20 74  imum.** use of t
3fe0: 68 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20 62  he bits in our b
3ff0: 69 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20 73  itmasks.  This s
4000: 74 72 75 63 74 75 72 65 20 70 72 6f 76 69 64 65  tructure provide
4010: 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 66  s a mapping.** f
4020: 72 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20 63  rom the sparse c
4030: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e  ursor numbers in
4040: 74 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69  to consecutive i
4050: 6e 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69 6e  ntegers beginnin
4060: 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a 0a  g.** with 0..**.
4070: 2a 2a 20 49 66 20 57 68 65 72 65 4d 61 73 6b 53  ** If WhereMaskS
4080: 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d  et.ix[A]==B it m
4090: 65 61 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d  eans that The A-
40a0: 74 68 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d  th bit of a Bitm
40b0: 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ask.** correspon
40c0: 64 73 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  ds VDBE cursor n
40d0: 75 6d 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d  umber B.  The A-
40e0: 74 68 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d  th bit of a bitm
40f0: 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a  ask is 1<<A..**.
4100: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
4110: 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
4120: 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75  use expression u
4130: 73 65 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a  sed these VDBE.*
4140: 2a 20 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35  * cursors:  4, 5
4150: 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e  , 8, 29, 57, 73.
4160: 20 20 54 68 65 6e 20 74 68 65 20 20 57 68 65 72    Then the  Wher
4170: 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
4180: 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20  re.** would map 
4190: 74 68 6f 73 65 20 63 75 72 73 6f 72 20 6e 75 6d  those cursor num
41a0: 62 65 72 73 20 69 6e 74 6f 20 62 69 74 73 20 30  bers into bits 0
41b0: 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a   through 5..**.*
41c0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
41d0: 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e  mapping is not n
41e0: 65 63 65 73 73 61 72 69 6c 79 20 6f 72 64 65 72  ecessarily order
41f0: 65 64 2e 20 20 49 6e 20 74 68 65 20 65 78 61 6d  ed.  In the exam
4200: 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68  ple.** above, th
4210: 65 20 6d 61 70 70 69 6e 67 20 6d 69 67 68 74 20  e mapping might 
4220: 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 34  go like this:  4
4230: 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c  ->3, 5->1, 8->2,
4240: 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35   29->0,.** 57->5
4250: 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65  , 73->4.  Or one
4260: 20 6f 66 20 37 31 39 20 6f 74 68 65 72 20 63 6f   of 719 other co
4270: 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74  mbinations might
4280: 20 62 65 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20   be used. It.** 
4290: 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  does not really 
42a0: 6d 61 74 74 65 72 2e 20 20 57 68 61 74 20 69 73  matter.  What is
42b0: 20 69 6d 70 6f 72 74 61 6e 74 20 69 73 20 74 68   important is th
42c0: 61 74 20 73 70 61 72 73 65 20 63 75 72 73 6f 72  at sparse cursor
42d0: 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20  .** numbers all 
42e0: 67 65 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  get mapped into 
42f0: 62 69 74 20 6e 75 6d 62 65 72 73 20 74 68 61 74  bit numbers that
4300: 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e   begin with 0 an
4310: 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20  d contain.** no 
4320: 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  gaps..*/.struct 
4330: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 7b 0a 20  WhereMaskSet {. 
4340: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4360: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 73 73 69  * Number of assi
4370: 67 6e 65 64 20 63 75 72 73 6f 72 20 76 61 6c 75  gned cursor valu
4380: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 78 5b 42  es */.  int ix[B
4390: 4d 53 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  MS];            
43a0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
43b0: 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63 68  assigned to each
43c0: 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a   bit */.};../*.*
43d0: 2a 20 54 68 69 73 20 6f 62 6a 65 63 74 20 69 73  * This object is
43e0: 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77   a convenience w
43f0: 72 61 70 70 65 72 20 68 6f 6c 64 69 6e 67 20 61  rapper holding a
4400: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e  ll information n
4410: 65 65 64 65 64 0a 2a 2a 20 74 6f 20 63 6f 6e 73  eeded.** to cons
4420: 74 72 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 20  truct WhereLoop 
4430: 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 70 61  objects for a pa
4440: 72 74 69 63 75 6c 61 72 20 71 75 65 72 79 2e 0a  rticular query..
4450: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4c  */.struct WhereL
4460: 6f 6f 70 42 75 69 6c 64 65 72 20 7b 0a 20 20 57  oopBuilder {.  W
4470: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
4480: 3b 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f  ;        /* Info
4490: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
44a0: 69 73 20 57 48 45 52 45 20 2a 2f 0a 20 20 57 68  is WHERE */.  Wh
44b0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
44c0: 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
44d0: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f   clause terms */
44e0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
44f0: 64 65 72 42 79 3b 20 20 20 20 20 20 20 2f 2a 20  derBy;       /* 
4500: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
4510: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
4520: 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 2f  pNew;          /
4530: 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65  * Template Where
4540: 4c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4f  Loop */.  WhereO
4550: 72 53 65 74 20 2a 70 4f 72 53 65 74 3b 20 20 20  rSet *pOrSet;   
4560: 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 62 65      /* Record be
4570: 73 74 20 6c 6f 6f 70 73 20 68 65 72 65 2c 20 69  st loops here, i
4580: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 7d 3b  f not NULL */.};
4590: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 57 48 45 52  ../*.** The WHER
45a0: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
45b0: 69 6e 67 20 72 6f 75 74 69 6e 65 20 68 61 73 20  ing routine has 
45c0: 74 77 6f 20 68 61 6c 76 65 73 2e 20 20 54 68 65  two halves.  The
45d0: 0a 2a 2a 20 66 69 72 73 74 20 70 61 72 74 20 64  .** first part d
45e0: 6f 65 73 20 74 68 65 20 73 74 61 72 74 20 6f 66  oes the start of
45f0: 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 20   the WHERE loop 
4600: 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a  and the second.*
4610: 2a 20 68 61 6c 66 20 64 6f 65 73 20 74 68 65 20  * half does the 
4620: 74 61 69 6c 20 6f 66 20 74 68 65 20 57 48 45 52  tail of the WHER
4630: 45 20 6c 6f 6f 70 2e 20 20 41 6e 20 69 6e 73 74  E loop.  An inst
4640: 61 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20  ance of.** this 
4650: 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65 74  structure is ret
4660: 75 72 6e 65 64 20 62 79 20 74 68 65 20 66 69 72  urned by the fir
4670: 73 74 20 68 61 6c 66 20 61 6e 64 20 70 61 73 73  st half and pass
4680: 65 64 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73  ed.** into the s
4690: 65 63 6f 6e 64 20 68 61 6c 66 20 74 6f 20 67 69  econd half to gi
46a0: 76 65 20 73 6f 6d 65 20 63 6f 6e 74 69 6e 75 69  ve some continui
46b0: 74 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 73  ty..**.** An ins
46c0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
46d0: 6a 65 63 74 20 68 6f 6c 64 73 20 74 68 65 20 63  ject holds the c
46e0: 6f 6d 70 6c 65 74 65 20 73 74 61 74 65 20 6f 66  omplete state of
46f0: 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 70 6c   the query.** pl
4700: 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 72 75 63 74  anner..*/.struct
4710: 20 57 68 65 72 65 49 6e 66 6f 20 7b 0a 20 20 50   WhereInfo {.  P
4720: 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
4730: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
4740: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
4750: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
4760: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
4770: 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 2f  abList;        /
4780: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
4790: 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   in the join */.
47a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
47b0: 65 72 42 79 3b 20 20 20 20 20 20 20 2f 2a 20 54  erBy;       /* T
47c0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
47d0: 73 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  se or NULL */.  
47e0: 45 78 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c  ExprList *pResul
47f0: 74 53 65 74 3b 20 20 20 20 20 2f 2a 20 52 65 73  tSet;     /* Res
4800: 75 6c 74 20 73 65 74 2e 20 44 49 53 54 49 4e 43  ult set. DISTINC
4810: 54 20 6f 70 65 72 61 74 65 73 20 6f 6e 20 74 68  T operates on th
4820: 65 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ese */.  WhereLo
4830: 6f 70 20 2a 70 4c 6f 6f 70 73 3b 20 20 20 20 20  op *pLoops;     
4840: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
4850: 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  l WhereLoop obje
4860: 63 74 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  cts */.  Bitmask
4870: 20 72 65 76 4d 61 73 6b 3b 20 20 20 20 20 20 20   revMask;       
4880: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52     /* Mask of OR
4890: 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61  DER BY terms tha
48a0: 74 20 6e 65 65 64 20 72 65 76 65 72 73 69 6e 67  t need reversing
48b0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
48c0: 6e 52 6f 77 4f 75 74 3b 20 20 20 20 20 20 20 20  nRowOut;        
48d0: 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d  /* Estimated num
48e0: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
48f0: 77 73 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  ws */.  u16 wctr
4900: 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  lFlags;         
4910: 20 20 2f 2a 20 46 6c 61 67 73 20 6f 72 69 67 69    /* Flags origi
4920: 6e 61 6c 6c 79 20 70 61 73 73 65 64 20 74 6f 20  nally passed to 
4930: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
4940: 6e 28 29 20 2a 2f 0a 20 20 75 38 20 62 4f 42 53  n() */.  u8 bOBS
4950: 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
4960: 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 73     /* ORDER BY s
4970: 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64 69  atisfied by indi
4980: 63 65 73 20 2a 2f 0a 20 20 75 38 20 6f 6b 4f 6e  ces */.  u8 okOn
4990: 65 50 61 73 73 3b 20 20 20 20 20 20 20 20 20 20  ePass;          
49a0: 20 20 20 2f 2a 20 4f 6b 20 74 6f 20 75 73 65 20     /* Ok to use 
49b0: 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
49c0: 68 6d 20 66 6f 72 20 55 50 44 41 54 45 2f 44 45  hm for UPDATE/DE
49d0: 4c 45 54 45 20 2a 2f 0a 20 20 75 38 20 75 6e 74  LETE */.  u8 unt
49e0: 65 73 74 65 64 54 65 72 6d 73 3b 20 20 20 20 20  estedTerms;     
49f0: 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 20 57      /* Not all W
4a00: 48 45 52 45 20 74 65 72 6d 73 20 72 65 73 6f 6c  HERE terms resol
4a10: 76 65 64 20 62 79 20 6f 75 74 65 72 20 6c 6f 6f  ved by outer loo
4a20: 70 20 2a 2f 0a 20 20 75 38 20 65 44 69 73 74 69  p */.  u8 eDisti
4a30: 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nct;            
4a40: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57   /* One of the W
4a50: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20  HERE_DISTINCT_* 
4a60: 76 61 6c 75 65 73 20 62 65 6c 6f 77 20 2a 2f 0a  values below */.
4a70: 20 20 75 38 20 6e 4c 65 76 65 6c 3b 20 20 20 20    u8 nLevel;    
4a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4a90: 75 6d 62 65 72 20 6f 66 20 6e 65 73 74 65 64 20  umber of nested 
4aa0: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 54  loop */.  int iT
4ab0: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
4ac0: 20 20 20 20 2f 2a 20 54 68 65 20 76 65 72 79 20      /* The very 
4ad0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
4ae0: 20 57 48 45 52 45 20 6c 6f 6f 70 20 2a 2f 0a 20   WHERE loop */. 
4af0: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 20   int iContinue; 
4b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
4b10: 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
4b20: 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 65  nue with next re
4b30: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 42  cord */.  int iB
4b40: 72 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20 20  reak;           
4b50: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
4b60: 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
4b70: 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
4b80: 6e 74 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  nt savedNQueryLo
4b90: 6f 70 3b 20 20 20 20 20 20 2f 2a 20 70 50 61 72  op;      /* pPar
4ba0: 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 6f  se->nQueryLoop o
4bb0: 75 74 73 69 64 65 20 74 68 65 20 57 48 45 52 45  utside the WHERE
4bc0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65   loop */.  Where
4bd0: 4d 61 73 6b 53 65 74 20 73 4d 61 73 6b 53 65 74  MaskSet sMaskSet
4be0: 3b 20 20 20 20 2f 2a 20 4d 61 70 20 63 75 72 73  ;    /* Map curs
4bf0: 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69  or numbers to bi
4c00: 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 57 68 65 72  tmasks */.  Wher
4c10: 65 43 6c 61 75 73 65 20 73 57 43 3b 20 20 20 20  eClause sWC;    
4c20: 20 20 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f        /* Decompo
4c30: 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 57 48  sition of the WH
4c40: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
4c50: 57 68 65 72 65 4c 65 76 65 6c 20 61 5b 31 5d 3b  WhereLevel a[1];
4c60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
4c70: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 65  ormation about e
4c80: 61 63 68 20 6e 65 73 74 20 6c 6f 6f 70 20 69 6e  ach nest loop in
4c90: 20 57 48 45 52 45 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   WHERE */.};../*
4ca0: 0a 2a 2a 20 42 69 74 6d 61 73 6b 73 20 66 6f 72  .** Bitmasks for
4cb0: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 6f   the operators o
4cc0: 6e 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65  n WhereTerm obje
4cd0: 63 74 73 2e 20 20 54 68 65 73 65 20 61 72 65 20  cts.  These are 
4ce0: 61 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 73  all.** operators
4cf0: 20 74 68 61 74 20 61 72 65 20 6f 66 20 69 6e 74   that are of int
4d00: 65 72 65 73 74 20 74 6f 20 74 68 65 20 71 75 65  erest to the que
4d10: 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 41 6e 0a  ry planner.  An.
4d20: 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61  ** OR-ed combina
4d30: 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61  tion of these va
4d40: 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73 65 64  lues can be used
4d50: 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20   when searching 
4d60: 66 6f 72 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61  for.** particula
4d70: 72 20 57 68 65 72 65 54 65 72 6d 73 20 77 69 74  r WhereTerms wit
4d80: 68 69 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73  hin a WhereClaus
4d90: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  e..*/.#define WO
4da0: 5f 49 4e 20 20 20 20 20 30 78 30 30 31 0a 23 64  _IN     0x001.#d
4db0: 65 66 69 6e 65 20 57 4f 5f 45 51 20 20 20 20 20  efine WO_EQ     
4dc0: 30 78 30 30 32 0a 23 64 65 66 69 6e 65 20 57 4f  0x002.#define WO
4dd0: 5f 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c  _LT     (WO_EQ<<
4de0: 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23  (TK_LT-TK_EQ)).#
4df0: 64 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20  define WO_LE    
4e00: 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d   (WO_EQ<<(TK_LE-
4e10: 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20  TK_EQ)).#define 
4e20: 57 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51  WO_GT     (WO_EQ
4e30: 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29  <<(TK_GT-TK_EQ))
4e40: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20  .#define WO_GE  
4e50: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47     (WO_EQ<<(TK_G
4e60: 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e  E-TK_EQ)).#defin
4e70: 65 20 57 4f 5f 4d 41 54 43 48 20 20 30 78 30 34  e WO_MATCH  0x04
4e80: 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e  0.#define WO_ISN
4e90: 55 4c 4c 20 30 78 30 38 30 0a 23 64 65 66 69 6e  ULL 0x080.#defin
4ea0: 65 20 57 4f 5f 4f 52 20 20 20 20 20 30 78 31 30  e WO_OR     0x10
4eb0: 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f  0       /* Two o
4ec0: 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63  r more OR-connec
4ed0: 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65  ted terms */.#de
4ee0: 66 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20 30  fine WO_AND    0
4ef0: 78 32 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77  x200       /* Tw
4f00: 6f 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d 63 6f  o or more AND-co
4f10: 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f  nnected terms */
4f20: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 55 49  .#define WO_EQUI
4f30: 56 20 20 30 78 34 30 30 20 20 20 20 20 20 20 2f  V  0x400       /
4f40: 2a 20 4f 66 20 74 68 65 20 66 6f 72 6d 20 41 3d  * Of the form A=
4f50: 3d 42 2c 20 62 6f 74 68 20 63 6f 6c 75 6d 6e 73  =B, both columns
4f60: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4e   */.#define WO_N
4f70: 4f 4f 50 20 20 20 30 78 38 30 30 20 20 20 20 20  OOP   0x800     
4f80: 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 64    /* This term d
4f90: 6f 65 73 20 6e 6f 74 20 72 65 73 74 72 69 63 74  oes not restrict
4fa0: 20 73 65 61 72 63 68 20 73 70 61 63 65 20 2a 2f   search space */
4fb0: 0a 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4c 4c  ..#define WO_ALL
4fc0: 20 20 20 20 30 78 66 66 66 20 20 20 20 20 20 20      0xfff       
4fd0: 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 70  /* Mask of all p
4fe0: 6f 73 73 69 62 6c 65 20 57 4f 5f 2a 20 76 61 6c  ossible WO_* val
4ff0: 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ues */.#define W
5000: 4f 5f 53 49 4e 47 4c 45 20 30 78 30 66 66 20 20  O_SINGLE 0x0ff  
5010: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
5020: 61 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64  all non-compound
5030: 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a   WO_* values */.
5040: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  ./*.** These are
5050: 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20   definitions of 
5060: 62 69 74 73 20 69 6e 20 74 68 65 20 57 68 65 72  bits in the Wher
5070: 65 4c 6f 6f 70 2e 77 73 46 6c 61 67 73 20 66 69  eLoop.wsFlags fi
5080: 65 6c 64 2e 0a 2a 2a 20 54 68 65 20 70 61 72 74  eld..** The part
5090: 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69  icular combinati
50a0: 6f 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 65 61  on of bits in ea
50b0: 63 68 20 57 68 65 72 65 4c 6f 6f 70 20 68 65 6c  ch WhereLoop hel
50c0: 70 20 74 6f 0a 2a 2a 20 64 65 74 65 72 6d 69 6e  p to.** determin
50d0: 65 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20  e the algorithm 
50e0: 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 72  that WhereLoop r
50f0: 65 70 72 65 73 65 6e 74 73 2e 0a 2a 2f 0a 23 64  epresents..*/.#d
5100: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
5110: 4d 4e 5f 45 51 20 20 20 20 30 78 30 30 30 30 30  MN_EQ    0x00000
5120: 30 30 31 20 20 2f 2a 20 78 3d 45 58 50 52 20 2a  001  /* x=EXPR *
5130: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
5140: 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30 78 30  COLUMN_RANGE 0x0
5150: 30 30 30 30 30 30 32 20 20 2f 2a 20 78 3c 45 58  0000002  /* x<EX
5160: 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52  PR and/or x>EXPR
5170: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
5180: 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 30  E_COLUMN_IN    0
5190: 78 30 30 30 30 30 30 30 34 20 20 2f 2a 20 78 20  x00000004  /* x 
51a0: 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66  IN (...) */.#def
51b0: 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ine WHERE_COLUMN
51c0: 5f 4e 55 4c 4c 20 20 30 78 30 30 30 30 30 30 30  _NULL  0x0000000
51d0: 38 20 20 2f 2a 20 78 20 49 53 20 4e 55 4c 4c 20  8  /* x IS NULL 
51e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
51f0: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20 20 30 78  _CONSTRAINT   0x
5200: 30 30 30 30 30 30 30 66 20 20 2f 2a 20 41 6e 79  0000000f  /* Any
5210: 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 43 4f   of the WHERE_CO
5220: 4c 55 4d 4e 5f 78 78 78 20 76 61 6c 75 65 73 20  LUMN_xxx values 
5230: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
5240: 5f 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20 30 78  _TOP_LIMIT    0x
5250: 30 30 30 30 30 30 31 30 20 20 2f 2a 20 78 3c 45  00000010  /* x<E
5260: 58 50 52 20 6f 72 20 78 3c 3d 45 58 50 52 20 63  XPR or x<=EXPR c
5270: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65  onstraint */.#de
5280: 66 69 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c  fine WHERE_BTM_L
5290: 49 4d 49 54 20 20 20 20 30 78 30 30 30 30 30 30  IMIT    0x000000
52a0: 32 30 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72  20  /* x>EXPR or
52b0: 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72 61   x>=EXPR constra
52c0: 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  int */.#define W
52d0: 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20  HERE_BOTH_LIMIT 
52e0: 20 20 30 78 30 30 30 30 30 30 33 30 20 20 2f 2a    0x00000030  /*
52f0: 20 42 6f 74 68 20 78 3e 45 58 50 52 20 61 6e 64   Both x>EXPR and
5300: 20 78 3c 45 58 50 52 20 2a 2f 0a 23 64 65 66 69   x<EXPR */.#defi
5310: 6e 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  ne WHERE_IDX_ONL
5320: 59 20 20 20 20 20 30 78 30 30 30 30 30 30 34 30  Y     0x00000040
5330: 20 20 2f 2a 20 55 73 65 20 69 6e 64 65 78 20 6f    /* Use index o
5340: 6e 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65  nly - omit table
5350: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
5360: 45 5f 49 50 4b 20 20 20 20 20 20 20 20 20 20 30  E_IPK          0
5370: 78 30 30 30 30 30 31 30 30 20 20 2f 2a 20 78 20  x00000100  /* x 
5380: 69 73 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  is the INTEGER P
5390: 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 23 64  RIMARY KEY */.#d
53a0: 65 66 69 6e 65 20 57 48 45 52 45 5f 49 4e 44 45  efine WHERE_INDE
53b0: 58 45 44 20 20 20 20 20 20 30 78 30 30 30 30 30  XED      0x00000
53c0: 32 30 30 20 20 2f 2a 20 57 68 65 72 65 4c 6f 6f  200  /* WhereLoo
53d0: 70 2e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  p.u.btree.pIndex
53e0: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 23 64 65   is valid */.#de
53f0: 66 69 6e 65 20 57 48 45 52 45 5f 56 49 52 54 55  fine WHERE_VIRTU
5400: 41 4c 54 41 42 4c 45 20 30 78 30 30 30 30 30 34  ALTABLE 0x000004
5410: 30 30 20 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70  00  /* WhereLoop
5420: 2e 75 2e 76 74 61 62 20 69 73 20 76 61 6c 69 64  .u.vtab is valid
5430: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
5440: 45 5f 49 4e 5f 41 42 4c 45 20 20 20 20 20 20 30  E_IN_ABLE      0
5450: 78 30 30 30 30 30 38 30 30 20 20 2f 2a 20 41 62  x00000800  /* Ab
5460: 6c 65 20 74 6f 20 73 75 70 70 6f 72 74 20 61 6e  le to support an
5470: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
5480: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4f 4e  #define WHERE_ON
5490: 45 52 4f 57 20 20 20 20 20 20 20 30 78 30 30 30  EROW       0x000
54a0: 30 31 30 30 30 20 20 2f 2a 20 53 65 6c 65 63 74  01000  /* Select
54b0: 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s no more than o
54c0: 6e 65 20 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e  ne row */.#defin
54d0: 65 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  e WHERE_MULTI_OR
54e0: 20 20 20 20 20 30 78 30 30 30 30 32 30 30 30 20       0x00002000 
54f0: 20 2f 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75 6c   /* OR using mul
5500: 74 69 70 6c 65 20 69 6e 64 69 63 65 73 20 2a 2f  tiple indices */
5510: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 41  .#define WHERE_A
5520: 55 54 4f 5f 49 4e 44 45 58 20 20 20 30 78 30 30  UTO_INDEX   0x00
5530: 30 30 34 30 30 30 20 20 2f 2a 20 55 73 65 73 20  004000  /* Uses 
5540: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
5550: 65 78 20 2a 2f 0a 0a 0a 2f 2a 20 43 6f 6e 76 65  ex */.../* Conve
5560: 72 74 20 61 20 57 68 65 72 65 43 6f 73 74 20 76  rt a WhereCost v
5570: 61 6c 75 65 20 28 31 30 20 74 69 6d 65 73 20 6c  alue (10 times l
5580: 6f 67 32 28 58 29 29 20 69 6e 74 6f 20 69 74 73  og2(X)) into its
5590: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 58   integer value X
55a0: 2e 0a 2a 2a 20 41 20 72 6f 75 67 68 20 61 70 70  ..** A rough app
55b0: 72 6f 78 69 6d 61 74 69 6f 6e 20 69 73 20 75 73  roximation is us
55c0: 65 64 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72  ed.  The value r
55d0: 65 74 75 72 6e 65 64 20 69 73 20 6e 6f 74 20 65  eturned is not e
55e0: 78 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  xact..*/.static 
55f0: 75 36 34 20 77 68 65 72 65 43 6f 73 74 54 6f 49  u64 whereCostToI
5600: 6e 74 28 57 68 65 72 65 43 6f 73 74 20 78 29 7b  nt(WhereCost x){
5610: 0a 20 20 75 36 34 20 6e 3b 0a 20 20 69 66 28 20  .  u64 n;.  if( 
5620: 78 3c 31 30 20 29 20 72 65 74 75 72 6e 20 31 3b  x<10 ) return 1;
5630: 0a 20 20 6e 20 3d 20 78 25 31 30 3b 0a 20 20 78  .  n = x%10;.  x
5640: 20 2f 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 3e   /= 10;.  if( n>
5650: 3d 35 20 29 20 6e 20 2d 3d 20 32 3b 0a 20 20 65  =5 ) n -= 2;.  e
5660: 6c 73 65 20 69 66 28 20 6e 3e 3d 31 20 29 20 6e  lse if( n>=1 ) n
5670: 20 2d 3d 20 31 3b 0a 20 20 69 66 28 20 78 3e 3d   -= 1;.  if( x>=
5680: 33 20 29 20 72 65 74 75 72 6e 20 28 6e 2b 38 29  3 ) return (n+8)
5690: 3c 3c 28 78 2d 33 29 3b 0a 20 20 72 65 74 75 72  <<(x-3);.  retur
56a0: 6e 20 28 6e 2b 38 29 3e 3e 28 33 2d 78 29 3b 0a  n (n+8)>>(3-x);.
56b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
56c0: 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  the estimated nu
56d0: 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
56e0: 6f 77 73 20 66 72 6f 6d 20 61 20 57 48 45 52 45  ows from a WHERE
56f0: 20 63 6c 61 75 73 65 0a 2a 2f 0a 75 36 34 20 73   clause.*/.u64 s
5700: 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75  qlite3WhereOutpu
5710: 74 52 6f 77 43 6f 75 6e 74 28 57 68 65 72 65 49  tRowCount(WhereI
5720: 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
5730: 72 65 74 75 72 6e 20 77 68 65 72 65 43 6f 73 74  return whereCost
5740: 54 6f 49 6e 74 28 70 57 49 6e 66 6f 2d 3e 6e 52  ToInt(pWInfo->nR
5750: 6f 77 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  owOut);.}../*.**
5760: 20 52 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74   Return one of t
5770: 68 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  he WHERE_DISTINC
5780: 54 5f 78 78 78 78 78 20 76 61 6c 75 65 73 20 74  T_xxxxx values t
5790: 6f 20 69 6e 64 69 63 61 74 65 20 68 6f 77 20 74  o indicate how t
57a0: 68 69 73 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  his.** WHERE cla
57b0: 75 73 65 20 72 65 74 75 72 6e 73 20 6f 75 74 70  use returns outp
57c0: 75 74 73 20 66 6f 72 20 44 49 53 54 49 4e 43 54  uts for DISTINCT
57d0: 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a   processing..*/.
57e0: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
57f0: 49 73 44 69 73 74 69 6e 63 74 28 57 68 65 72 65  IsDistinct(Where
5800: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
5810: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
5820: 65 44 69 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a  eDistinct;.}../*
5830: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
5840: 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
5850: 75 73 65 20 72 65 74 75 72 6e 73 20 72 6f 77 73  use returns rows
5860: 20 69 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 64   in ORDER BY ord
5870: 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41  er..** Return FA
5880: 4c 53 45 20 69 66 20 74 68 65 20 6f 75 74 70 75  LSE if the outpu
5890: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 6f  t needs to be so
58a0: 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rted..*/.int sql
58b0: 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72  ite3WhereIsOrder
58c0: 65 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ed(WhereInfo *pW
58d0: 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20  Info){.  return 
58e0: 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 21 3d  pWInfo->bOBSat!=
58f0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
5900: 72 6e 20 74 68 65 20 56 44 42 45 20 61 64 64 72  rn the VDBE addr
5910: 65 73 73 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20  ess or label to 
5920: 6a 75 6d 70 20 74 6f 20 69 6e 20 6f 72 64 65 72  jump to in order
5930: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20   to continue.** 
5940: 69 6d 6d 65 64 69 61 74 65 6c 79 20 77 69 74 68  immediately with
5950: 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66   the next row of
5960: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
5970: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
5980: 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65  hereContinueLabe
5990: 6c 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  l(WhereInfo *pWI
59a0: 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  nfo){.  return p
59b0: 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
59c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
59d0: 6e 20 74 68 65 20 56 44 42 45 20 61 64 64 72 65  n the VDBE addre
59e0: 73 73 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a  ss or label to j
59f0: 75 6d 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20  ump to in order 
5a00: 74 6f 20 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20  to break.** out 
5a10: 6f 66 20 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e  of a WHERE loop.
5a20: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
5a30: 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 57  hereBreakLabel(W
5a40: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
5a50: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  ){.  return pWIn
5a60: 66 6f 2d 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f  fo->iBreak;.}../
5a70: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
5a80: 20 69 66 20 61 6e 20 55 50 44 41 54 45 20 6f 72   if an UPDATE or
5a90: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
5aa0: 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 64 69  t can operate di
5ab0: 72 65 63 74 6c 79 20 6f 6e 0a 2a 2a 20 74 68 65  rectly on.** the
5ac0: 20 72 6f 77 69 64 73 20 72 65 74 75 72 6e 65 64   rowids returned
5ad0: 20 62 79 20 61 20 57 48 45 52 45 20 63 6c 61 75   by a WHERE clau
5ae0: 73 65 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  se.  Return FALS
5af0: 45 20 69 66 20 64 6f 69 6e 67 20 61 6e 0a 2a 2a  E if doing an.**
5b00: 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
5b10: 45 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 73  E might change s
5b20: 75 62 73 65 71 75 65 6e 74 20 57 48 45 52 45 20  ubsequent WHERE 
5b30: 63 6c 61 75 73 65 20 72 65 73 75 6c 74 73 2e 0a  clause results..
5b40: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
5b50: 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68 65  ereOkOnePass(Whe
5b60: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
5b70: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
5b80: 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b 0a 7d 0a 0a  ->okOnePass;.}..
5b90: 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
5ba0: 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72 63 20 69  ontent of pSrc i
5bb0: 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a 73 74 61  nto pDest.*/.sta
5bc0: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72  tic void whereOr
5bd0: 4d 6f 76 65 28 57 68 65 72 65 4f 72 53 65 74 20  Move(WhereOrSet 
5be0: 2a 70 44 65 73 74 2c 20 57 68 65 72 65 4f 72 53  *pDest, WhereOrS
5bf0: 65 74 20 2a 70 53 72 63 29 7b 0a 20 20 70 44 65  et *pSrc){.  pDe
5c00: 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d 3e 6e 3b  st->n = pSrc->n;
5c10: 0a 20 20 6d 65 6d 63 70 79 28 70 44 65 73 74 2d  .  memcpy(pDest-
5c20: 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20 70 44 65  >a, pSrc->a, pDe
5c30: 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28 70 44 65  st->n*sizeof(pDe
5c40: 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d 0a 0a 2f  st->a[0]));.}../
5c50: 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69 6e 73 65  *.** Try to inse
5c60: 72 74 20 61 20 6e 65 77 20 70 72 65 72 65 71 75  rt a new prerequ
5c70: 69 73 69 74 65 2f 63 6f 73 74 20 65 6e 74 72 79  isite/cost entry
5c80: 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72 65 4f   into the WhereO
5c90: 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a 0a 2a 2a  rSet pSet..**.**
5ca0: 20 54 68 65 20 6e 65 77 20 65 6e 74 72 79 20 6d   The new entry m
5cb0: 69 67 68 74 20 6f 76 65 72 77 72 69 74 65 20 61  ight overwrite a
5cc0: 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
5cd0: 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  , or it might be
5ce0: 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c 20 6f 72  .** appended, or
5cf0: 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 69 73   it might be dis
5d00: 63 61 72 64 65 64 2e 20 20 44 6f 20 77 68 61 74  carded.  Do what
5d10: 65 76 65 72 20 69 73 20 74 68 65 20 72 69 67 68  ever is the righ
5d20: 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f 20 74 68  t thing.** so th
5d30: 61 74 20 70 53 65 74 20 6b 65 65 70 73 20 74 68  at pSet keeps th
5d40: 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62 65 73 74  e N_OR_COST best
5d50: 20 65 6e 74 72 69 65 73 20 73 65 65 6e 20 73 6f   entries seen so
5d60: 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   far..*/.static 
5d70: 69 6e 74 20 77 68 65 72 65 4f 72 49 6e 73 65 72  int whereOrInser
5d80: 74 28 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20  t(.  WhereOrSet 
5d90: 2a 70 53 65 74 2c 20 20 20 20 20 20 2f 2a 20 54  *pSet,      /* T
5da0: 68 65 20 57 68 65 72 65 4f 72 53 65 74 20 74 6f  he WhereOrSet to
5db0: 20 62 65 20 75 70 64 61 74 65 64 20 2a 2f 0a 20   be updated */. 
5dc0: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 2c   Bitmask prereq,
5dd0: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65          /* Prere
5de0: 71 75 69 73 69 74 65 73 20 6f 66 20 74 68 65 20  quisites of the 
5df0: 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20 57  new entry */.  W
5e00: 68 65 72 65 43 6f 73 74 20 72 52 75 6e 2c 20 20  hereCost rRun,  
5e10: 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d 63 6f 73        /* Run-cos
5e20: 74 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74  t of the new ent
5e30: 72 79 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  ry */.  WhereCos
5e40: 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 2f  t nOut         /
5e50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  * Number of outp
5e60: 75 74 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20  uts for the new 
5e70: 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 31  entry */.){.  u1
5e80: 36 20 69 3b 0a 20 20 57 68 65 72 65 4f 72 43 6f  6 i;.  WhereOrCo
5e90: 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 70  st *p;.  for(i=p
5ea0: 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65 74 2d 3e  Set->n, p=pSet->
5eb0: 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 2b 2b  a; i>0; i--, p++
5ec0: 29 7b 0a 20 20 20 20 69 66 28 20 72 52 75 6e 3c  ){.    if( rRun<
5ed0: 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28 70 72 65  =p->rRun && (pre
5ee0: 72 65 71 20 26 20 70 2d 3e 70 72 65 72 65 71 29  req & p->prereq)
5ef0: 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20 20 20 20  ==prereq ){.    
5f00: 20 20 67 6f 74 6f 20 77 68 65 72 65 4f 72 49 6e    goto whereOrIn
5f10: 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d  sert_done;.    }
5f20: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e  .    if( p->rRun
5f30: 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d 3e 70 72  <=rRun && (p->pr
5f40: 65 72 65 71 20 26 20 70 72 65 72 65 71 29 3d 3d  ereq & prereq)==
5f50: 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a 20 20 20  p->prereq ){.   
5f60: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
5f70: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65   }.  }.  if( pSe
5f80: 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53 54 20 29  t->n<N_OR_COST )
5f90: 7b 0a 20 20 20 20 70 20 3d 20 26 70 53 65 74 2d  {.    p = &pSet-
5fa0: 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d 3b 0a 20  >a[pSet->n++];. 
5fb0: 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75     p->nOut = nOu
5fc0: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
5fd0: 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a 20 20 20  p = pSet->a;.   
5fe0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 53 65 74   for(i=1; i<pSet
5ff0: 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ->n; i++){.     
6000: 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e 70 53 65   if( p->rRun>pSe
6010: 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20 29 20 70  t->a[i].rRun ) p
6020: 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20 69 3b 0a   = pSet->a + i;.
6030: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
6040: 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29 20 72 65  >rRun<=rRun ) re
6050: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77 68 65 72  turn 0;.  }.wher
6060: 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3a 0a  eOrInsert_done:.
6070: 20 20 70 2d 3e 70 72 65 72 65 71 20 3d 20 70 72    p->prereq = pr
6080: 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52 75 6e 20  ereq;.  p->rRun 
6090: 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28 20 70 2d  = rRun;.  if( p-
60a0: 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20 70 2d 3e  >nOut>nOut ) p->
60b0: 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 72  nOut = nOut;.  r
60c0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
60d0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 70  * Initialize a p
60e0: 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  reallocated Wher
60f0: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
6100: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
6110: 64 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69  d whereClauseIni
6120: 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  t(.  WhereClause
6130: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 2f 2a   *pWC,        /*
6140: 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   The WhereClause
6150: 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   to be initializ
6160: 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  ed */.  WhereInf
6170: 6f 20 2a 70 57 49 6e 66 6f 20 20 20 20 20 20 20  o *pWInfo       
6180: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 70 72   /* The WHERE pr
6190: 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74  ocessing context
61a0: 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 57   */.){.  pWC->pW
61b0: 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20  Info = pWInfo;. 
61c0: 20 70 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 30   pWC->pOuter = 0
61d0: 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20 3d  ;.  pWC->nTerm =
61e0: 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f 74   0;.  pWC->nSlot
61f0: 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70 57 43   = ArraySize(pWC
6200: 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20 20 70 57  ->aStatic);.  pW
6210: 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74 61  C->a = pWC->aSta
6220: 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  tic;.}../* Forwa
6230: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
6240: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
6250: 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65  eClauseClear(Whe
6260: 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a 2f 2a 0a  reClause*);../*.
6270: 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c  ** Deallocate al
6280: 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  l memory associa
6290: 74 65 64 20 77 69 74 68 20 61 20 57 68 65 72 65  ted with a Where
62a0: 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a  OrInfo object..*
62b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
62c0: 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28  ereOrInfoDelete(
62d0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
62e0: 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b 0a 20 20  reOrInfo *p){.  
62f0: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
6300: 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69  (&p->wc);.  sqli
6310: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
6320: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
6330: 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79  ocate all memory
6340: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6350: 20 61 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20   a WhereAndInfo 
6360: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
6370: 63 20 76 6f 69 64 20 77 68 65 72 65 41 6e 64 49  c void whereAndI
6380: 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65  nfoDelete(sqlite
6390: 33 20 2a 64 62 2c 20 57 68 65 72 65 41 6e 64 49  3 *db, WhereAndI
63a0: 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65  nfo *p){.  where
63b0: 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e  ClauseClear(&p->
63c0: 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  wc);.  sqlite3Db
63d0: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
63e0: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
63f0: 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73   a WhereClause s
6400: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 57  tructure.  The W
6410: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
6420: 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69  ture.** itself i
6430: 73 20 6e 6f 74 20 66 72 65 65 64 2e 20 20 54 68  s not freed.  Th
6440: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
6450: 65 20 69 6e 76 65 72 73 65 20 6f 66 20 77 68 65  e inverse of whe
6460: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a  reClauseInit()..
6470: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
6480: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
6490: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
64a0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  ){.  int i;.  Wh
64b0: 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20 73 71  ereTerm *a;.  sq
64c0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d  lite3 *db = pWC-
64d0: 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  >pWInfo->pParse-
64e0: 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43  >db;.  for(i=pWC
64f0: 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43  ->nTerm-1, a=pWC
6500: 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  ->a; i>=0; i--, 
6510: 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d  a++){.    if( a-
6520: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
6530: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20  DYNAMIC ){.     
6540: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
6550: 74 65 28 64 62 2c 20 61 2d 3e 70 45 78 70 72 29  te(db, a->pExpr)
6560: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6570: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  a->wtFlags & TER
6580: 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20 20 20  M_ORINFO ){.    
6590: 20 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c    whereOrInfoDel
65a0: 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 4f 72  ete(db, a->u.pOr
65b0: 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Info);.    }else
65c0: 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20   if( a->wtFlags 
65d0: 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20 29  & TERM_ANDINFO )
65e0: 7b 0a 20 20 20 20 20 20 77 68 65 72 65 41 6e 64  {.      whereAnd
65f0: 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61  InfoDelete(db, a
6600: 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b 0a 20  ->u.pAndInfo);. 
6610: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
6620: 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74 61  WC->a!=pWC->aSta
6630: 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tic ){.    sqlit
6640: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 43  e3DbFree(db, pWC
6650: 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ->a);.  }.}../*.
6660: 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20  ** Add a single 
6670: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 65 6e  new WhereTerm en
6680: 74 72 79 20 74 6f 20 74 68 65 20 57 68 65 72 65  try to the Where
6690: 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57  Clause object pW
66a0: 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20 57 68  C..** The new Wh
66b0: 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 69  ereTerm object i
66c0: 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20 66 72  s constructed fr
66d0: 6f 6d 20 45 78 70 72 20 70 20 61 6e 64 20 77 69  om Expr p and wi
66e0: 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a 2a 20 54  th wtFlags..** T
66f0: 68 65 20 69 6e 64 65 78 20 69 6e 20 70 57 43 2d  he index in pWC-
6700: 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65 77 20  >a[] of the new 
6710: 57 68 65 72 65 54 65 72 6d 20 69 73 20 72 65 74  WhereTerm is ret
6720: 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
6730: 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74 75 72 6e  ..** 0 is return
6740: 65 64 20 69 66 20 74 68 65 20 6e 65 77 20 57 68  ed if the new Wh
6750: 65 72 65 54 65 72 6d 20 63 6f 75 6c 64 20 6e 6f  ereTerm could no
6760: 74 20 62 65 20 61 64 64 65 64 20 64 75 65 20 74  t be added due t
6770: 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c  o a memory.** al
6780: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2e 20  location error. 
6790: 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   The memory allo
67a0: 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 77  cation failure w
67b0: 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20  ill be recorded 
67c0: 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d 3e 6d 61  in.** the db->ma
67d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
67e0: 73 6f 20 74 68 61 74 20 68 69 67 68 65 72 2d 6c  so that higher-l
67f0: 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e 73 20 63  evel functions c
6800: 61 6e 20 64 65 74 65 63 74 20 69 74 2e 0a 2a 2a  an detect it..**
6810: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6820: 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74   will increase t
6830: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  he size of the p
6840: 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 20 61 73  WC->a[] array as
6850: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
6860: 2a 20 49 66 20 74 68 65 20 77 74 46 6c 61 67 73  * If the wtFlags
6870: 20 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c 75 64   argument includ
6880: 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 2c  es TERM_DYNAMIC,
6890: 20 74 68 65 6e 20 72 65 73 70 6f 6e 73 69 62 69   then responsibi
68a0: 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72 65 65  lity.** for free
68b0: 69 6e 67 20 74 68 65 20 65 78 70 72 65 73 73 69  ing the expressi
68c0: 6f 6e 20 70 20 69 73 20 61 73 73 75 6d 65 64 20  on p is assumed 
68d0: 62 79 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  by the WhereClau
68e0: 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a  se object pWC..*
68f0: 2a 20 54 68 69 73 20 69 73 20 74 72 75 65 20 65  * This is true e
6900: 76 65 6e 20 69 66 20 74 68 69 73 20 72 6f 75 74  ven if this rout
6910: 69 6e 65 20 66 61 69 6c 73 20 74 6f 20 61 6c 6c  ine fails to all
6920: 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72  ocate a new Wher
6930: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41 52  eTerm..**.** WAR
6940: 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f 75 74  NING:  This rout
6950: 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c 6c 6f  ine might reallo
6960: 63 61 74 65 20 74 68 65 20 73 70 61 63 65 20 75  cate the space u
6970: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20  sed to store.** 
6980: 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41 6c 6c  WhereTerms.  All
6990: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57 68 65   pointers to Whe
69a0: 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64 20 62  reTerms should b
69b0: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 66  e invalidated af
69c0: 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74  ter.** calling t
69d0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 53 75  his routine.  Su
69e0: 63 68 20 70 6f 69 6e 74 65 72 73 20 6d 61 79 20  ch pointers may 
69f0: 62 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64  be reinitialized
6a00: 20 62 79 20 72 65 66 65 72 65 6e 63 69 6e 67 0a   by referencing.
6a10: 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20  ** the pWC->a[] 
6a20: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
6a30: 20 69 6e 74 20 77 68 65 72 65 43 6c 61 75 73 65   int whereClause
6a40: 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c 61 75  Insert(WhereClau
6a50: 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70  se *pWC, Expr *p
6a60: 2c 20 75 38 20 77 74 46 6c 61 67 73 29 7b 0a 20  , u8 wtFlags){. 
6a70: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
6a80: 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  m;.  int idx;.  
6a90: 74 65 73 74 63 61 73 65 28 20 77 74 46 6c 61 67  testcase( wtFlag
6aa0: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
6ab0: 20 29 3b 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e   );.  if( pWC->n
6ac0: 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74  Term>=pWC->nSlot
6ad0: 20 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72   ){.    WhereTer
6ae0: 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61  m *pOld = pWC->a
6af0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
6b00: 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d  b = pWC->pWInfo-
6b10: 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20  >pParse->db;.   
6b20: 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c 69 74 65   pWC->a = sqlite
6b30: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
6b40: 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30   sizeof(pWC->a[0
6b50: 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20  ])*pWC->nSlot*2 
6b60: 29 3b 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e  );.    if( pWC->
6b70: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  a==0 ){.      if
6b80: 28 20 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ( wtFlags & TERM
6b90: 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20  _DYNAMIC ){.    
6ba0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6bb0: 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20  elete(db, p);.  
6bc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 43 2d      }.      pWC-
6bd0: 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20  >a = pOld;.     
6be0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
6bf0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 57 43 2d  .    memcpy(pWC-
6c00: 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66  >a, pOld, sizeof
6c10: 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d  (pWC->a[0])*pWC-
6c20: 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28  >nTerm);.    if(
6c30: 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61   pOld!=pWC->aSta
6c40: 74 69 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  tic ){.      sql
6c50: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
6c60: 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Old);.    }.    
6c70: 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c  pWC->nSlot = sql
6c80: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65  ite3DbMallocSize
6c90: 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f 73 69 7a  (db, pWC->a)/siz
6ca0: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a  eof(pWC->a[0]);.
6cb0: 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70    }.  pTerm = &p
6cc0: 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70 57 43 2d  WC->a[idx = pWC-
6cd0: 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20 70 54 65  >nTerm++];.  pTe
6ce0: 72 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69  rm->pExpr = sqli
6cf0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
6d00: 74 65 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e  te(p);.  pTerm->
6d10: 77 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67  wtFlags = wtFlag
6d20: 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20  s;.  pTerm->pWC 
6d30: 3d 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e  = pWC;.  pTerm->
6d40: 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20  iParent = -1;.  
6d50: 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f  return idx;.}../
6d60: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6d70: 65 20 69 64 65 6e 74 69 66 69 65 73 20 73 75 62  e identifies sub
6d80: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
6d90: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
6da0: 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75  where.** each su
6db0: 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
6dc0: 65 70 61 72 61 74 65 64 20 62 79 20 74 68 65 20  eparated by the 
6dd0: 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  AND operator or 
6de0: 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70  some other.** op
6df0: 65 72 61 74 6f 72 20 73 70 65 63 69 66 69 65 64  erator specified
6e00: 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d   in the op param
6e10: 65 74 65 72 2e 20 20 54 68 65 20 57 68 65 72 65  eter.  The Where
6e20: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
6e30: 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69  .** is filled wi
6e40: 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73  th pointers to s
6e50: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  ubexpressions.  
6e60: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
6e70: 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d  **    WHERE  a==
6e80: 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c  'hello' AND coal
6e90: 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e  esce(b,11)<10 AN
6ea0: 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d  D (c+12!=d OR c=
6eb0: 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =22).**         
6ec0: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20    \________/    
6ed0: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
6ee0: 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  _/     \________
6ef0: 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
6f00: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20          slot[0] 
6f10: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
6f20: 31 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1]              
6f30: 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54   slot[2].**.** T
6f40: 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52  he original WHER
6f50: 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70  E clause in pExp
6f60: 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20  r is unaltered. 
6f70: 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e   All this routin
6f80: 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b  e.** does is mak
6f90: 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73  e slot[] entries
6fa0: 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72   point to substr
6fb0: 75 63 74 75 72 65 20 77 69 74 68 69 6e 20 70 45  ucture within pE
6fc0: 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  xpr..**.** In th
6fd0: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
6fe0: 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64  nce and in the d
6ff0: 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22  iagram, "slot[]"
7000: 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68   refers to.** th
7010: 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b  e WhereClause.a[
7020: 5d 20 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c  ] array.  The sl
7030: 6f 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73  ot[] array grows
7040: 20 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f   as needed to co
7050: 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72  ntain.** all ter
7060: 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
7070: 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  clause..*/.stati
7080: 63 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69  c void whereSpli
7090: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
70a0: 57 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  WC, Expr *pExpr,
70b0: 20 75 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e   u8 op){.  pWC->
70c0: 6f 70 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70  op = op;.  if( p
70d0: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
70e0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
70f0: 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65  p!=op ){.    whe
7100: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
7110: 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  WC, pExpr, 0);. 
7120: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72   }else{.    wher
7130: 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70  eSplit(pWC, pExp
7140: 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20  r->pLeft, op);. 
7150: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57     whereSplit(pW
7160: 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  C, pExpr->pRight
7170: 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  , op);.  }.}../*
7180: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
7190: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62   WhereMaskSet ob
71a0: 6a 65 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ject.*/.#define 
71b0: 69 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20  initMaskSet(P)  
71c0: 28 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20  (P)->n=0../*.** 
71d0: 52 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61  Return the bitma
71e0: 73 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  sk for the given
71f0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20   cursor number. 
7200: 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20   Return 0 if.** 
7210: 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69  iCursor is not i
7220: 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74  n the set..*/.st
7230: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74  atic Bitmask get
7240: 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65  Mask(WhereMaskSe
7250: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74  t *pMaskSet, int
7260: 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74   iCursor){.  int
7270: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   i;.  assert( pM
7280: 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29  askSet->n<=(int)
7290: 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a  sizeof(Bitmask)*
72a0: 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  8 );.  for(i=0; 
72b0: 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69  i<pMaskSet->n; i
72c0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61  ++){.    if( pMa
72d0: 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43  skSet->ix[i]==iC
72e0: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72  ursor ){.      r
72f0: 65 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29  eturn MASKBIT(i)
7300: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
7310: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
7320: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61   Create a new ma
7330: 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43  sk for cursor iC
7340: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
7350: 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72  re is one cursor
7360: 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68   per table in th
7370: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
7380: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  The number of.**
7390: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
73a0: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
73b0: 6d 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20  mited by a test 
73c0: 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20  early in the.** 
73d0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
73e0: 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f  n() routine.  So
73f0: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
7400: 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d  e pMaskSet->ix[]
7410: 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e  .** array will n
7420: 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a  ever overflow..*
7430: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72  /.static void cr
7440: 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61  eateMask(WhereMa
7450: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
7460: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
7470: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
7480: 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65  t->n < ArraySize
7490: 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29  (pMaskSet->ix) )
74a0: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  ;.  pMaskSet->ix
74b0: 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20  [pMaskSet->n++] 
74c0: 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a  = iCursor;.}../*
74d0: 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
74e0: 65 73 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69  es walk (recursi
74f0: 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73  vely) an express
7500: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e  ion tree and gen
7510: 65 72 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61  erate.** a bitma
7520: 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68  sk indicating wh
7530: 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75  ich tables are u
7540: 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72  sed in that expr
7550: 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a  ession.** tree..
7560: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
7570: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
7580: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
7590: 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  t*, ExprList*);.
75a0: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
75b0: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
75c0: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
75d0: 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61  *, Select*);.sta
75e0: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
75f0: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
7600: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
7610: 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42  t, Expr *p){.  B
7620: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
7630: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
7640: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
7650: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
7660: 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74  {.    mask = get
7670: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
7680: 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72  ->iTable);.    r
7690: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a  eturn mask;.  }.
76a0: 20 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62    mask = exprTab
76b0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
76c0: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
76d0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
76e0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
76f0: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66   p->pLeft);.  if
7700: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
7710: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
7720: 74 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c  t) ){.    mask |
7730: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
7740: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
7750: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a   p->x.pSelect);.
7760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73    }else{.    mas
7770: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
7780: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
7790: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  , p->x.pList);. 
77a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
77b0: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
77c0: 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  sk exprListTable
77d0: 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53  Usage(WhereMaskS
77e0: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78  et *pMaskSet, Ex
77f0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
7800: 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61    int i;.  Bitma
7810: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69  sk mask = 0;.  i
7820: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
7830: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
7840: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
7850: 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70       mask |= exp
7860: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
7870: 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  kSet, pList->a[i
7880: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ].pExpr);.    }.
7890: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73    }.  return mas
78a0: 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d  k;.}.static Bitm
78b0: 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61  ask exprSelectTa
78c0: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
78d0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
78e0: 20 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20   Select *pS){.  
78f0: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30  Bitmask mask = 0
7900: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b  ;.  while( pS ){
7910: 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
7920: 72 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  rc = pS->pSrc;. 
7930: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
7940: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
7950: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69  askSet, pS->pELi
7960: 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  st);.    mask |=
7970: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
7980: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
7990: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
79a0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
79b0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
79c0: 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72  kSet, pS->pOrder
79d0: 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  By);.    mask |=
79e0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
79f0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57  pMaskSet, pS->pW
7a00: 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20  here);.    mask 
7a10: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
7a20: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
7a30: 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66  pHaving);.    if
7a40: 28 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30  ( ALWAYS(pSrc!=0
7a50: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
7a60: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
7a70: 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69   i<pSrc->nSrc; i
7a80: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73  ++){.        mas
7a90: 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54  k |= exprSelectT
7aa0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
7ab0: 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  et, pSrc->a[i].p
7ac0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
7ad0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
7ae0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
7af0: 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e  , pSrc->a[i].pOn
7b00: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7b10: 0a 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50  .    pS = pS->pP
7b20: 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rior;.  }.  retu
7b30: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn mask;.}../*.*
7b40: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
7b50: 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61   the given opera
7b60: 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  tor is one of th
7b70: 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  e operators that
7b80: 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66   is.** allowed f
7b90: 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20  or an indexable 
7ba0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
7bb0: 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20  m.  The allowed 
7bc0: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a  operators are.**
7bd0: 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20   "=", "<", ">", 
7be0: 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22  "<=", ">=", "IN"
7bf0: 2c 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a  , and "IS NULL".
7c00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
7c10: 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b  lowedOp(int op){
7c20: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54  .  assert( TK_GT
7c30: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c  >TK_EQ && TK_GT<
7c40: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
7c50: 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26  t( TK_LT>TK_EQ &
7c60: 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b  & TK_LT<TK_GE );
7c70: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45  .  assert( TK_LE
7c80: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c  >TK_EQ && TK_LE<
7c90: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
7ca0: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b  t( TK_GE==TK_EQ+
7cb0: 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70  4 );.  return op
7cc0: 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d  ==TK_IN || (op>=
7cd0: 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f  TK_EQ && op<=TK_
7ce0: 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53  GE) || op==TK_IS
7cf0: 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  NULL;.}../*.** S
7d00: 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20  wap two objects 
7d10: 6f 66 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f  of type TYPE..*/
7d20: 0a 23 64 65 66 69 6e 65 20 53 57 41 50 28 54 59  .#define SWAP(TY
7d30: 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d  PE,A,B) {TYPE t=
7d40: 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f  A; A=B; B=t;}../
7d50: 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63  *.** Commute a c
7d60: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
7d70: 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73  or.  Expressions
7d80: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
7d90: 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e  op Y".** are con
7da0: 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f  verted into "Y o
7db0: 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c  p X"..**.** If l
7dc0: 65 66 74 2f 72 69 67 68 74 20 70 72 65 63 65 64  eft/right preced
7dd0: 65 6e 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20  ence rules come 
7de0: 69 6e 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64  into play when d
7df0: 65 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a  etermining the.*
7e00: 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * collating sequ
7e10: 65 6e 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c 41  ence, then COLLA
7e20: 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65  TE operators are
7e30: 20 61 64 6a 75 73 74 65 64 20 74 6f 20 65 6e 73   adjusted to ens
7e40: 75 72 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ure.** that the 
7e50: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
7e60: 63 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e  ce does not chan
7e70: 67 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ge.  For example
7e80: 3a 0a 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65 20  :.** "Y collate 
7e90: 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62 65 63  NOCASE op X" bec
7ea0: 6f 6d 65 73 20 22 58 20 6f 70 20 59 22 20 62 65  omes "X op Y" be
7eb0: 63 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74  cause any collat
7ec0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a  ion sequence on.
7ed0: 2a 2a 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64  ** the left hand
7ee0: 20 73 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61   side of a compa
7ef0: 72 69 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  rison overrides 
7f00: 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  any collation se
7f10: 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63  quence .** attac
7f20: 68 65 64 20 74 6f 20 74 68 65 20 72 69 67 68 74  hed to the right
7f30: 2e 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72  . For the same r
7f40: 65 61 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c  eason the EP_Col
7f50: 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20  late flag.** is 
7f60: 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f  not commuted..*/
7f70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
7f80: 72 43 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a  rCommute(Parse *
7f90: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
7fa0: 78 70 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52  xpr){.  u16 expR
7fb0: 69 67 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70  ight = (pExpr->p
7fc0: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
7fd0: 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31  P_Collate);.  u1
7fe0: 36 20 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78  6 expLeft = (pEx
7ff0: 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73  pr->pLeft->flags
8000: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a   & EP_Collate);.
8010: 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65    assert( allowe
8020: 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26  dOp(pExpr->op) &
8030: 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  & pExpr->op!=TK_
8040: 49 4e 20 29 3b 0a 20 20 69 66 28 20 65 78 70 52  IN );.  if( expR
8050: 69 67 68 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b  ight==expLeft ){
8060: 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 58  .    /* Either X
8070: 20 61 6e 64 20 59 20 62 6f 74 68 20 68 61 76 65   and Y both have
8080: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
8090: 72 20 6f 72 20 6e 65 69 74 68 65 72 20 64 6f 20  r or neither do 
80a0: 2a 2f 0a 20 20 20 20 69 66 28 20 65 78 70 52 69  */.    if( expRi
80b0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ght ){.      /* 
80c0: 42 6f 74 68 20 58 20 61 6e 64 20 59 20 68 61 76  Both X and Y hav
80d0: 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  e COLLATE operat
80e0: 6f 72 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ors.  Make sure 
80f0: 58 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20  X is always.    
8100: 20 20 2a 2a 20 75 73 65 64 20 62 79 20 63 6c 65    ** used by cle
8110: 61 72 69 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c  aring the EP_Col
8120: 6c 61 74 65 20 66 6c 61 67 20 66 72 6f 6d 20 59  late flag from Y
8130: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72  . */.      pExpr
8140: 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ->pRight->flags 
8150: 26 3d 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a  &= ~EP_Collate;.
8160: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
8170: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
8180: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
8190: 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20  pLeft)!=0 ){.   
81a0: 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 58 20     /* Neither X 
81b0: 6e 6f 72 20 59 20 68 61 76 65 20 43 4f 4c 4c 41  nor Y have COLLA
81c0: 54 45 20 6f 70 65 72 61 74 6f 72 73 2c 20 62 75  TE operators, bu
81d0: 74 20 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65  t X has a non-de
81e0: 66 61 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63  fault.      ** c
81f0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
8200: 65 2e 20 20 53 6f 20 61 64 64 20 74 68 65 20 45  e.  So add the E
8210: 50 5f 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72  P_Collate marker
8220: 20 6f 6e 20 58 20 74 6f 20 63 61 75 73 65 0a 20   on X to cause. 
8230: 20 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65       ** it to be
8240: 20 73 65 61 72 63 68 65 64 20 66 69 72 73 74 2e   searched first.
8250: 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
8260: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d  >pLeft->flags |=
8270: 20 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20   EP_Collate;.   
8280: 20 7d 0a 20 20 7d 0a 20 20 53 57 41 50 28 45 78   }.  }.  SWAP(Ex
8290: 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68  pr*,pExpr->pRigh
82a0: 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  t,pExpr->pLeft);
82b0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
82c0: 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61  >=TK_GT ){.    a
82d0: 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b  ssert( TK_LT==TK
82e0: 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73  _GT+2 );.    ass
82f0: 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c  ert( TK_GE==TK_L
8300: 45 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  E+2 );.    asser
8310: 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29  t( TK_GT>TK_EQ )
8320: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
8330: 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  _GT<TK_LE );.   
8340: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
8350: 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78  op>=TK_GT && pEx
8360: 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b  pr->op<=TK_GE );
8370: 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
8380: 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f   ((pExpr->op-TK_
8390: 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20  GT)^2)+TK_GT;.  
83a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  }.}../*.** Trans
83b0: 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20  late from TK_xx 
83c0: 6f 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78  operator to WO_x
83d0: 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74  x bitmask..*/.st
83e0: 61 74 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f  atic u16 operato
83f0: 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20  rMask(int op){. 
8400: 20 75 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74   u16 c;.  assert
8410: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20  ( allowedOp(op) 
8420: 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
8430: 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f  IN ){.    c = WO
8440: 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _IN;.  }else if(
8450: 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
8460: 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e  {.    c = WO_ISN
8470: 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
8480: 20 20 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51    assert( (WO_EQ
8490: 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20  <<(op-TK_EQ)) < 
84a0: 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20  0x7fff );.    c 
84b0: 3d 20 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28  = (u16)(WO_EQ<<(
84c0: 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a  op-TK_EQ));.  }.
84d0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
84e0: 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f  _ISNULL || c==WO
84f0: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73  _ISNULL );.  ass
8500: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c  ert( op!=TK_IN |
8510: 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20  | c==WO_IN );.  
8520: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45  assert( op!=TK_E
8530: 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b  Q || c==WO_EQ );
8540: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
8550: 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54  K_LT || c==WO_LT
8560: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
8570: 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f  !=TK_LE || c==WO
8580: 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _LE );.  assert(
8590: 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d   op!=TK_GT || c=
85a0: 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65  =WO_GT );.  asse
85b0: 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c  rt( op!=TK_GE ||
85c0: 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72   c==WO_GE );.  r
85d0: 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn c;.}../*.*
85e0: 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65  * Advance to the
85f0: 20 6e 65 78 74 20 57 68 65 72 65 54 65 72 6d 20   next WhereTerm 
8600: 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 63 63  that matches acc
8610: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72  ording to the cr
8620: 69 74 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c  iteria.** establ
8630: 69 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 70  ished when the p
8640: 53 63 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20  Scan object was 
8650: 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77  initialized by w
8660: 68 65 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a  hereScanInit()..
8670: 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
8680: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  f there are no m
8690: 6f 72 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65  ore matching Whe
86a0: 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74  reTerms..*/.stat
86b0: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68  ic WhereTerm *wh
86c0: 65 72 65 53 63 61 6e 4e 65 78 74 28 57 68 65 72  ereScanNext(Wher
86d0: 65 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20  eScan *pScan){. 
86e0: 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
86f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
8700: 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f  sor on the LHS o
8710: 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20  f the term */.  
8720: 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  int iColumn;    
8730: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75       /* The colu
8740: 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66  mn on the LHS of
8750: 20 74 68 65 20 74 65 72 6d 2e 20 20 2d 31 20 66   the term.  -1 f
8760: 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72  or IPK */.  Expr
8770: 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
8780: 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f   /* An expressio
8790: 6e 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a  n being tested *
87a0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
87b0: 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72  *pWC;    /* Shor
87c0: 74 68 61 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d  thand for pScan-
87d0: 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65 72 65 54  >pWC */.  WhereT
87e0: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f  erm *pTerm;    /
87f0: 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67  * The term being
8800: 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74   tested */.  int
8810: 20 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20   k = pScan->k;  
8820: 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74    /* Where to st
8830: 61 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a  art scanning */.
8840: 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d  .  while( pScan-
8850: 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e  >iEquiv<=pScan->
8860: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43  nEquiv ){.    iC
8870: 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75  ur = pScan->aEqu
8880: 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  iv[pScan->iEquiv
8890: 2d 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e  -2];.    iColumn
88a0: 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76   = pScan->aEquiv
88b0: 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31  [pScan->iEquiv-1
88c0: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70  ];.    while( (p
88d0: 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29  WC = pScan->pWC)
88e0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  !=0 ){.      for
88f0: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b  (pTerm=pWC->a+k;
8900: 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b   k<pWC->nTerm; k
8910: 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
8920: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
8930: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
8940: 72 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  r && pTerm->u.le
8950: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
8960: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
8970: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
8980: 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 29  ator & WO_EQUIV)
8990: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  !=0.           &
89a0: 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c  & pScan->nEquiv<
89b0: 41 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e 2d  ArraySize(pScan-
89c0: 3e 61 45 71 75 69 76 29 0a 20 20 20 20 20 20 20  >aEquiv).       
89d0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
89e0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
89f0: 20 20 20 20 20 70 58 20 3d 20 73 71 6c 69 74 65       pX = sqlite
8a00: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
8a10: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  (pTerm->pExpr->p
8a20: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
8a30: 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e      assert( pX->
8a40: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
8a50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
8a60: 28 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e  (j=0; j<pScan->n
8a70: 45 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20  Equiv; j+=2){.  
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
8a90: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d  pScan->aEquiv[j]
8aa0: 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20  ==pX->iTable.   
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
8ac0: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31  Scan->aEquiv[j+1
8ad0: 5d 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29  ]==pX->iColumn )
8ae0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
8af0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8b00: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8b10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8b20: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 53 63 61       if( j==pSca
8b30: 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20  n->nEquiv ){.   
8b40: 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e             pScan
8b50: 2d 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58  ->aEquiv[j] = pX
8b60: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
8b70: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
8b80: 45 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d  Equiv[j+1] = pX-
8b90: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
8ba0: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e          pScan->n
8bb0: 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20  Equiv += 2;.    
8bc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8bd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8be0: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
8bf0: 72 61 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f  rator & pScan->o
8c00: 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20  pMask)!=0 ){.   
8c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69           /* Veri
8c20: 66 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  fy the affinity 
8c30: 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
8c40: 71 75 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a  quence match */.
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
8c60: 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65  pScan->zCollName
8c70: 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65   && (pTerm->eOpe
8c80: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
8c90: 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  L)==0 ){.       
8ca0: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
8cb0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  pColl;.         
8cc0: 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72       Parse *pPar
8cd0: 73 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  se = pWC->pWInfo
8ce0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
8cf0: 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 54 65          pX = pTe
8d00: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
8d10: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71           if( !sq
8d20: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
8d30: 74 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e  tyOk(pX, pScan->
8d40: 69 64 78 61 66 66 29 20 29 7b 0a 20 20 20 20 20  idxaff) ){.     
8d50: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
8d60: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
8d70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
8d80: 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c     assert(pX->pL
8d90: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eft);.          
8da0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
8db0: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
8dc0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 0a  CollSeq(pParse,.
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e00: 20 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d    pX->pLeft, pX-
8e10: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
8e20: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
8e30: 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70  l==0 ) pColl = p
8e40: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
8e50: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
8e60: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
8e70: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
8e80: 61 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  ame, pScan->zCol
8e90: 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  lName) ){.      
8ea0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
8eb0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
8ec0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
8ed0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
8ee0: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
8ef0: 74 6f 72 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a  tor & WO_EQ)!=0.
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
8f10: 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  (pX = pTerm->pEx
8f20: 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d  pr->pRight)->op=
8f30: 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20  =TK_COLUMN.     
8f40: 20 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69          && pX->i
8f50: 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45  Table==pScan->aE
8f60: 71 75 69 76 5b 30 5d 0a 20 20 20 20 20 20 20 20  quiv[0].        
8f70: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c       && pX->iCol
8f80: 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75  umn==pScan->aEqu
8f90: 69 76 5b 31 5d 0a 20 20 20 20 20 20 20 20 20 20  iv[1].          
8fa0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
8fb0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
8fc0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8fd0: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20         pScan->k 
8fe0: 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  = k+1;.         
8ff0: 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b     return pTerm;
9000: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
9010: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9020: 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20       pScan->pWC 
9030: 3d 20 70 53 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f  = pScan->pWC->pO
9040: 75 74 65 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20  uter;.      k = 
9050: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63  0;.    }.    pSc
9060: 61 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d  an->pWC = pScan-
9070: 3e 70 4f 72 69 67 57 43 3b 0a 20 20 20 20 6b 20  >pOrigWC;.    k 
9080: 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e  = 0;.    pScan->
9090: 69 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d  iEquiv += 2;.  }
90a0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
90b0: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
90c0: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
90d0: 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20  scanner object. 
90e0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
90f0: 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73  r to the.** firs
9100: 74 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72 6e  t match.  Return
9110: 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61   NULL if there a
9120: 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a  re no matches..*
9130: 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65 72  *.** The scanner
9140: 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 69   will be searchi
9150: 6e 67 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ng the WHERE cla
9160: 75 73 65 20 70 57 43 2e 20 20 49 74 20 77 69 6c  use pWC.  It wil
9170: 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65  l look.** for te
9180: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rms of the form 
9190: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20  "X <op> <expr>" 
91a0: 77 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75 6d  where X is colum
91b0: 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  n iColumn of tab
91c0: 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54 68 65  le.** iCur.  The
91d0: 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e   <op> must be on
91e0: 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f  e of the operato
91f0: 72 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20  rs described by 
9200: 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  opMask..**.** If
9210: 20 74 68 65 20 73 65 61 72 63 68 20 69 73 20 66   the search is f
9220: 6f 72 20 58 20 61 6e 64 20 74 68 65 20 57 48 45  or X and the WHE
9230: 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  RE clause contai
9240: 6e 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  ns terms of the.
9250: 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e  ** form X=Y then
9260: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
9270: 67 68 74 20 61 6c 73 6f 20 72 65 74 75 72 6e 20  ght also return 
9280: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  terms of the for
9290: 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78  m.** "Y <op> <ex
92a0: 70 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62 65  pr>".  The numbe
92b0: 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20 74  r of levels of t
92c0: 72 61 6e 73 69 74 69 76 69 74 79 20 69 73 20 6c  ransitivity is l
92d0: 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69  imited,.** but i
92e0: 73 20 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64  s enough to hand
92f0: 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79  le most commonly
9300: 20 6f 63 63 75 72 72 69 6e 67 20 53 51 4c 20 73   occurring SQL s
9310: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a  tatements..**.**
9320: 20 49 66 20 58 20 69 73 20 6e 6f 74 20 74 68 65   If X is not the
9330: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
9340: 20 4b 45 59 20 74 68 65 6e 20 58 20 6d 75 73 74   KEY then X must
9350: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
9360: 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64  ith.** index pId
9370: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  x..*/.static Whe
9380: 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61  reTerm *whereSca
9390: 6e 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53 63  nInit(.  WhereSc
93a0: 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20  an *pScan,      
93b0: 20 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63 61   /* The WhereSca
93c0: 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 69  n object being i
93d0: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
93e0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
93f0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57  ,       /* The W
9400: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
9410: 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69  e scanned */.  i
9420: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
9430: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
9440: 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a   to scan for */.
9450: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
9460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
9470: 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72 20  umn to scan for 
9480: 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c  */.  u32 opMask,
9490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
94a0: 4f 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20 73  Operator(s) to s
94b0: 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64  can for */.  Ind
94c0: 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
94d0: 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
94e0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
94f0: 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b  this index */.){
9500: 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20  .  int j;..  /* 
9510: 6d 65 6d 73 65 74 28 70 53 63 61 6e 2c 20 30 2c  memset(pScan, 0,
9520: 20 73 69 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29   sizeof(*pScan))
9530: 3b 20 2a 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f  ; */.  pScan->pO
9540: 72 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20 70  rigWC = pWC;.  p
9550: 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b  Scan->pWC = pWC;
9560: 0a 20 20 69 66 28 20 70 49 64 78 20 26 26 20 69  .  if( pIdx && i
9570: 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
9580: 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d   pScan->idxaff =
9590: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
95a0: 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66  Col[iColumn].aff
95b0: 69 6e 69 74 79 3b 0a 20 20 20 20 66 6f 72 28 6a  inity;.    for(j
95c0: 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  =0; pIdx->aiColu
95d0: 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20  mn[j]!=iColumn; 
95e0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
95f0: 4e 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e  NEVER(j>=pIdx->n
9600: 43 6f 6c 75 6d 6e 29 20 29 20 72 65 74 75 72 6e  Column) ) return
9610: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53   0;.    }.    pS
9620: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d  can->zCollName =
9630: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
9640: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
9650: 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30  Scan->idxaff = 0
9660: 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f  ;.    pScan->zCo
9670: 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  llName = 0;.  }.
9680: 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20    pScan->opMask 
9690: 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61  = opMask;.  pSca
96a0: 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61  n->k = 0;.  pSca
96b0: 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d 20 69  n->aEquiv[0] = i
96c0: 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45  Cur;.  pScan->aE
96d0: 71 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d  quiv[1] = iColum
96e0: 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75  n;.  pScan->nEqu
96f0: 69 76 20 3d 20 32 3b 0a 20 20 70 53 63 61 6e 2d  iv = 2;.  pScan-
9700: 3e 69 45 71 75 69 76 20 3d 20 32 3b 0a 20 20 72  >iEquiv = 2;.  r
9710: 65 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e 4e  eturn whereScanN
9720: 65 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f  ext(pScan);.}../
9730: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
9740: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
9750: 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
9760: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
9770: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a  X <op> <expr>".*
9780: 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20 72  * where X is a r
9790: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
97a0: 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65  iColumn of table
97b0: 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69   iCur and <op> i
97c0: 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20  s one of.** the 
97d0: 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63  WO_xx operator c
97e0: 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62  odes specified b
97f0: 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  y the op paramet
9800: 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  er..** Return a 
9810: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74  pointer to the t
9820: 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69  erm.  Return 0 i
9830: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
9840: 2a 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74 75  ** The term retu
9850: 72 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59 3d  rned might by Y=
9860: 3c 65 78 70 72 3e 20 69 66 20 74 68 65 72 65 20  <expr> if there 
9870: 69 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74  is another const
9880: 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20  raint in.** the 
9890: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
98a0: 74 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74  t specifies that
98b0: 20 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68 20   X=Y.  Any such 
98c0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c  constraints will
98d0: 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65   be.** identifie
98e0: 64 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55 49  d by the WO_EQUI
98f0: 56 20 62 69 74 20 69 6e 20 74 68 65 20 70 54 65  V bit in the pTe
9900: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66 69  rm->eOperator fi
9910: 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45 71  eld.  The.** aEq
9920: 75 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64  uiv[] array hold
9930: 73 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  s X and all its 
9940: 65 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69 74  equivalents, wit
9950: 68 20 65 61 63 68 20 53 51 4c 20 76 61 72 69 61  h each SQL varia
9960: 62 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75 70  ble.** taking up
9970: 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61 45   two slots in aE
9980: 71 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69 72  quiv[].  The fir
9990: 73 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20 74  st slot is for t
99a0: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
99b0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63 6f  .** and the seco
99c0: 6e 64 20 69 73 20 66 6f 72 20 74 68 65 20 63 6f  nd is for the co
99d0: 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68  lumn number.  Th
99e0: 65 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74 73  ere are 22 slots
99f0: 20 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a 20   in aEquiv[].** 
9a00: 73 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  so that means we
9a10: 20 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20   can look for X 
9a20: 70 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f 74  plus up to 10 ot
9a30: 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76  her equivalent v
9a40: 61 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65 20  alues..** Hence 
9a50: 61 20 73 65 61 72 63 68 20 66 6f 72 20 58 20 77  a search for X w
9a60: 69 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70 72  ill return <expr
9a70: 3e 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41 31  > if X=A1 and A1
9a80: 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a 2a  =A2 and A2=A3.**
9a90: 20 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d   and ... and A9=
9aa0: 41 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78 70  A10 and A10=<exp
9ab0: 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  r>..**.** If the
9ac0: 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20  re are multiple 
9ad0: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45  terms in the WHE
9ae0: 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
9af0: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
9b00: 78 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72  xpr>".** then tr
9b10: 79 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77 69  y for the one wi
9b20: 74 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69  th no dependenci
9b30: 65 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69  es on <expr> - i
9b40: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77 68  n other words wh
9b50: 65 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73  ere.** <expr> is
9b60: 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72   a constant expr
9b70: 65 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b  ession of some k
9b80: 69 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72  ind.  Only retur
9b90: 6e 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20  n entries of.** 
9ba0: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
9bb0: 20 59 22 20 77 68 65 72 65 20 59 20 69 73 20 61   Y" where Y is a
9bc0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68   column in anoth
9bd0: 65 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20 74  er table if no t
9be0: 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66  erms of.** the f
9bf0: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e  orm "X <op> <con
9c00: 73 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74 2e  st-expr>" exist.
9c10: 20 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20 77     If no terms w
9c20: 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 52  ith a constant R
9c30: 48 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72 79  HS.** exist, try
9c40: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65 72   to return a ter
9c50: 6d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  m that does not 
9c60: 75 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f  use WO_EQUIV..*/
9c70: 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72  .static WhereTer
9c80: 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57  m *findTerm(.  W
9c90: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
9ca0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
9cb0: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
9cc0: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74  earched */.  int
9cd0: 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
9ce0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
9cf0: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
9d00: 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
9d10: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
9d20: 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f  number of LHS */
9d30: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
9d40: 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20  ady,     /* RHS 
9d50: 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70  must not overlap
9d60: 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20   with this mask 
9d70: 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20  */.  u32 op,    
9d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
9d90: 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75  sk of WO_xx valu
9da0: 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70  es describing op
9db0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  erator */.  Inde
9dc0: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
9dd0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
9de0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
9df0: 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20  s index, if not 
9e00: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  NULL */.){.  Whe
9e10: 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20  reTerm *pResult 
9e20: 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  = 0;.  WhereTerm
9e30: 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e   *p;.  WhereScan
9e40: 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68   scan;..  p = wh
9e50: 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61  ereScanInit(&sca
9e60: 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43  n, pWC, iCur, iC
9e70: 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29  olumn, op, pIdx)
9e80: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
9e90: 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
9ea0: 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61  eqRight & notRea
9eb0: 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)==0 ){.      
9ec0: 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69 67  if( p->prereqRig
9ed0: 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70  ht==0 && (p->eOp
9ee0: 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30  erator&WO_EQ)!=0
9ef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
9f00: 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn p;.      }.  
9f10: 20 20 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d      if( pResult=
9f20: 3d 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70  =0 ) pResult = p
9f30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
9f40: 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73  whereScanNext(&s
9f50: 63 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  can);.  }.  retu
9f60: 72 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f  rn pResult;.}../
9f70: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
9f80: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nce */.static vo
9f90: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53  id exprAnalyze(S
9fa0: 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6c  rcList*, WhereCl
9fb0: 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a  ause*, int);../*
9fc0: 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61  .** Call exprAna
9fd0: 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  lyze on all term
9fe0: 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61  s in a WHERE cla
9ff0: 75 73 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  use.  .*/.static
a000: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
a010: 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20  eAll(.  SrcList 
a020: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
a030: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
a040: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
a050: 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 20  ause *pWC       
a060: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
a070: 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c  lause to be anal
a080: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  yzed */.){.  int
a090: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d   i;.  for(i=pWC-
a0a0: 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  >nTerm-1; i>=0; 
a0b0: 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e  i--){.    exprAn
a0c0: 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20  alyze(pTabList, 
a0d0: 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC, i);.  }.}..
a0e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a0f0: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
a100: 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ATION./*.** Chec
a110: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
a120: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
a130: 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c   is a LIKE or GL
a140: 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74  OB operator that
a150: 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d  .** can be optim
a160: 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75  ized using inequ
a170: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
a180: 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  s.  Return TRUE 
a190: 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61  if it is.** so a
a1a0: 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  nd false if not.
a1b0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20  .**.** In order 
a1c0: 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72  for the operator
a1d0: 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62   to be optimizib
a1e0: 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74  le, the RHS must
a1f0: 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20   be a string.** 
a200: 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65  literal that doe
a210: 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68  s not begin with
a220: 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a   a wildcard.  .*
a230: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c  /.static int isL
a240: 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72  ikeOrGlob(.  Par
a250: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
a260: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
a270: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
a280: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
a290: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20  *pExpr,      /* 
a2a0: 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73  Test this expres
a2b0: 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  sion */.  Expr *
a2c0: 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50  *ppPrefix,  /* P
a2d0: 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52  ointer to TK_STR
a2e0: 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77  ING expression w
a2f0: 69 74 68 20 70 61 74 74 65 72 6e 20 70 72 65 66  ith pattern pref
a300: 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73  ix */.  int *pis
a310: 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75  Complete, /* Tru
a320: 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69  e if the only wi
a330: 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74  ldcard is % in t
a340: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
a350: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43  r */.  int *pnoC
a360: 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ase      /* True
a370: 20 69 66 20 75 70 70 65 72 63 61 73 65 20 69 73   if uppercase is
a380: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c   equivalent to l
a390: 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20  owercase */.){. 
a3a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
a3b0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53   0;         /* S
a3c0: 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20  tring on RHS of 
a3d0: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
a3e0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
a3f0: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a   *pLeft;      /*
a400: 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20   Right and left 
a410: 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65  size of LIKE ope
a420: 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c  rator */.  ExprL
a430: 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20  ist *pList;     
a440: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
a450: 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65   operands to the
a460: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a   LIKE operator *
a470: 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20  /.  int c;      
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a490: 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20  * One character 
a4a0: 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  in z[] */.  int 
a4b0: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
a4c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a4d0: 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64   of non-wildcard
a4e0: 20 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65   prefix characte
a4f0: 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b  rs */.  char wc[
a500: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
a510: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63     /* Wildcard c
a520: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73  haracters */.  s
a530: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
a540: 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
a550: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
a560: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
a570: 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20  lue *pVal = 0;. 
a580: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
a590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
a5a0: 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20  pcode of pRight 
a5b0: 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74  */..  if( !sqlit
a5c0: 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e  e3IsLikeFunction
a5d0: 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43  (db, pExpr, pnoC
a5e0: 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20  ase, wc) ){.    
a5f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69  return 0;.  }.#i
a600: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44  fdef SQLITE_EBCD
a610: 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73  IC.  if( *pnoCas
a620: 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  e ) return 0;.#e
a630: 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70  ndif.  pList = p
a640: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
a650: 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e   pLeft = pList->
a660: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[1].pExpr;.  if
a670: 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f  ( pLeft->op!=TK_
a680: 43 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71  COLUMN .   || sq
a690: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
a6a0: 79 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45  y(pLeft)!=SQLITE
a6b0: 5f 41 46 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c  _AFF_TEXT .   ||
a6c0: 20 49 73 56 69 72 74 75 61 6c 28 70 4c 65 66 74   IsVirtual(pLeft
a6d0: 2d 3e 70 54 61 62 29 0a 20 20 29 7b 0a 20 20 20  ->pTab).  ){.   
a6e0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35   /* IMP: R-02065
a6f0: 2d 34 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d  -49465 The left-
a700: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
a710: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70   LIKE or GLOB op
a720: 65 72 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20  erator must.    
a730: 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ** be the name o
a740: 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c  f an indexed col
a750: 75 6d 6e 20 77 69 74 68 20 54 45 58 54 20 61 66  umn with TEXT af
a760: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72  finity. */.    r
a770: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61  eturn 0;.  }.  a
a780: 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43  ssert( pLeft->iC
a790: 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f  olumn!=(-1) ); /
a7a0: 2a 20 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65  * Because IPK ne
a7b0: 76 65 72 20 68 61 73 20 41 46 46 5f 54 45 58 54  ver has AFF_TEXT
a7c0: 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20   */..  pRight = 
a7d0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
a7e0: 72 3b 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74  r;.  op = pRight
a7f0: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
a800: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20  TK_REGISTER ){. 
a810: 20 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e     op = pRight->
a820: 6f 70 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  op2;.  }.  if( o
a830: 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29  p==TK_VARIABLE )
a840: 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52 65 70  {.    Vdbe *pRep
a850: 72 65 70 61 72 65 20 3d 20 70 50 61 72 73 65 2d  repare = pParse-
a860: 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20 20 20  >pReprepare;.   
a870: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69 67   int iCol = pRig
a880: 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ht->iColumn;.   
a890: 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
a8a0: 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65  dbeGetBoundValue
a8b0: 28 70 52 65 70 72 65 70 61 72 65 2c 20 69 43 6f  (pReprepare, iCo
a8c0: 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  l, SQLITE_AFF_NO
a8d0: 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61  NE);.    if( pVa
a8e0: 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c  l && sqlite3_val
a8f0: 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53  ue_type(pVal)==S
a900: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
a910: 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29      z = (char *)
a920: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
a930: 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a  xt(pVal);.    }.
a940: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
a950: 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65  etVarmask(pParse
a960: 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b 0a  ->pVdbe, iCol);.
a970: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67      assert( pRig
a980: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  ht->op==TK_VARIA
a990: 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f  BLE || pRight->o
a9a0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
a9b0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
a9c0: 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20  ==TK_STRING ){. 
a9d0: 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e 75     z = pRight->u
a9e0: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69  .zToken;.  }.  i
a9f0: 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74 20  f( z ){.    cnt 
aa00: 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
aa10: 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26  (c=z[cnt])!=0 &&
aa20: 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d   c!=wc[0] && c!=
aa30: 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32  wc[1] && c!=wc[2
aa40: 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  ] ){.      cnt++
aa50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
aa60: 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21 3d 28  cnt!=0 && 255!=(
aa70: 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20  u8)z[cnt-1] ){. 
aa80: 20 20 20 20 20 45 78 70 72 20 2a 70 50 72 65 66       Expr *pPref
aa90: 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73 43 6f  ix;.      *pisCo
aaa0: 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b 30  mplete = c==wc[0
aab0: 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30  ] && z[cnt+1]==0
aac0: 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69 78 20  ;.      pPrefix 
aad0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
aae0: 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29 3b  , TK_STRING, z);
aaf0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 66  .      if( pPref
ab00: 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e 75 2e  ix ) pPrefix->u.
ab10: 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b  zToken[cnt] = 0;
ab20: 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66 69 78  .      *ppPrefix
ab30: 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20 20 20   = pPrefix;.    
ab40: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52    if( op==TK_VAR
ab50: 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 20  IABLE ){.       
ab60: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
ab70: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20 20  e->pVdbe;.      
ab80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
ab90: 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69 67 68  Varmask(v, pRigh
aba0: 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t->iColumn);.   
abb0: 20 20 20 20 20 69 66 28 20 2a 70 69 73 43 6f 6d       if( *pisCom
abc0: 70 6c 65 74 65 20 26 26 20 70 52 69 67 68 74 2d  plete && pRight-
abd0: 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a  >u.zToken[1] ){.
abe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
abf0: 74 68 65 20 72 68 73 20 6f 66 20 74 68 65 20 4c  the rhs of the L
ac00: 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69  IKE expression i
ac10: 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20 61 6e  s a variable, an
ac20: 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  d the current.  
ac30: 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
ac40: 20 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c 65   of the variable
ac50: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73 20   means there is 
ac60: 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f 6b  no need to invok
ac70: 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20 20 20  e the LIKE.     
ac80: 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
ac90: 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61 72  , then no OP_Var
aca0: 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 61 64  iable will be ad
acb0: 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ded to the progr
acc0: 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  am..          **
acd0: 20 54 68 69 73 20 63 61 75 73 65 73 20 70 72 6f   This causes pro
ace0: 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20 73 71  blems for the sq
acf0: 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
ad00: 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20 20  eter_name().    
ad10: 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20 54 6f        ** API. To
ad20: 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68 65 6d   workaround them
ad30: 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20 4f 50  , add a dummy OP
ad40: 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65 2e 0a  _Variable here..
ad50: 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20            */ .  
ad60: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
ad70: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
ad80: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
ad90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ada0: 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
adb0: 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31 29 3b  se, pRight, r1);
adc0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
add0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
ade0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
adf0: 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 30  rentAddr(v)-1, 0
ae00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
ae10: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
ae20: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
ae30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ae40: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
ae50: 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a     z = 0;.    }.
ae60: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61    }..  sqlite3Va
ae70: 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20  lueFree(pVal);. 
ae80: 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29 3b 0a   return (z!=0);.
ae90: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
aea0: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
aeb0: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23  IMIZATION */...#
aec0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
aed0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
aee0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
aef0: 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ee if the given 
af00: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
af10: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
af20: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d          column M
af30: 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20  ATCH expr.**.** 
af40: 49 66 20 69 74 20 69 73 20 74 68 65 6e 20 72 65  If it is then re
af50: 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 6e  turn TRUE.  If n
af60: 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45  ot, return FALSE
af70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
af80: 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28  isMatchOfColumn(
af90: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
afa0: 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73      /* Test this
afb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29   expression */.)
afc0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  {.  ExprList *pL
afd0: 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 78 70  ist;..  if( pExp
afe0: 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49  r->op!=TK_FUNCTI
aff0: 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ON ){.    return
b000: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
b010: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78  lite3StrICmp(pEx
b020: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61  pr->u.zToken,"ma
b030: 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20 20 20  tch")!=0 ){.    
b040: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
b050: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
b060: 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c  .pList;.  if( pL
b070: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b  ist->nExpr!=2 ){
b080: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
b090: 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e   }.  if( pList->
b0a0: 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 21  a[1].pExpr->op !
b0b0: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  = TK_COLUMN ){. 
b0c0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
b0d0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
b0e0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
b0f0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
b100: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  E */../*.** If t
b110: 68 65 20 70 42 61 73 65 20 65 78 70 72 65 73 73  he pBase express
b120: 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64 20 69  ion originated i
b130: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
b140: 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61  G clause of.** a
b150: 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e   join, then tran
b160: 73 66 65 72 20 74 68 65 20 61 70 70 72 6f 70 72  sfer the appropr
b170: 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76  iate markings ov
b180: 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a  er to derived..*
b190: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72  /.static void tr
b1a0: 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e  ansferJoinMarkin
b1b0: 67 73 28 45 78 70 72 20 2a 70 44 65 72 69 76 65  gs(Expr *pDerive
b1c0: 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65 29 7b  d, Expr *pBase){
b1d0: 0a 20 20 69 66 28 20 70 44 65 72 69 76 65 64 20  .  if( pDerived 
b1e0: 29 7b 0a 20 20 20 20 70 44 65 72 69 76 65 64 2d  ){.    pDerived-
b1f0: 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61 73 65 2d  >flags |= pBase-
b200: 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 72 6f 6d  >flags & EP_From
b210: 4a 6f 69 6e 3b 0a 20 20 20 20 70 44 65 72 69 76  Join;.    pDeriv
b220: 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  ed->iRightJoinTa
b230: 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69 52 69  ble = pBase->iRi
b240: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20  ghtJoinTable;.  
b250: 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  }.}..#if !define
b260: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  d(SQLITE_OMIT_OR
b270: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26  _OPTIMIZATION) &
b280: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
b290: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
b2a0: 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61  ./*.** Analyze a
b2b0: 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e 73 69   term that consi
b2c0: 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  sts of two or mo
b2d0: 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 0a  re OR-connected.
b2e0: 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20 53 6f  ** subterms.  So
b2f0: 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e   in:.**.**     .
b300: 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35 29 20  .. WHERE  (a=5) 
b310: 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d 39 20  AND (b=7 OR c=9 
b320: 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28 64 3d  OR d=13) AND (d=
b330: 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  13).**          
b340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b350: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
b360: 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ^^^^.**.** This 
b370: 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73  routine analyzes
b380: 20 74 65 72 6d 73 20 73 75 63 68 20 61 73 20 74   terms such as t
b390: 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d 20 69  he middle term i
b3a0: 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78 61 6d  n the above exam
b3b0: 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65 4f  ple..** A WhereO
b3c0: 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20  rTerm object is 
b3d0: 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61 74 74  computed and att
b3e0: 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 65 72  ached to the ter
b3f0: 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c 79  m under.** analy
b400: 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73 73 20  sis, regardless 
b410: 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f  of the outcome o
b420: 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 20  f the analysis. 
b430: 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   Hence:.**.**   
b440: 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c    WhereTerm.wtFl
b450: 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f 4f  ags   |=  TERM_O
b460: 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68 65  RINFO.**     Whe
b470: 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f  reTerm.u.pOrInfo
b480: 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63 61 6c    =  a dynamical
b490: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65  ly allocated Whe
b4a0: 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 0a  reOrTerm object.
b4b0: 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 62  **.** The term b
b4c0: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d 75  eing analyzed mu
b4d0: 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d  st have two or m
b4e0: 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63  ore of OR-connec
b4f0: 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a 2a  ted subterms..**
b500: 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65 72   A single subter
b510: 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73 65 74  m might be a set
b520: 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65   of AND-connecte
b530: 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73 2e 0a  d sub-subterms..
b540: 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 74  ** Examples of t
b550: 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c 79  erms under analy
b560: 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  sis:.**.**     (
b570: 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79  A)     t1.x=t2.y
b580: 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f 52   OR t1.x=t2.z OR
b590: 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e 7a   t1.y=15 OR t1.z
b5a0: 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20 28  =t3.a+5.**     (
b5b0: 42 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f  B)     x=expr1 O
b5c0: 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78 3d 65  R expr2=x OR x=e
b5d0: 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43 29 20  xpr3.**     (C) 
b5e0: 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52      t1.x=t2.y OR
b5f0: 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44 20   (t1.x=t2.z AND 
b600: 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20 20  t1.y=15).**     
b610: 28 44 29 20 20 20 20 20 78 3d 65 78 70 72 31 20  (D)     x=expr1 
b620: 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79 3c 32  OR (y>11 AND y<2
b630: 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a 68  2 AND z LIKE '*h
b640: 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20 28  ello*').**     (
b650: 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20 41 4e  E)     (p.a=1 AN
b660: 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63 3d  D q.b=2 AND r.c=
b670: 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e 44  3) OR (p.x=4 AND
b680: 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d 36   q.y=5 AND r.z=6
b690: 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a  ).**.** CASE 1:.
b6a0: 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62  **.** If all sub
b6b0: 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65  terms are of the
b6c0: 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20 66   form T.C=expr f
b6d0: 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63  or some single c
b6e0: 6f 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64 0a 2a  olumn of C and.*
b6f0: 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  * a single table
b700: 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69 6e 20   T (as shown in 
b710: 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76 65 29  example B above)
b720: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
b730: 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65  ew virtual.** te
b740: 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20 65 71  rm that is an eq
b750: 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78 70 72  uivalent IN expr
b760: 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65  ession.  In othe
b770: 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20  r words, if the 
b780: 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20 61 6e  term.** being an
b790: 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a  alyzed is:.**.**
b7a0: 20 20 20 20 20 20 78 20 3d 20 65 78 70 72 31 20        x = expr1 
b7b0: 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78 20 20   OR  expr2 = x  
b7c0: 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a 2a 2a  OR  x = expr3.**
b7d0: 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20  .** then create 
b7e0: 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65  a new virtual te
b7f0: 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  rm like this:.**
b800: 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 65  .**      x IN (e
b810: 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33  xpr1,expr2,expr3
b820: 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32 3a 0a  ).**.** CASE 2:.
b830: 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62  **.** If all sub
b840: 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65 78 61  terms are indexa
b850: 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c 65 20  ble by a single 
b860: 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 73 65  table T, then se
b870: 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72  t.**.**     Wher
b880: 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20  eTerm.eOperator 
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 20               =  
b8a0: 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57 68 65  WO_OR.**     Whe
b8b0: 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f  reTerm.u.pOrInfo
b8c0: 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c 3d 20  ->indexable  |= 
b8d0: 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
b8e0: 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54 0a 2a  er for table T.*
b8f0: 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69  *.** A subterm i
b900: 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20 69 66  s "indexable" if
b910: 20 69 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f   it is of the fo
b920: 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e 20  rm.** "T.C <op> 
b930: 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20 43 20  <expr>" where C 
b940: 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66  is any column of
b950: 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a 2a 2a   table T and .**
b960: 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20   <op> is one of 
b970: 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c 20  "=", "<", "<=", 
b980: 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53 20 4e  ">", ">=", "IS N
b990: 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a  ULL", or "IN"..*
b9a0: 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 61  * A subterm is a
b9b0: 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20 69 66  lso indexable if
b9c0: 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20 6f 66   it is an AND of
b9d0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   two or more.** 
b9e0: 73 75 62 73 75 62 74 65 72 6d 73 20 61 74 20 6c  subsubterms at l
b9f0: 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68 69 63  east one of whic
ba00: 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65 2e 20  h is indexable. 
ba10: 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44 20 0a   Indexable AND .
ba20: 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61 76 65  ** subterms have
ba30: 20 74 68 65 69 72 20 65 4f 70 65 72 61 74 6f 72   their eOperator
ba40: 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44 20 61   set to WO_AND a
ba50: 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a 2a 20  nd they have.** 
ba60: 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74 20 74  u.pAndInfo set t
ba70: 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20  o a dynamically 
ba80: 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 41  allocated WhereA
ba90: 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a  ndTerm object..*
baa0: 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74 68 65  *.** From anothe
bab0: 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65 77 2c  r point of view,
bac0: 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d 65 61   "indexable" mea
bad0: 6e 73 20 74 68 61 74 20 74 68 65 20 73 75 62 74  ns that the subt
bae0: 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74  erm could.** pot
baf0: 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73 65 64  entially be used
bb00: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 69   with an index i
bb10: 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  f an appropriate
bb20: 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e 0a 2a   index exists..*
bb30: 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73 20  * This analysis 
bb40: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  does not conside
bb50: 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  r whether or not
bb60: 20 74 68 65 20 69 6e 64 65 78 20 65 78 69 73 74   the index exist
bb70: 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20 64 65  s; that.** is de
bb80: 63 69 64 65 64 20 65 6c 73 65 77 68 65 72 65 2e  cided elsewhere.
bb90: 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73 20    This analysis 
bba0: 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20 77 68  only looks at wh
bbb0: 65 74 68 65 72 20 73 75 62 74 65 72 6d 73 0a 2a  ether subterms.*
bbc0: 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  * appropriate fo
bbd0: 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69 73 74  r indexing exist
bbe0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d  ..**.** All exam
bbf0: 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68 20 45  ples A through E
bc00: 20 61 62 6f 76 65 20 73 61 74 69 73 66 79 20 63   above satisfy c
bc10: 61 73 65 20 32 2e 20 20 42 75 74 20 69 66 20 61  ase 2.  But if a
bc20: 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74   term.** also st
bc30: 61 74 69 73 66 69 65 73 20 63 61 73 65 20 31 20  atisfies case 1 
bc40: 28 73 75 63 68 20 61 73 20 42 29 20 77 65 20 6b  (such as B) we k
bc50: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 70 74  now that the opt
bc60: 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61  imizer will.** a
bc70: 6c 77 61 79 73 20 70 72 65 66 65 72 20 63 61 73  lways prefer cas
bc80: 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61 74 20  e 1, so in that 
bc90: 63 61 73 65 20 77 65 20 70 72 65 74 65 6e 64 20  case we pretend 
bca0: 74 68 61 74 20 63 61 73 65 20 32 20 69 73 20 6e  that case 2 is n
bcb0: 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 2e  ot.** satisfied.
bcc0: 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20  .**.** It might 
bcd0: 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
bce0: 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73   multiple tables
bcf0: 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2e 20   are indexable. 
bd00: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a   For example,.**
bd10: 20 28 45 29 20 61 62 6f 76 65 20 69 73 20 69 6e   (E) above is in
bd20: 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65  dexable on table
bd30: 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a  s P, Q, and R..*
bd40: 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61 74 20  *.** Terms that 
bd50: 73 61 74 69 73 66 79 20 63 61 73 65 20 32 20 61  satisfy case 2 a
bd60: 72 65 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f  re candidates fo
bd70: 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e  r lookup by usin
bd80: 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e  g.** separate in
bd90: 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20 72 6f  dices to find ro
bda0: 77 69 64 73 20 66 6f 72 20 65 61 63 68 20 73 75  wids for each su
bdb0: 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73  bterm and compos
bdc0: 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e  ing.** the union
bdd0: 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73 20 75   of all rowids u
bde0: 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62  sing a RowSet ob
bdf0: 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73 20 73  ject.  This is s
be00: 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69  imilar.** to "bi
be10: 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20 69 6e  tmap indices" in
be20: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
be30: 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  engines..**.** O
be40: 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20  THERWISE:.**.** 
be50: 49 66 20 6e 65 69 74 68 65 72 20 63 61 73 65 20  If neither case 
be60: 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61 70 70  1 nor case 2 app
be70: 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65 20 74  ly, then leave t
be80: 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74  he eOperator set
be90: 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68   to.** zero.  Th
bea0: 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 75  is term is not u
beb0: 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72 63 68  seful for search
bec0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
bed0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65   exprAnalyzeOrTe
bee0: 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  rm(.  SrcList *p
bef0: 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Src,            
bf00: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
bf10: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
bf20: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
bf30: 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74    /* the complet
bf40: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
bf50: 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20  /.  int idxTerm 
bf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bf70: 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52   Index of the OR
bf80: 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c  -term to be anal
bf90: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  yzed */.){.  Whe
bfa0: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
bfb0: 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 20 20   pWC->pWInfo;   
bfc0: 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c       /* WHERE cl
bfd0: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
bfe0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72  context */.  Par
bff0: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49  se *pParse = pWI
c000: 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20  nfo->pParse;    
c010: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
c020: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
c030: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
c040: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
c050: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
c060: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
c070: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
c080: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
c090: 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74  rm];    /* The t
c0a0: 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  erm to be analyz
c0b0: 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  ed */.  Expr *pE
c0c0: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
c0d0: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
c0e0: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
c0f0: 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f  n of the term */
c100: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
c110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
c130: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
c140: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f   WhereClause *pO
c150: 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20 42 72  rWc;       /* Br
c160: 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d 20 69  eakup of pTerm i
c170: 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a  nto subterms */.
c180: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72    WhereTerm *pOr
c190: 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41  Term;       /* A
c1a0: 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68 69 6e   Sub-term within
c1b0: 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20   the pOrWc */.  
c1c0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72  WhereOrInfo *pOr
c1d0: 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64  Info;     /* Add
c1e0: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
c1f0: 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77  ion associated w
c200: 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42  ith pTerm */.  B
c210: 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b  itmask chngToIN;
c220: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
c230: 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73 61  es that might sa
c240: 74 69 73 66 79 20 63 61 73 65 20 31 20 2a 2f 0a  tisfy case 1 */.
c250: 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61    Bitmask indexa
c260: 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ble;        /* T
c270: 61 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 69  ables that are i
c280: 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69 73 66  ndexable, satisf
c290: 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a  ying case 2 */..
c2a0: 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20    /*.  ** Break 
c2b0: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e  the OR clause in
c2c0: 74 6f 20 69 74 73 20 73 65 70 61 72 61 74 65 20  to its separate 
c2d0: 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65 20 73  subterms.  The s
c2e0: 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a  ubterms are.  **
c2f0: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57 68 65   stored in a Whe
c300: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
c310: 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69  re containing wi
c320: 74 68 69 6e 20 74 68 65 20 57 68 65 72 65 4f 72  thin the WhereOr
c330: 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  Info.  ** object
c340: 20 74 68 61 74 20 69 73 20 61 74 74 61 63 68 65   that is attache
c350: 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  d to the origina
c360: 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d  l OR clause term
c370: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
c380: 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
c390: 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43   & (TERM_DYNAMIC
c3a0: 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52  |TERM_ORINFO|TER
c3b0: 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29  M_ANDINFO))==0 )
c3c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
c3d0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a  r->op==TK_OR );.
c3e0: 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e    pTerm->u.pOrIn
c3f0: 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73  fo = pOrInfo = s
c400: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
c410: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
c420: 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20  OrInfo));.  if( 
c430: 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74  pOrInfo==0 ) ret
c440: 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74  urn;.  pTerm->wt
c450: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52  Flags |= TERM_OR
c460: 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20  INFO;.  pOrWc = 
c470: 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  &pOrInfo->wc;.  
c480: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
c490: 70 4f 72 57 63 2c 20 70 57 49 6e 66 6f 29 3b 0a  pOrWc, pWInfo);.
c4a0: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 4f 72    whereSplit(pOr
c4b0: 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52  Wc, pExpr, TK_OR
c4c0: 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  );.  exprAnalyze
c4d0: 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57 63 29  All(pSrc, pOrWc)
c4e0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
c4f0: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
c500: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  n;.  assert( pOr
c510: 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a  Wc->nTerm>=2 );.
c520: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75  .  /*.  ** Compu
c530: 74 65 20 74 68 65 20 73 65 74 20 6f 66 20 74 61  te the set of ta
c540: 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20  bles that might 
c550: 73 61 74 69 73 66 79 20 63 61 73 65 73 20 31 20  satisfy cases 1 
c560: 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64  or 2..  */.  ind
c570: 65 78 61 62 6c 65 20 3d 20 7e 28 42 69 74 6d 61  exable = ~(Bitma
c580: 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f 49 4e  sk)0;.  chngToIN
c590: 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
c5a0: 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e    for(i=pOrWc->n
c5b0: 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d  Term-1, pOrTerm=
c5c0: 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26  pOrWc->a; i>=0 &
c5d0: 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d  & indexable; i--
c5e0: 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  , pOrTerm++){.  
c5f0: 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
c600: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53  eOperator & WO_S
c610: 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20  INGLE)==0 ){.   
c620: 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20     WhereAndInfo 
c630: 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20  *pAndInfo;.     
c640: 20 61 73 73 65 72 74 28 20 28 70 4f 72 54 65 72   assert( (pOrTer
c650: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
c660: 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f  RM_ANDINFO|TERM_
c670: 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20  ORINFO))==0 );. 
c680: 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20       chngToIN = 
c690: 30 3b 0a 20 20 20 20 20 20 70 41 6e 64 49 6e 66  0;.      pAndInf
c6a0: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
c6b0: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
c6c0: 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b 0a 20  f(*pAndInfo));. 
c6d0: 20 20 20 20 20 69 66 28 20 70 41 6e 64 49 6e 66       if( pAndInf
c6e0: 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65  o ){.        Whe
c6f0: 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43  reClause *pAndWC
c700: 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54  ;.        WhereT
c710: 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b 0a 20  erm *pAndTerm;. 
c720: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
c730: 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20        Bitmask b 
c740: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  = 0;.        pOr
c750: 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
c760: 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20   = pAndInfo;.   
c770: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
c780: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 41 4e  Flags |= TERM_AN
c790: 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20 20 70  DINFO;.        p
c7a0: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
c7b0: 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20 20 20  r = WO_AND;.    
c7c0: 20 20 20 20 70 41 6e 64 57 43 20 3d 20 26 70 41      pAndWC = &pA
c7d0: 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  ndInfo->wc;.    
c7e0: 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49      whereClauseI
c7f0: 6e 69 74 28 70 41 6e 64 57 43 2c 20 70 57 43 2d  nit(pAndWC, pWC-
c800: 3e 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  >pWInfo);.      
c810: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 41 6e    whereSplit(pAn
c820: 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45  dWC, pOrTerm->pE
c830: 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20  xpr, TK_AND);.  
c840: 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a        exprAnalyz
c850: 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64 57  eAll(pSrc, pAndW
c860: 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64  C);.        pAnd
c870: 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70 57 43  WC->pOuter = pWC
c880: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
c890: 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se( db->mallocFa
c8a0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
c8b0: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
c8c0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
c8d0: 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e 64     for(j=0, pAnd
c8e0: 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b 20  Term=pAndWC->a; 
c8f0: 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d 3b  j<pAndWC->nTerm;
c900: 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b 2b   j++, pAndTerm++
c910: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
c920: 73 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d 2d  ssert( pAndTerm-
c930: 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >pExpr );.      
c940: 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77 65        if( allowe
c950: 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70 45  dOp(pAndTerm->pE
c960: 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20 20  xpr->op) ){.    
c970: 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67            b |= g
c980: 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
c990: 73 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64 54 65  sMaskSet, pAndTe
c9a0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b  rm->leftCursor);
c9b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
c9c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
c9d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 64     }.        ind
c9e0: 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20  exable &= b;.   
c9f0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
ca00: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  f( pOrTerm->wtFl
ca10: 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45  ags & TERM_COPIE
ca20: 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6b  D ){.      /* Sk
ca30: 69 70 20 74 68 69 73 20 74 65 72 6d 20 66 6f 72  ip this term for
ca40: 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69 73 69   now.  We revisi
ca50: 74 20 69 74 20 77 68 65 6e 20 77 65 20 70 72 6f  t it when we pro
ca60: 63 65 73 73 20 74 68 65 0a 20 20 20 20 20 20 2a  cess the.      *
ca70: 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
ca80: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74 65 72  TERM_VIRTUAL ter
ca90: 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  m */.    }else{.
caa0: 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 3b        Bitmask b;
cab0: 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74 4d 61  .      b = getMa
cac0: 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
cad0: 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c  kSet, pOrTerm->l
cae0: 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  eftCursor);.    
caf0: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77    if( pOrTerm->w
cb00: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
cb10: 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  RTUAL ){.       
cb20: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68   WhereTerm *pOth
cb30: 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70  er = &pOrWc->a[p
cb40: 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d  OrTerm->iParent]
cb50: 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67  ;.        b |= g
cb60: 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
cb70: 73 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68 65 72  sMaskSet, pOther
cb80: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20  ->leftCursor);. 
cb90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 64       }.      ind
cba0: 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20  exable &= b;.   
cbb0: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
cbc0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
cbd0: 45 51 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  EQ)==0 ){.      
cbe0: 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a    chngToIN = 0;.
cbf0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
cc00: 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26 3d       chngToIN &=
cc10: 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   b;.      }.    
cc20: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
cc30: 20 52 65 63 6f 72 64 20 74 68 65 20 73 65 74 20   Record the set 
cc40: 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 73  of tables that s
cc50: 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20  atisfy case 2.  
cc60: 54 68 65 20 73 65 74 20 6d 69 67 68 74 20 62 65  The set might be
cc70: 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20 2a  .  ** empty..  *
cc80: 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  /.  pOrInfo->ind
cc90: 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61 62  exable = indexab
cca0: 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70  le;.  pTerm->eOp
ccb0: 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61 62  erator = indexab
ccc0: 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f 4f  le==0 ? 0 : WO_O
ccd0: 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 68  R;..  /*.  ** ch
cce0: 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20 73  ngToIN holds a s
ccf0: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
cd00: 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73 66  t *might* satisf
cd10: 79 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a 20  y case 1.  But. 
cd20: 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 64   ** we have to d
cd30: 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  o some additiona
cd40: 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65  l checking to se
cd50: 65 20 69 66 20 63 61 73 65 20 31 20 72 65 61 6c  e if case 1 real
cd60: 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69 73  ly.  ** is satis
cd70: 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  fied..  **.  ** 
cd80: 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68 6f  chngToIN will ho
cd90: 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c 20  ld either 0, 1, 
cda0: 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68 65 20  or 2 bits.  The 
cdb0: 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e 73  0-bit case means
cdc0: 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72 65  .  ** that there
cdd0: 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69   is no possibili
cde0: 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69  ty of transformi
cdf0: 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  ng the OR clause
ce00: 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e   into an.  ** IN
ce10: 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75 73   operator becaus
ce20: 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 65  e one or more te
ce30: 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63 6c  rms in the OR cl
ce40: 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20 2a  ause contain.  *
ce50: 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  * something othe
ce60: 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20 63  r than == on a c
ce70: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69 6e  olumn in the sin
ce80: 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  gle table.  The 
ce90: 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65 20  1-bit.  ** case 
cea0: 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65 72 79  means that every
ceb0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20   term of the OR 
cec0: 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68 65  clause is of the
ced0: 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62 6c   form.  ** "tabl
cee0: 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20 66  e.column=expr" f
cef0: 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 74  or some single t
cf00: 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20 62  able.  The one b
cf10: 69 74 20 74 68 61 74 20 69 73 20 73 65 74 0a 20  it that is set. 
cf20: 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73 70   ** will corresp
cf30: 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d 6f  ond to the commo
cf40: 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74 69  n table.  We sti
cf50: 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b  ll need to check
cf60: 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75   to make.  ** su
cf70: 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75  re the same colu
cf80: 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61 6c  mn is used on al
cf90: 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32 2d  l terms.  The 2-
cfa0: 62 69 74 20 63 61 73 65 20 69 73 20 77 68 65 6e  bit case is when
cfb0: 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74 65  .  ** the all te
cfc0: 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66  rms are of the f
cfd0: 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c 75  orm "table1.colu
cfe0: 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e  mn=table2.column
cff0: 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67 68  ".  It.  ** migh
d000: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
d010: 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65 72   form an IN oper
d020: 61 74 6f 72 20 77 69 74 68 20 65 69 74 68 65 72  ator with either
d030: 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20   table1.column. 
d040: 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63 6f   ** or table2.co
d050: 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53 20  lumn as the LHS 
d060: 69 66 20 65 69 74 68 65 72 20 69 73 20 63 6f 6d  if either is com
d070: 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72  mon to every ter
d080: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f 52  m of.  ** the OR
d090: 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
d0a0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65 72  ** Note that ter
d0b0: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ms of the form "
d0c0: 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61  table.column1=ta
d0d0: 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74 68  ble.column2" (th
d0e0: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c  e.  ** same tabl
d0f0: 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73 20  e on both sizes 
d100: 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e 6f  of the ==) canno
d110: 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  t be optimized..
d120: 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67 54    */.  if( chngT
d130: 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  oIN ){.    int o
d140: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
d150: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
d160: 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74  the conversion t
d170: 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a 2f  o IN is valid */
d180: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  .    int iColumn
d190: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f   = -1;         /
d1a0: 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f  * Column index o
d1b0: 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65 72  n lhs of IN oper
d1c0: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ator */.    int 
d1d0: 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20 20  iCursor = -1;   
d1e0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63        /* Table c
d1f0: 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20  ursor common to 
d200: 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  all terms */.   
d210: 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20 20   int j = 0;     
d220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
d230: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
d240: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
d250: 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c   a table and col
d260: 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72 73  umn that appears
d270: 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72 20   on one side or 
d280: 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  the.    ** other
d290: 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72 61   of the == opera
d2a0: 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75 62  tor in every sub
d2b0: 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62 6c  term.  That tabl
d2c0: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20 20  e and column.   
d2d0: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63 6f   ** will be reco
d2e0: 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72 20  rded in iCursor 
d2f0: 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54 68  and iColumn.  Th
d300: 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ere might not be
d310: 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68   any.    ** such
d320: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
d330: 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e 67  n.  Set okToChng
d340: 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72 6f  ToIN if an appro
d350: 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20 20  priate table.   
d360: 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69   ** and column i
d370: 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61 76  s found but leav
d380: 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 66  e okToChngToIN f
d390: 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e  alse if not foun
d3a0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
d3b0: 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21 6f  r(j=0; j<2 && !o
d3c0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b  kToChngToIN; j++
d3d0: 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72 6d  ){.      pOrTerm
d3e0: 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20 20   = pOrWc->a;.   
d3f0: 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e     for(i=pOrWc->
d400: 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  nTerm-1; i>=0; i
d410: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
d420: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d430: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
d440: 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
d450: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77        pOrTerm->w
d460: 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f  tFlags &= ~TERM_
d470: 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69  OR_OK;.        i
d480: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
d490: 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20  Cursor==iCursor 
d4a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
d4b0: 54 68 69 73 20 69 73 20 74 68 65 20 32 2d 62 69  This is the 2-bi
d4c0: 74 20 63 61 73 65 20 61 6e 64 20 77 65 20 61 72  t case and we ar
d4d0: 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  e on the second 
d4e0: 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20 20  iteration and.  
d4f0: 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65          ** curre
d500: 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f 6d 20  nt term is from 
d510: 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
d520: 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74 68  ion.  So skip th
d530: 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  is term. */.    
d540: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d        assert( j=
d550: 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =1 );.          
d560: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
d570: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
d580: 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d  (chngToIN & getM
d590: 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
d5a0: 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e  skSet, pOrTerm->
d5b0: 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d 30 20  leftCursor))==0 
d5c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
d5d0: 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74 20 62  This term must b
d5e0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 74 31  e of the form t1
d5f0: 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65 20 74  .a==t2.b where t
d600: 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20 20 20  2 is in the.    
d610: 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49        ** chngToI
d620: 4e 20 73 65 74 20 62 75 74 20 74 31 20 69 73 20  N set but t1 is 
d630: 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72 6d 20  not.  This term 
d640: 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20 70  will be either p
d650: 72 65 63 65 65 64 65 64 0a 20 20 20 20 20 20 20  receeded.       
d660: 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64     ** or follwed
d670: 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20   by an inverted 
d680: 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61  copy (t2.b==t1.a
d690: 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74 65  ).  Skip this te
d6a0: 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rm .          **
d6b0: 20 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76   and use its inv
d6c0: 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  ersion. */.     
d6d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
d6e0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
d6f0: 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b  & TERM_COPIED );
d700: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
d710: 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ase( pOrTerm->wt
d720: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
d730: 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  TUAL );.        
d740: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
d750: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
d760: 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56  RM_COPIED|TERM_V
d770: 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20  IRTUAL) );.     
d780: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
d790: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d7a0: 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65   iColumn = pOrTe
d7b0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
d7c0: 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72 73 6f  ;.        iCurso
d7d0: 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  r = pOrTerm->lef
d7e0: 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  tCursor;.       
d7f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
d800: 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b        if( i<0 ){
d810: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63  .        /* No c
d820: 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63  andidate table+c
d830: 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e  olumn was found.
d840: 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20    This can only 
d850: 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  occur.        **
d860: 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69   on the second i
d870: 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  teration */.    
d880: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31      assert( j==1
d890: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
d8a0: 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f  rt( IsPowerOfTwo
d8b0: 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a 20 20  (chngToIN) );.  
d8c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 68        assert( ch
d8d0: 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b 28  ngToIN==getMask(
d8e0: 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
d8f0: 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a 20  t, iCursor) );. 
d900: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d910: 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74      }.      test
d920: 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20  case( j==1 );.. 
d930: 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20       /* We have 
d940: 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61 74  found a candidat
d950: 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  e table and colu
d960: 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  mn.  Check to se
d970: 65 20 69 66 20 74 68 61 74 0a 20 20 20 20 20 20  e if that.      
d980: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  ** table and col
d990: 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  umn is common to
d9a0: 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
d9b0: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f 0a  he OR clause */.
d9c0: 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f        okToChngTo
d9d0: 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f  IN = 1;.      fo
d9e0: 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54 6f  r(; i>=0 && okTo
d9f0: 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70  ChngToIN; i--, p
da00: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
da10: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
da20: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
da30: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
da40: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
da50: 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f  ftCursor!=iCurso
da60: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  r ){.          p
da70: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
da80: 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a  &= ~TERM_OR_OK;.
da90: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
daa0: 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66  ( pOrTerm->u.lef
dab0: 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  tColumn!=iColumn
dac0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b   ){.          ok
dad0: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a  ToChngToIN = 0;.
dae0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
daf0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 66 66           int aff
db00: 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a  Left, affRight;.
db10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
db20: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
db30: 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f  ide is also a co
db40: 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61  lumn, then the a
db50: 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20  ffinities.      
db60: 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72      ** of both r
db70: 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69  ight and left si
db80: 64 65 73 20 6d 75 73 74 20 62 65 20 73 75 63 68  des must be such
db90: 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20   that no type.  
dba0: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65          ** conve
dbb0: 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69  rsions are requi
dbc0: 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74  red on the right
dbd0: 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39  .  (Ticket #2249
dbe0: 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ).          */. 
dbf0: 20 20 20 20 20 20 20 20 20 61 66 66 52 69 67 68           affRigh
dc00: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
dc10: 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d  ffinity(pOrTerm-
dc20: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  >pExpr->pRight);
dc30: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 4c 65  .          affLe
dc40: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
dc50: 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d  Affinity(pOrTerm
dc60: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  ->pExpr->pLeft);
dc70: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
dc80: 66 66 52 69 67 68 74 21 3d 30 20 26 26 20 61 66  ffRight!=0 && af
dc90: 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20  fRight!=affLeft 
dca0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  ){.            o
dcb0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
dcc0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
dcd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f  {.            pO
dce0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  rTerm->wtFlags |
dcf0: 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20  = TERM_OR_OK;.  
dd00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dd10: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
dd20: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
dd30: 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e  s point, okToChn
dd40: 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66  gToIN is true if
dd50: 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20   original pTerm 
dd60: 73 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a  satisfies.    **
dd70: 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61   case 1.  In tha
dd80: 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63  t case, construc
dd90: 74 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  t a new virtual 
dda0: 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20  term that is .  
ddb0: 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65    ** pTerm conve
ddc0: 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20  rted into an IN 
ddd0: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f  operator..    */
dde0: 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e  .    if( okToChn
ddf0: 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45  gToIN ){.      E
de00: 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20  xpr *pDup;      
de10: 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73        /* A trans
de20: 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65  ient duplicate e
de30: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
de40: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
de50: 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  st = 0;   /* The
de60: 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
de70: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
de80: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30   Expr *pLeft = 0
de90: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;       /* The L
dea0: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
deb0: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45  rator */.      E
dec0: 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  xpr *pNew;      
ded0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
dee0: 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f  plete IN operato
def0: 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28  r */..      for(
df00: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
df10: 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d  , pOrTerm=pOrWc-
df20: 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  >a; i>=0; i--, p
df30: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
df40: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
df50: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
df60: 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74  OR_OK)==0 ) cont
df70: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73  inue;.        as
df80: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
df90: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
dfa0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
dfb0: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  rt( pOrTerm->lef
dfc0: 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72  tCursor==iCursor
dfd0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
dfe0: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  rt( pOrTerm->u.l
dff0: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
e000: 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44  mn );.        pD
e010: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
e020: 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d  Dup(db, pOrTerm-
e030: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
e040: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73  0);.        pLis
e050: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
e060: 69 73 74 41 70 70 65 6e 64 28 70 57 49 6e 66 6f  istAppend(pWInfo
e070: 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  ->pParse, pList,
e080: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20   pDup);.        
e090: 70 4c 65 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d  pLeft = pOrTerm-
e0a0: 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20  >pExpr->pLeft;. 
e0b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
e0c0: 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b  ert( pLeft!=0 );
e0d0: 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71  .      pDup = sq
e0e0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
e0f0: 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20   pLeft, 0);.    
e100: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
e110: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
e120: 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30 29  _IN, pDup, 0, 0)
e130: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
e140: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
e150: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  idxNew;.        
e160: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
e170: 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70 72  ings(pNew, pExpr
e180: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
e190: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
e1a0: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73  rty(pNew, EP_xIs
e1b0: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
e1c0: 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74     pNew->x.pList
e1d0: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20   = pList;.      
e1e0: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
e1f0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
e200: 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52  , pNew, TERM_VIR
e210: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
e220: 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  C);.        test
e230: 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20  case( idxNew==0 
e240: 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41  );.        exprA
e250: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
e260: 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20  , idxNew);.     
e270: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
e280: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
e290: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
e2a0: 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  ew].iParent = id
e2b0: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70  xTerm;.        p
e2c0: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31  Term->nChild = 1
e2d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e2e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
e2f0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
e300: 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d   pList);.      }
e310: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f  .      pTerm->eO
e320: 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f  perator = WO_NOO
e330: 50 3b 20 20 2f 2a 20 63 61 73 65 20 31 20 74 72  P;  /* case 1 tr
e340: 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f 0a 20  umps case 2 */. 
e350: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
e360: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
e370: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
e380: 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49  N && !SQLITE_OMI
e390: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f  T_SUBQUERY */../
e3a0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74  *.** The input t
e3b0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
e3c0: 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73  s an WhereTerm s
e3d0: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e  tructure with on
e3e0: 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72  ly the.** "pExpr
e3f0: 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69  " field filled i
e400: 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  n.  The job of t
e410: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
e420: 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a  o analyze the.**
e430: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61   subexpression a
e440: 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20  nd populate all 
e450: 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73  the other fields
e460: 20 6f 66 20 74 68 65 20 57 68 65 72 65 54 65 72   of the WhereTer
e470: 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a  m.** structure..
e480: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
e490: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
e4a0: 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c  e form "<expr> <
e4b0: 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73 20 63  op> X" it gets c
e4c0: 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68  ommuted.** to th
e4d0: 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20  e standard form 
e4e0: 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  of "X <op> <expr
e4f0: 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  >"..**.** If the
e500: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
e510: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
e520: 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74 68  p> Y" where both
e530: 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20   X and Y are.** 
e540: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68  columns, then th
e550: 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65  e original expre
e560: 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67  ssion is unchang
e570: 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72  ed and a new vir
e580: 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20  tual.** term of 
e590: 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e  the form "Y <op>
e5a0: 20 58 22 20 69 73 20 61 64 64 65 64 20 74 6f 20   X" is added to 
e5b0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
e5c0: 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64   and.** analyzed
e5d0: 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 54 68   separately.  Th
e5e0: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20  e original term 
e5f0: 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54  is marked with T
e600: 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e  ERM_COPIED.** an
e610: 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d 20 69  d the new term i
e620: 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45  s marked with TE
e630: 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65 63 61  RM_DYNAMIC (beca
e640: 75 73 65 20 69 74 27 73 20 70 45 78 70 72 0a 2a  use it's pExpr.*
e650: 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  * needs to be fr
e660: 65 65 64 20 77 69 74 68 20 74 68 65 20 57 68 65  eed with the Whe
e670: 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20 54 45  reClause) and TE
e680: 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65 63 61  RM_VIRTUAL (beca
e690: 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61 20 63  use it.** is a c
e6a0: 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f 66 20  ommuted copy of 
e6b0: 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29 20 20  a prior term.)  
e6c0: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  The original ter
e6d0: 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a  m has nChild=1.*
e6e0: 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79 20 68  * and the copy h
e6f0: 61 73 20 69 64 78 50 61 72 65 6e 74 20 73 65 74  as idxParent set
e700: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
e710: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   the original te
e720: 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rm..*/.static vo
e730: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a  id exprAnalyze(.
e740: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
e750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
e760: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
e770: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
e780: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
e790: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
e7a0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65  e */.  int idxTe
e7b0: 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
e7c0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
e7d0: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
e7e0: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  yzed */.){.  Whe
e7f0: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
e800: 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 2f 2a   pWC->pWInfo; /*
e810: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
e820: 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74  ocessing context
e830: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
e840: 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
e850: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65         /* The te
e860: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
e870: 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  d */.  WhereMask
e880: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20  Set *pMaskSet;  
e890: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f          /* Set o
e8a0: 66 20 74 61 62 6c 65 20 69 6e 64 65 78 20 6d 61  f table index ma
e8b0: 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  sks */.  Expr *p
e8c0: 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
e8d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e8e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   expression to b
e8f0: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  e analyzed */.  
e900: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65  Bitmask prereqLe
e910: 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ft;             
e920: 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65   /* Prerequesite
e930: 73 20 6f 66 20 74 68 65 20 70 45 78 70 72 2d 3e  s of the pExpr->
e940: 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61  pLeft */.  Bitma
e950: 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20  sk prereqAll;   
e960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
e970: 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20  rerequesites of 
e980: 70 45 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61  pExpr */.  Bitma
e990: 73 6b 20 65 78 74 72 61 52 69 67 68 74 20 3d 20  sk extraRight = 
e9a0: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  0;          /* E
e9b0: 78 74 72 61 20 64 65 70 65 6e 64 65 6e 63 69 65  xtra dependencie
e9c0: 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e 20 2a  s on LEFT JOIN *
e9d0: 2f 0a 20 20 45 78 70 72 20 2a 70 53 74 72 31 20  /.  Expr *pStr1 
e9e0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
e9f0: 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c       /* RHS of L
ea00: 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f  IKE/GLOB operato
ea10: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  r */.  int isCom
ea20: 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20  plete = 0;      
ea30: 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f          /* RHS o
ea40: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e 64 73  f LIKE/GLOB ends
ea50: 20 77 69 74 68 20 77 69 6c 64 63 61 72 64 20 2a   with wildcard *
ea60: 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 20 3d  /.  int noCase =
ea70: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
ea80: 20 20 20 20 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f       /* LIKE/GLO
ea90: 42 20 64 69 73 74 69 6e 67 75 69 73 68 65 73 20  B distinguishes 
eaa0: 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  case */.  int op
eab0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
eac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
ead0: 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74 6f 72  p-level operator
eae0: 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a  .  pExpr->op */.
eaf0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
eb00: 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
eb10: 3b 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f  ;  /* Parsing co
eb20: 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
eb30: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
eb40: 3e 64 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  >db;        /* D
eb50: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
eb60: 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d  on */..  if( db-
eb70: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
eb80: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
eb90: 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d  .  pTerm = &pWC-
eba0: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70  >a[idxTerm];.  p
ebb0: 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66  MaskSet = &pWInf
ebc0: 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 70  o->sMaskSet;.  p
ebd0: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
ebe0: 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  xpr;.  assert( p
ebf0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 53 20  Expr->op!=TK_AS 
ec00: 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  && pExpr->op!=TK
ec10: 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 70 72  _COLLATE );.  pr
ec20: 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54  ereqLeft = exprT
ec30: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
ec40: 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  et, pExpr->pLeft
ec50: 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  );.  op = pExpr-
ec60: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
ec70: 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  K_IN ){.    asse
ec80: 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  rt( pExpr->pRigh
ec90: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  t==0 );.    if( 
eca0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
ecb0: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
ecc0: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 70 54  ect) ){.      pT
ecd0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
ece0: 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62   = exprSelectTab
ecf0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
ed00: 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  , pExpr->x.pSele
ed10: 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ct);.    }else{.
ed20: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65        pTerm->pre
ed30: 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 4c  reqRight = exprL
ed40: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
ed50: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78  askSet, pExpr->x
ed60: 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
ed70: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54   }else if( op==T
ed80: 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  K_ISNULL ){.    
ed90: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
eda0: 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ht = 0;.  }else{
edb0: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  .    pTerm->prer
edc0: 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 54 61  eqRight = exprTa
edd0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
ede0: 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
edf0: 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65 71 41  );.  }.  prereqA
ee00: 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ll = exprTableUs
ee10: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
ee20: 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78 70 72  xpr);.  if( Expr
ee30: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
ee40: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
ee50: 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 78  ){.    Bitmask x
ee60: 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
ee70: 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52 69 67  Set, pExpr->iRig
ee80: 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20  htJoinTable);.  
ee90: 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78    prereqAll |= x
eea0: 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67 68 74  ;.    extraRight
eeb0: 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63   = x-1;  /* ON c
eec0: 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 79 20  lause terms may 
eed0: 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68  not be used with
eee0: 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20 20 20   an index.      
eef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef00: 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c   ** on left tabl
ef10: 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
ef20: 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 20  .  Ticket #3015 
ef30: 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e  */.  }.  pTerm->
ef40: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72  prereqAll = prer
ef50: 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e  eqAll;.  pTerm->
ef60: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b  leftCursor = -1;
ef70: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  .  pTerm->iParen
ef80: 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d  t = -1;.  pTerm-
ef90: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a  >eOperator = 0;.
efa0: 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28    if( allowedOp(
efb0: 6f 70 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20  op) ){.    Expr 
efc0: 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  *pLeft = sqlite3
efd0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
efe0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
eff0: 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
f000: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
f010: 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e  pCollate(pExpr->
f020: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 75 31 36  pRight);.    u16
f030: 20 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65 72 6d   opMask = (pTerm
f040: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
f050: 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 3f  prereqLeft)==0 ?
f060: 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45 51 55   WO_ALL : WO_EQU
f070: 49 56 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66  IV;.    if( pLef
f080: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
f090: 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   ){.      pTerm-
f0a0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
f0b0: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
f0c0: 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74     pTerm->u.left
f0d0: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
f0e0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
f0f0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
f100: 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f  = operatorMask(o
f110: 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20  p) & opMask;.   
f120: 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67 68   }.    if( pRigh
f130: 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d  t && pRight->op=
f140: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
f150: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
f160: 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20  New;.      Expr 
f170: 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 75 31 36  *pDup;.      u16
f180: 20 65 45 78 74 72 61 4f 70 20 3d 20 30 3b 20 20   eExtraOp = 0;  
f190: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
f1a0: 69 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e 65 4f  its for pNew->eO
f1b0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
f1c0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
f1d0: 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20  Cursor>=0 ){.   
f1e0: 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b       int idxNew;
f1f0: 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20  .        pDup = 
f200: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
f210: 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  b, pExpr, 0);.  
f220: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
f230: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
f240: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
f250: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44  xprDelete(db, pD
f260: 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  up);.          r
f270: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
f280: 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20  .        idxNew 
f290: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
f2a0: 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20 54  ert(pWC, pDup, T
f2b0: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
f2c0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
f2d0: 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d 30     if( idxNew==0
f2e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
f2f0: 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e     pNew = &pWC->
f300: 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20  a[idxNew];.     
f310: 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74     pNew->iParent
f320: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
f330: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
f340: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
f350: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
f360: 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ild = 1;.       
f370: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
f380: 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a  |= TERM_COPIED;.
f390: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
f3a0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20 20 20  r->op==TK_EQ.   
f3b0: 20 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61        && !ExprHa
f3c0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
f3d0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
f3e0: 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69         && Optimi
f3f0: 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
f400: 2c 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 69 74  , SQLITE_Transit
f410: 69 76 65 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  ive).        ){.
f420: 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d            pTerm-
f430: 3e 65 4f 70 65 72 61 74 6f 72 20 7c 3d 20 57 4f  >eOperator |= WO
f440: 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20  _EQUIV;.        
f450: 20 20 65 45 78 74 72 61 4f 70 20 3d 20 57 4f 5f    eExtraOp = WO_
f460: 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20 7d  EQUIV;.        }
f470: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f480: 20 20 20 20 20 20 70 44 75 70 20 3d 20 70 45 78        pDup = pEx
f490: 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  pr;.        pNew
f4a0: 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
f4b0: 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d  }.      exprComm
f4c0: 75 74 65 28 70 50 61 72 73 65 2c 20 70 44 75 70  ute(pParse, pDup
f4d0: 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d  );.      pLeft =
f4e0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
f4f0: 43 6f 6c 6c 61 74 65 28 70 44 75 70 2d 3e 70 4c  Collate(pDup->pL
f500: 65 66 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  eft);.      pNew
f510: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
f520: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
f530: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66 74      pNew->u.left
f540: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
f550: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 74  iColumn;.      t
f560: 65 73 74 63 61 73 65 28 20 28 70 72 65 72 65 71  estcase( (prereq
f570: 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68  Left | extraRigh
f580: 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66 74  t) != prereqLeft
f590: 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
f5a0: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72  prereqRight = pr
f5b0: 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61  ereqLeft | extra
f5c0: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e 65  Right;.      pNe
f5d0: 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  w->prereqAll = p
f5e0: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20  rereqAll;.      
f5f0: 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pNew->eOperator 
f600: 3d 20 28 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28  = (operatorMask(
f610: 70 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45 78 74  pDup->op) + eExt
f620: 72 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a  raOp) & opMask;.
f630: 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64      }.  }..#ifnd
f640: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
f650: 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54  ETWEEN_OPTIMIZAT
f660: 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74 65  ION.  /* If a te
f670: 72 6d 20 69 73 20 74 68 65 20 42 45 54 57 45 45  rm is the BETWEE
f680: 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65 61  N operator, crea
f690: 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74 75  te two new virtu
f6a0: 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68  al terms.  ** th
f6b0: 61 74 20 64 65 66 69 6e 65 20 74 68 65 20 72 61  at define the ra
f6c0: 6e 67 65 20 74 68 61 74 20 74 68 65 20 42 45 54  nge that the BET
f6d0: 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e  WEEN implements.
f6e0: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20    For example:. 
f6f0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 61 20   **.  **      a 
f700: 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63 0a  BETWEEN b AND c.
f710: 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e    **.  ** is con
f720: 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20 20 2a  verted into:.  *
f730: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28 61 20 42  *.  **      (a B
f740: 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63 29 20  ETWEEN b AND c) 
f750: 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44 20 28  AND (a>=b) AND (
f760: 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  a<=c).  **.  ** 
f770: 54 68 65 20 74 77 6f 20 6e 65 77 20 74 65 72 6d  The two new term
f780: 73 20 61 72 65 20 61 64 64 65 64 20 6f 6e 74 6f  s are added onto
f790: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
f7a0: 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65  WhereClause obje
f7b0: 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 65 77  ct..  ** The new
f7c0: 20 74 65 72 6d 73 20 61 72 65 20 22 64 79 6e 61   terms are "dyna
f7d0: 6d 69 63 22 20 61 6e 64 20 61 72 65 20 63 68 69  mic" and are chi
f7e0: 6c 64 72 65 6e 20 6f 66 20 74 68 65 20 6f 72 69  ldren of the ori
f7f0: 67 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a 20 20  ginal BETWEEN.  
f800: 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61 74 20 6d  ** term.  That m
f810: 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65  eans that if the
f820: 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73   BETWEEN term is
f830: 20 63 6f 64 65 64 2c 20 74 68 65 20 63 68 69 6c   coded, the chil
f840: 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20 73 6b  dren are.  ** sk
f850: 69 70 70 65 64 2e 20 20 4f 72 2c 20 69 66 20 74  ipped.  Or, if t
f860: 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20  he children are 
f870: 73 61 74 69 73 66 69 65 64 20 62 79 20 61 6e 20  satisfied by an 
f880: 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 69 67 69  index, the origi
f890: 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45 45 4e  nal.  ** BETWEEN
f8a0: 20 74 65 72 6d 20 69 73 20 73 6b 69 70 70 65 64   term is skipped
f8b0: 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
f8c0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
f8d0: 42 45 54 57 45 45 4e 20 26 26 20 70 57 43 2d 3e  BETWEEN && pWC->
f8e0: 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20  op==TK_AND ){.  
f8f0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
f900: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
f910: 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  st;.    int i;. 
f920: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
f930: 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47  u8 ops[] = {TK_G
f940: 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61  E, TK_LE};.    a
f950: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
f960: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
f970: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29  List->nExpr==2 )
f980: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
f990: 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
f9a0: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a  Expr *pNewExpr;.
f9b0: 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77        int idxNew
f9c0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72  ;.      pNewExpr
f9d0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
f9e0: 70 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d 2c 20  pParse, ops[i], 
f9f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
fa10: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
fa20: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30   pExpr->pLeft, 0
fa30: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
fa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa50: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
fa60: 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  b, pList->a[i].p
fa70: 45 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a 20 20  Expr, 0), 0);.  
fa80: 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e      transferJoin
fa90: 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78 70  Markings(pNewExp
faa0: 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  r, pExpr);.     
fab0: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
fac0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
fad0: 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f   pNewExpr, TERM_
fae0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
faf0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73  AMIC);.      tes
fb00: 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30  tcase( idxNew==0
fb10: 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e   );.      exprAn
fb20: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
fb30: 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20   idxNew);.      
fb40: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
fb50: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
fb60: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69  pWC->a[idxNew].i
fb70: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
fb80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65 72  ;.    }.    pTer
fb90: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20  m->nChild = 2;. 
fba0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
fbb0: 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e  ITE_OMIT_BETWEEN
fbc0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
fbd0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
fbe0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
fbf0: 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21  TIMIZATION) && !
fc00: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
fc10: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20 20  MIT_SUBQUERY).  
fc20: 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72  /* Analyze a ter
fc30: 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70 6f 73  m that is compos
fc40: 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ed of two or mor
fc50: 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65  e subterms conne
fc60: 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e 20  cted by.  ** an 
fc70: 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  OR operator..  *
fc80: 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78  /.  else if( pEx
fc90: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b  pr->op==TK_OR ){
fca0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 43  .    assert( pWC
fcb0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a  ->op==TK_AND );.
fcc0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f      exprAnalyzeO
fcd0: 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57 43 2c  rTerm(pSrc, pWC,
fce0: 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 70   idxTerm);.    p
fcf0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
fd00: 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e  dxTerm];.  }.#en
fd10: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
fd20: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
fd30: 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ON */..#ifndef S
fd40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
fd50: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f  OPTIMIZATION.  /
fd60: 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e 74  * Add constraint
fd70: 73 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20  s to reduce the 
fd80: 73 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e 20  search space on 
fd90: 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20  a LIKE or GLOB. 
fda0: 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   ** operator..  
fdb0: 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70  **.  ** A like p
fdc0: 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20 66 6f  attern of the fo
fdd0: 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62 63 25  rm "x LIKE 'abc%
fde0: 27 22 20 69 73 20 63 68 61 6e 67 65 64 20 69 6e  '" is changed in
fdf0: 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  to constraints. 
fe00: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
fe10: 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44 20 78    x>='abc' AND x
fe20: 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c 49 4b  <'abd' AND x LIK
fe30: 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a 20 20  E 'abc%'.  **.  
fe40: 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68 61 72  ** The last char
fe50: 61 63 74 65 72 20 6f 66 20 74 68 65 20 70 72 65  acter of the pre
fe60: 66 69 78 20 22 61 62 63 22 20 69 73 20 69 6e 63  fix "abc" is inc
fe70: 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d  remented to form
fe80: 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e   the.  ** termin
fe90: 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20  ation condition 
fea0: 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66  "abd"..  */.  if
feb0: 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  ( pWC->op==TK_AN
fec0: 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b 65 4f  D .   && isLikeO
fed0: 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20 70 45  rGlob(pParse, pE
fee0: 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26 69 73  xpr, &pStr1, &is
fef0: 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73  Complete, &noCas
ff00: 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72  e).  ){.    Expr
ff10: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 2f   *pLeft;       /
ff20: 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c  * LHS of LIKE/GL
ff30: 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  OB operator */. 
ff40: 20 20 20 45 78 70 72 20 2a 70 53 74 72 32 3b 20     Expr *pStr2; 
ff50: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
ff60: 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f 66 20   pStr1 - RHS of 
ff70: 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74  LIKE/GLOB operat
ff80: 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  or */.    Expr *
ff90: 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20 20 45  pNewExpr1;.    E
ffa0: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a  xpr *pNewExpr2;.
ffb0: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31 3b      int idxNew1;
ffc0: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 32  .    int idxNew2
ffd0: 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c  ;.    Token sCol
ffe0: 6c 53 65 71 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61  lSeqName;  /* Na
fff0: 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e 67 20  me of collating 
10000 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20  sequence */..   
10010 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e   pLeft = pExpr->
10020 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
10030 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32 20 3d  xpr;.    pStr2 =
10040 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
10050 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a 20  db, pStr1, 0);. 
10060 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c     if( !db->mall
10070 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
10080 20 20 75 38 20 63 2c 20 2a 70 43 3b 20 20 20 20    u8 c, *pC;    
10090 20 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 72 61     /* Last chara
100a0 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20  cter before the 
100b0 66 69 72 73 74 20 77 69 6c 64 63 61 72 64 20 2a  first wildcard *
100c0 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28 75 38  /.      pC = (u8
100d0 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b  *)&pStr2->u.zTok
100e0 65 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  en[sqlite3Strlen
100f0 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b  30(pStr2->u.zTok
10100 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20 63 20  en)-1];.      c 
10110 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69 66 28  = *pC;.      if(
10120 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20 20   noCase ){.     
10130 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20     /* The point 
10140 69 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20  is to increment 
10150 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  the last charact
10160 65 72 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  er before the fi
10170 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  rst.        ** w
10180 69 6c 64 63 61 72 64 2e 20 20 42 75 74 20 69 66  ildcard.  But if
10190 20 77 65 20 69 6e 63 72 65 6d 65 6e 74 20 27 40   we increment '@
101a0 27 2c 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  ', that will pus
101b0 68 20 69 74 20 69 6e 74 6f 20 74 68 65 0a 20 20  h it into the.  
101c0 20 20 20 20 20 20 2a 2a 20 61 6c 70 68 61 62 65        ** alphabe
101d0 74 69 63 20 72 61 6e 67 65 20 77 68 65 72 65 20  tic range where 
101e0 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73  case conversions
101f0 20 77 69 6c 6c 20 6d 65 73 73 20 75 70 20 74 68   will mess up th
10200 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  e .        ** in
10210 65 71 75 61 6c 69 74 79 2e 20 20 54 6f 20 61 76  equality.  To av
10220 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b 65 20 73  oid this, make s
10230 75 72 65 20 74 6f 20 61 6c 73 6f 20 72 75 6e 20  ure to also run 
10240 74 68 65 20 66 75 6c 6c 0a 20 20 20 20 20 20 20  the full.       
10250 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c 6c 20   ** LIKE on all 
10260 63 61 6e 64 69 64 61 74 65 20 65 78 70 72 65 73  candidate expres
10270 73 69 6f 6e 73 20 62 79 20 63 6c 65 61 72 69 6e  sions by clearin
10280 67 20 74 68 65 20 69 73 43 6f 6d 70 6c 65 74 65  g the isComplete
10290 20 66 6c 61 67 0a 20 20 20 20 20 20 20 20 2a 2f   flag.        */
102a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
102b0 27 41 27 2d 31 20 29 20 69 73 43 6f 6d 70 6c 65  'A'-1 ) isComple
102c0 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  te = 0;.        
102d0 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72  c = sqlite3Upper
102e0 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20  ToLower[c];.    
102f0 20 20 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d 20    }.      *pC = 
10300 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  c + 1;.    }.   
10310 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e 7a 20   sCollSeqName.z 
10320 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f 43 41  = noCase ? "NOCA
10330 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a  SE" : "BINARY";.
10340 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65      sCollSeqName
10350 2e 6e 20 3d 20 36 3b 0a 20 20 20 20 70 4e 65 77  .n = 6;.    pNew
10360 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 45  Expr1 = sqlite3E
10370 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
10380 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78  , 0);.    pNewEx
10390 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78  pr1 = sqlite3PEx
103a0 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 45  pr(pParse, TK_GE
103b0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  , .           sq
103c0 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c  lite3ExprAddColl
103d0 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c  ateToken(pParse,
103e0 70 4e 65 77 45 78 70 72 31 2c 26 73 43 6f 6c 6c  pNewExpr1,&sColl
103f0 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  SeqName),.      
10400 20 20 20 20 20 70 53 74 72 31 2c 20 30 29 3b 0a       pStr1, 0);.
10410 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e      transferJoin
10420 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78 70  Markings(pNewExp
10430 72 31 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  r1, pExpr);.    
10440 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43  idxNew1 = whereC
10450 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
10460 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52 4d   pNewExpr1, TERM
10470 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
10480 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74  NAMIC);.    test
10490 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d 3d 30  case( idxNew1==0
104a0 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c   );.    exprAnal
104b0 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
104c0 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e 65  dxNew1);.    pNe
104d0 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33  wExpr2 = sqlite3
104e0 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66  ExprDup(db, pLef
104f0 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 45  t, 0);.    pNewE
10500 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33 50 45  xpr2 = sqlite3PE
10510 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c  xpr(pParse, TK_L
10520 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  T,.           sq
10530 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c  lite3ExprAddColl
10540 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c  ateToken(pParse,
10550 70 4e 65 77 45 78 70 72 32 2c 26 73 43 6f 6c 6c  pNewExpr2,&sColl
10560 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  SeqName),.      
10570 20 20 20 20 20 70 53 74 72 32 2c 20 30 29 3b 0a       pStr2, 0);.
10580 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e      transferJoin
10590 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78 70  Markings(pNewExp
105a0 72 32 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  r2, pExpr);.    
105b0 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43  idxNew2 = whereC
105c0 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
105d0 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d   pNewExpr2, TERM
105e0 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
105f0 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74  NAMIC);.    test
10600 63 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30  case( idxNew2==0
10610 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c   );.    exprAnal
10620 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
10630 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65  dxNew2);.    pTe
10640 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
10650 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69  Term];.    if( i
10660 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20  sComplete ){.   
10670 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77     pWC->a[idxNew
10680 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  1].iParent = idx
10690 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d  Term;.      pWC-
106a0 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72  >a[idxNew2].iPar
106b0 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
106c0 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
106d0 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  ld = 2;.    }.  
106e0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
106f0 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
10700 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
10710 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10720 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
10730 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54   /* Add a WO_MAT
10740 43 48 20 61 75 78 69 6c 69 61 72 79 20 74 65 72  CH auxiliary ter
10750 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61  m to the constra
10760 69 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a 20  int set if the. 
10770 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72   ** current expr
10780 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
10790 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d   form:  column M
107a0 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20  ATCH expr..  ** 
107b0 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
107c0 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
107d0 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f  xBestIndex metho
107e0 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75  ds of.  ** virtu
107f0 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20  al tables.  The 
10800 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f 70 74  native query opt
10810 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20  imizer does not 
10820 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20  attempt.  ** to 
10830 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68  do anything with
10840 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73   MATCH functions
10850 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d  ..  */.  if( isM
10860 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78  atchOfColumn(pEx
10870 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  pr) ){.    int i
10880 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20  dxNew;.    Expr 
10890 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b  *pRight, *pLeft;
108a0 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
108b0 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69  pNewTerm;.    Bi
108c0 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75  tmask prereqColu
108d0 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a  mn, prereqExpr;.
108e0 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45  .    pRight = pE
108f0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
10900 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c  0].pExpr;.    pL
10910 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  eft = pExpr->x.p
10920 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
10930 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78 70 72  ;.    prereqExpr
10940 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
10950 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67  e(pMaskSet, pRig
10960 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43  ht);.    prereqC
10970 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c  olumn = exprTabl
10980 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
10990 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28   pLeft);.    if(
109a0 20 28 70 72 65 72 65 71 45 78 70 72 20 26 20 70   (prereqExpr & p
109b0 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20  rereqColumn)==0 
109c0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
109d0 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70  NewExpr;.      p
109e0 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
109f0 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
10a00 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20  K_MATCH, .      
10a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a20 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74          0, sqlit
10a30 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 52  e3ExprDup(db, pR
10a40 69 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20  ight, 0), 0);.  
10a50 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
10a60 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
10a70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45  WC, pNewExpr, TE
10a80 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
10a90 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
10aa0 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
10ab0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
10ac0 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  wTerm = &pWC->a[
10ad0 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70  idxNew];.      p
10ae0 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  NewTerm->prereqR
10af0 69 67 68 74 20 3d 20 70 72 65 72 65 71 45 78 70  ight = prereqExp
10b00 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  r;.      pNewTer
10b10 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
10b20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
10b30 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75       pNewTerm->u
10b40 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
10b50 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
10b60 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f      pNewTerm->eO
10b70 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54  perator = WO_MAT
10b80 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  CH;.      pNewTe
10b90 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64  rm->iParent = id
10ba0 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65  xTerm;.      pTe
10bb0 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
10bc0 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65  Term];.      pTe
10bd0 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
10be0 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
10bf0 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
10c00 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  IED;.      pNewT
10c10 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
10c20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
10c30 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  l;.    }.  }.#en
10c40 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
10c50 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
10c60 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
10c70 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20  E_ENABLE_STAT3. 
10c80 20 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f   /* When sqlite_
10c90 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20  stat3 histogram 
10ca0 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c  data is availabl
10cb0 65 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66  e an operator of
10cc0 20 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22   the.  ** form "
10cd0 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63  x IS NOT NULL" c
10ce0 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20  an sometimes be 
10cf0 65 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65  evaluated more e
10d00 66 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20  fficiently.  ** 
10d10 61 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78  as "x>NULL" if x
10d20 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
10d30 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20  ER PRIMARY KEY. 
10d40 20 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a   So construct a.
10d50 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72    ** virtual ter
10d60 6d 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a  m of that form..
10d70 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
10d80 68 61 74 20 74 68 65 20 76 69 72 74 75 61 6c 20  hat the virtual 
10d90 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67  term must be tag
10da0 67 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e  ged with TERM_VN
10db0 55 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ULL.  This.  ** 
10dc0 54 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77  TERM_VNULL tag w
10dd0 69 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68 65  ill suppress the
10de0 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20   not-null check 
10df0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
10e00 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f  .  ** of the loo
10e10 70 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65 20  p.  Without the 
10e20 54 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c  TERM_VNULL flag,
10e30 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68   the not-null ch
10e40 65 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  eck at.  ** the 
10e50 73 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f  start of the loo
10e60 70 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61  p will prevent a
10e70 6e 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  ny results from 
10e80 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a  being returned..
10e90 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72    */.  if( pExpr
10ea0 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op==TK_NOTNULL
10eb0 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  .   && pExpr->pL
10ec0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
10ed0 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e  MN.   && pExpr->
10ee0 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pLeft->iColumn>=
10ef0 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61  0.   && Optimiza
10f00 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
10f10 53 51 4c 49 54 45 5f 53 74 61 74 33 29 0a 20 20  SQLITE_Stat3).  
10f20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  ){.    Expr *pNe
10f30 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  wExpr;.    Expr 
10f40 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
10f50 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69  pLeft;.    int i
10f60 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65  dxNew;.    Where
10f70 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
10f80 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20  .    pNewExpr = 
10f90 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
10fa0 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20  rse, TK_GT,.    
10fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
10fd0 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
10fe0 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
10ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11000 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70    sqlite3PExpr(p
11010 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20  Parse, TK_NULL, 
11020 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20  0, 0, 0), 0);.. 
11030 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
11040 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
11050 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20  C, pNewExpr,.   
11060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11070 20 20 20 20 20 20 20 20 20 20 20 54 45 52 4d 5f             TERM_
11080 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
11090 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29  AMIC|TERM_VNULL)
110a0 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65 77  ;.    if( idxNew
110b0 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   ){.      pNewTe
110c0 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
110d0 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  New];.      pNew
110e0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
110f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  t = 0;.      pNe
11100 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  wTerm->leftCurso
11110 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
11120 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  e;.      pNewTer
11130 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  m->u.leftColumn 
11140 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
11150 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
11160 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
11170 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  _GT;.      pNewT
11180 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  erm->iParent = i
11190 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
111a0 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
111b0 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54  xTerm];.      pT
111c0 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
111d0 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
111e0 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
111f0 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77  PIED;.      pNew
11200 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
11210 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  = pTerm->prereqA
11220 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ll;.    }.  }.#e
11230 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
11240 4e 41 42 4c 45 5f 53 54 41 54 20 2a 2f 0a 0a 20  NABLE_STAT */.. 
11250 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20 63   /* Prevent ON c
11260 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 61  lause terms of a
11270 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20   LEFT JOIN from 
11280 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64 72  being used to dr
11290 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ive.  ** an inde
112a0 78 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20  x for tables to 
112b0 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
112c0 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65  join..  */.  pTe
112d0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
112e0 7c 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a 7d  |= extraRight;.}
112f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
11300 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 70  ction searches p
11310 4c 69 73 74 20 66 6f 72 20 61 20 65 6e 74 72 79  List for a entry
11320 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
11330 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
11340 0a 2a 2a 20 6f 66 20 69 6e 64 65 78 20 70 49 64  .** of index pId
11350 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68  x..**.** If such
11360 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
11370 73 20 66 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64  s found, its ind
11380 65 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d  ex in pList->a[]
11390 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
113a0 0a 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73 69 6f  .** no expressio
113b0 6e 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69  n is found, -1 i
113c0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
113d0 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e  tatic int findIn
113e0 64 65 78 43 6f 6c 28 0a 20 20 50 61 72 73 65 20  dexCol(.  Parse 
113f0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
11400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
11410 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
11420 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
11430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11440 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69  /* Expression li
11450 73 74 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  st to search */.
11460 20 20 69 6e 74 20 69 42 61 73 65 2c 20 20 20 20    int iBase,    
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11480 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20    /* Cursor for 
11490 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  table associated
114a0 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20   with pIdx */.  
114b0 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
114c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114d0 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61 74 63  /* Index to matc
114e0 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20  h column of */. 
114f0 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20   int iCol       
11500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11510 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e   /* Column of in
11520 64 65 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a  dex to match */.
11530 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  ){.  int i;.  co
11540 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
11550 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  = pIdx->azColl[i
11560 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Col];..  for(i=0
11570 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
11580 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
11590 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70   *p = sqlite3Exp
115a0 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69  rSkipCollate(pLi
115b0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
115c0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
115d0 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26  TK_COLUMN.     &
115e0 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  & p->iColumn==pI
115f0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f  dx->aiColumn[iCo
11600 6c 5d 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 54  l].     && p->iT
11610 61 62 6c 65 3d 3d 69 42 61 73 65 0a 20 20 20 20  able==iBase.    
11620 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
11630 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
11640 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
11650 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  rse, pList->a[i]
11660 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  .pExpr);.      i
11670 66 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29  f( ALWAYS(pColl)
11680 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
11690 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
116a0 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  me, zColl) ){.  
116b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a        return i;.
116c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
116d0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  }..  return -1;.
116e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
116f0 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  true if the DIST
11700 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d  INCT expression-
11710 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
11720 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
11730 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e  t.** is redundan
11740 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49  t..**.** A DISTI
11750 4e 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75  NCT list is redu
11760 6e 64 61 6e 74 20 69 66 20 74 68 65 20 64 61 74  ndant if the dat
11770 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 73  abase contains s
11780 6f 6d 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a  ome subset of.**
11790 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72   columns that ar
117a0 65 20 75 6e 69 71 75 65 20 61 6e 64 20 6e 6f 6e  e unique and non
117b0 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  -null..*/.static
117c0 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52   int isDistinctR
117d0 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73  edundant(.  Pars
117e0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
117f0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11800 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
11810 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
11820 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
11830 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
11840 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
11850 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
11860 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
11870 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
11880 73 74 69 6e 63 74 20 20 20 20 20 20 20 2f 2a 20  stinct       /* 
11890 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74  The result set t
118a0 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
118b0 44 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20  DISTINCT */.){. 
118c0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
118d0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
118e0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
118f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
11900 20 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20    int iBase;..  
11910 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d  /* If there is m
11920 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62  ore than one tab
11930 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74  le or sub-select
11940 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
11950 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  use of.  ** this
11960 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20   query, then it 
11970 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
11980 69 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61  ible to show tha
11990 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a  t the DISTINCT .
119a0 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72    ** clause is r
119b0 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69  edundant. */.  i
119c0 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
119d0 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
119e0 0a 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c  .  iBase = pTabL
119f0 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
11a00 72 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62  r;.  pTab = pTab
11a10 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  List->a[0].pTab;
11a20 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66  ..  /* If any of
11a30 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
11a40 20 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d   is an IPK colum
11a50 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65  n on table iBase
11a60 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20  , then return . 
11a70 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20   ** true. Note: 
11a80 54 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d  The (p->iTable==
11a90 69 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74  iBase) part of t
11aa0 68 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20  his test may be 
11ab0 66 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a  false if the.  *
11ac0 2a 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  * current SELECT
11ad0 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
11ae0 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f   sub-query..  */
11af0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44  .  for(i=0; i<pD
11b00 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20  istinct->nExpr; 
11b10 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
11b20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
11b30 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74  kipCollate(pDist
11b40 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  inct->a[i].pExpr
11b50 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  );.    if( p->op
11b60 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
11b70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20  ->iTable==iBase 
11b80 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  && p->iColumn<0 
11b90 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
11ba0 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
11bb0 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  gh all indices o
11bc0 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65  n the table, che
11bd0 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65  cking each to se
11be0 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20  e if it makes.  
11bf0 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  ** the DISTINCT 
11c00 71 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64  qualifier redund
11c10 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20  ant. It does so 
11c20 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  if:.  **.  **   
11c30 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  1. The index is 
11c40 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61  itself UNIQUE, a
11c50 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32  nd.  **.  **   2
11c60 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c  . All of the col
11c70 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
11c80 78 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72  x are either par
11c90 74 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e  t of the pDistin
11ca0 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73  ct.  **      lis
11cb0 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57  t, or else the W
11cc0 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
11cd0 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ains a term of t
11ce0 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c  he form "col=X",
11cf0 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65  .  **      where
11d00 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74   X is a constant
11d10 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c   value. The coll
11d20 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
11d30 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20  of the.  **     
11d40 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20   comparison and 
11d50 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72  select-list expr
11d60 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74  essions must mat
11d70 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20  ch those of the 
11d80 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
11d90 20 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f     3. All of tho
11da0 73 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  se index columns
11db0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57   for which the W
11dc0 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73  HERE clause does
11dd0 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63   not.  **      c
11de0 6f 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22  ontain a "col=X"
11df0 20 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63   term are subjec
11e00 74 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20  t to a NOT NULL 
11e10 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f  constraint..  */
11e20 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
11e30 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
11e40 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
11e50 29 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  ){.    if( pIdx-
11e60 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e  >onError==OE_Non
11e70 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
11e80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
11e90 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
11ea0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
11eb0 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
11ec0 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  n[i];.      if( 
11ed0 30 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57 43 2c  0==findTerm(pWC,
11ee0 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28   iBase, iCol, ~(
11ef0 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51  Bitmask)0, WO_EQ
11f00 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20  , pIdx) ){.     
11f10 20 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 20 3d     int iIdxCol =
11f20 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50   findIndexCol(pP
11f30 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c  arse, pDistinct,
11f40 20 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29   iBase, pIdx, i)
11f50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 49  ;.        if( iI
11f60 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61 62 2d  dxCol<0 || pTab-
11f70 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f  >aCol[pIdx->aiCo
11f80 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c  lumn[i]].notNull
11f90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11fa0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
11fb0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
11fc0 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78 2d      if( i==pIdx-
11fd0 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
11fe0 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20    /* This index 
11ff0 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65  implies that the
12000 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
12010 69 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e 74  ier is redundant
12020 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
12030 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n 1;.    }.  }..
12040 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
12050 2a 20 0a 2a 2a 20 46 69 6e 64 20 28 61 6e 20 61  * .** Find (an a
12060 70 70 72 6f 78 69 6d 61 74 65 29 20 73 75 6d 20  pproximate) sum 
12070 6f 66 20 74 77 6f 20 57 68 65 72 65 43 6f 73 74  of two WhereCost
12080 73 2e 20 20 54 68 69 73 20 63 6f 6d 70 75 74 61  s.  This computa
12090 74 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 61  tion is.** not a
120a0 20 73 69 6d 70 6c 65 20 22 2b 22 20 6f 70 65 72   simple "+" oper
120b0 61 74 6f 72 20 62 65 63 61 75 73 65 20 57 68 65  ator because Whe
120c0 72 65 43 6f 73 74 20 69 73 20 73 74 6f 72 65 64  reCost is stored
120d0 20 61 73 20 61 20 6c 6f 67 61 72 69 74 68 6d 69   as a logarithmi
120e0 63 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 20 0a  c.** value..** .
120f0 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 43  */.static WhereC
12100 6f 73 74 20 77 68 65 72 65 43 6f 73 74 41 64 64  ost whereCostAdd
12110 28 57 68 65 72 65 43 6f 73 74 20 61 2c 20 57 68  (WhereCost a, Wh
12120 65 72 65 43 6f 73 74 20 62 29 7b 0a 20 20 73 74  ereCost b){.  st
12130 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
12140 6e 65 64 20 63 68 61 72 20 78 5b 5d 20 3d 20 7b  ned char x[] = {
12150 0a 20 20 20 20 20 31 30 2c 20 31 30 2c 20 20 20  .     10, 10,   
12160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12170 20 20 20 20 20 20 2f 2a 20 30 2c 31 20 2a 2f 0a        /* 0,1 */.
12180 20 20 20 20 20 20 39 2c 20 39 2c 20 20 20 20 20        9, 9,     
12190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121a0 20 20 20 20 20 2f 2a 20 32 2c 33 20 2a 2f 0a 20       /* 2,3 */. 
121b0 20 20 20 20 20 38 2c 20 38 2c 20 20 20 20 20 20       8, 8,      
121c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121d0 20 20 20 20 2f 2a 20 34 2c 35 20 2a 2f 0a 20 20      /* 4,5 */.  
121e0 20 20 20 20 37 2c 20 37 2c 20 37 2c 20 20 20 20      7, 7, 7,    
121f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12200 20 20 20 2f 2a 20 36 2c 37 2c 38 20 2a 2f 0a 20     /* 6,7,8 */. 
12210 20 20 20 20 20 36 2c 20 36 2c 20 36 2c 20 20 20       6, 6, 6,   
12220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12230 20 20 20 20 2f 2a 20 39 2c 31 30 2c 31 31 20 2a      /* 9,10,11 *
12240 2f 0a 20 20 20 20 20 20 35 2c 20 35 2c 20 35 2c  /.      5, 5, 5,
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12260 20 20 20 20 20 20 20 2f 2a 20 31 32 2d 31 34 20         /* 12-14 
12270 2a 2f 0a 20 20 20 20 20 20 34 2c 20 34 2c 20 34  */.      4, 4, 4
12280 2c 20 34 2c 20 20 20 20 20 20 20 20 20 20 20 20  , 4,            
12290 20 20 20 20 20 20 20 20 2f 2a 20 31 35 2d 31 38          /* 15-18
122a0 20 2a 2f 0a 20 20 20 20 20 20 33 2c 20 33 2c 20   */.      3, 3, 
122b0 33 2c 20 33 2c 20 33 2c 20 33 2c 20 20 20 20 20  3, 3, 3, 3,     
122c0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 39 2d 32           /* 19-2
122d0 34 20 2a 2f 0a 20 20 20 20 20 20 32 2c 20 32 2c  4 */.      2, 2,
122e0 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20   2, 2, 2, 2, 2, 
122f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 35 2d            /* 25-
12300 33 31 20 2a 2f 0a 20 20 7d 3b 0a 20 20 69 66 28  31 */.  };.  if(
12310 20 61 3e 3d 62 20 29 7b 0a 20 20 20 20 69 66 28   a>=b ){.    if(
12320 20 61 3e 62 2b 34 39 20 29 20 72 65 74 75 72 6e   a>b+49 ) return
12330 20 61 3b 0a 20 20 20 20 69 66 28 20 61 3e 62 2b   a;.    if( a>b+
12340 33 31 20 29 20 72 65 74 75 72 6e 20 61 2b 31 3b  31 ) return a+1;
12350 0a 20 20 20 20 72 65 74 75 72 6e 20 61 2b 78 5b  .    return a+x[
12360 61 2d 62 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  a-b];.  }else{. 
12370 20 20 20 69 66 28 20 62 3e 61 2b 34 39 20 29 20     if( b>a+49 ) 
12380 72 65 74 75 72 6e 20 62 3b 0a 20 20 20 20 69 66  return b;.    if
12390 28 20 62 3e 61 2b 33 31 20 29 20 72 65 74 75 72  ( b>a+31 ) retur
123a0 6e 20 62 2b 31 3b 0a 20 20 20 20 72 65 74 75 72  n b+1;.    retur
123b0 6e 20 62 2b 78 5b 62 2d 61 5d 3b 0a 20 20 7d 0a  n b+x[b-a];.  }.
123c0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
123d0 20 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 74 6f   an integer into
123e0 20 61 20 57 68 65 72 65 43 6f 73 74 2e 20 20 49   a WhereCost.  I
123f0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 63  n other words, c
12400 6f 6d 70 75 74 65 20 61 0a 2a 2a 20 67 6f 6f 64  ompute a.** good
12410 20 61 70 70 72 6f 78 69 6d 61 74 61 74 69 6f 6e   approximatation
12420 20 66 6f 72 20 31 30 2a 6c 6f 67 32 28 78 29 2e   for 10*log2(x).
12430 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65  .*/.static Where
12440 43 6f 73 74 20 77 68 65 72 65 43 6f 73 74 28 74  Cost whereCost(t
12450 52 6f 77 63 6e 74 20 78 29 7b 0a 20 20 73 74 61  Rowcnt x){.  sta
12460 74 69 63 20 57 68 65 72 65 43 6f 73 74 20 61 5b  tic WhereCost a[
12470 5d 20 3d 20 7b 20 30 2c 20 32 2c 20 33 2c 20 35  ] = { 0, 2, 3, 5
12480 2c 20 36 2c 20 37 2c 20 38 2c 20 39 20 7d 3b 0a  , 6, 7, 8, 9 };.
12490 20 20 57 68 65 72 65 43 6f 73 74 20 79 20 3d 20    WhereCost y = 
124a0 34 30 3b 0a 20 20 69 66 28 20 78 3c 38 20 29 7b  40;.  if( x<8 ){
124b0 0a 20 20 20 20 69 66 28 20 78 3c 32 20 29 20 72  .    if( x<2 ) r
124c0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69  eturn 0;.    whi
124d0 6c 65 28 20 78 3c 38 20 29 7b 20 20 79 20 2d 3d  le( x<8 ){  y -=
124e0 20 31 30 3b 20 78 20 3c 3c 3d 20 31 3b 20 7d 0a   10; x <<= 1; }.
124f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
12500 6c 65 28 20 78 3e 32 35 35 20 29 7b 20 79 20 2b  le( x>255 ){ y +
12510 3d 20 34 30 3b 20 78 20 3e 3e 3d 20 34 3b 20 7d  = 40; x >>= 4; }
12520 0a 20 20 20 20 77 68 69 6c 65 28 20 78 3e 31 35  .    while( x>15
12530 20 29 7b 20 20 79 20 2b 3d 20 31 30 3b 20 78 20   ){  y += 10; x 
12540 3e 3e 3d 20 31 3b 20 7d 0a 20 20 7d 0a 20 20 72  >>= 1; }.  }.  r
12550 65 74 75 72 6e 20 61 5b 78 26 37 5d 20 2b 20 79  eturn a[x&7] + y
12560 20 2d 20 31 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65   - 10;.}..#ifnde
12570 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
12580 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
12590 20 43 6f 6e 76 65 72 74 20 61 20 64 6f 75 62 6c   Convert a doubl
125a0 65 20 28 61 73 20 72 65 63 65 69 76 65 64 20 66  e (as received f
125b0 72 6f 6d 20 78 42 65 73 74 49 6e 64 65 78 20 6f  rom xBestIndex o
125c0 66 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  f a virtual tabl
125d0 65 29 0a 2a 2a 20 69 6e 74 6f 20 61 20 57 68 65  e).** into a Whe
125e0 72 65 43 6f 73 74 2e 20 20 49 6e 20 6f 74 68 65  reCost.  In othe
125f0 72 20 77 6f 72 64 73 2c 20 63 6f 6d 70 75 74 65  r words, compute
12600 20 61 6e 20 61 70 70 72 6f 78 69 6d 61 74 69 6f   an approximatio
12610 6e 20 66 6f 72 0a 2a 2a 20 31 30 2a 6c 6f 67 32  n for.** 10*log2
12620 28 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  (x)..*/.static W
12630 68 65 72 65 43 6f 73 74 20 77 68 65 72 65 43 6f  hereCost whereCo
12640 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 64 6f 75  stFromDouble(dou
12650 62 6c 65 20 78 29 7b 0a 20 20 75 36 34 20 61 3b  ble x){.  u64 a;
12660 0a 20 20 57 68 65 72 65 43 6f 73 74 20 65 3b 0a  .  WhereCost e;.
12670 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
12680 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66  (x)==8 && sizeof
12690 28 61 29 3d 3d 38 20 29 3b 0a 20 20 69 66 28 20  (a)==8 );.  if( 
126a0 78 3c 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  x<=1 ) return 0;
126b0 0a 20 20 69 66 28 20 78 3c 3d 32 30 30 30 30 30  .  if( x<=200000
126c0 30 30 30 30 20 29 20 72 65 74 75 72 6e 20 77 68  0000 ) return wh
126d0 65 72 65 43 6f 73 74 28 28 74 52 6f 77 63 6e 74  ereCost((tRowcnt
126e0 29 78 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61  )x);.  memcpy(&a
126f0 2c 20 26 78 2c 20 38 29 3b 0a 20 20 65 20 3d 20  , &x, 8);.  e = 
12700 28 61 3e 3e 35 32 29 20 2d 20 31 30 32 32 3b 0a  (a>>52) - 1022;.
12710 20 20 72 65 74 75 72 6e 20 65 2a 31 30 3b 0a 7d    return e*10;.}
12720 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12730 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
12740 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 73  BLE */../*.** Es
12750 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72  timate the logar
12760 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75  ithm of the inpu
12770 74 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20  t value to base 
12780 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  2..*/.static Whe
12790 72 65 43 6f 73 74 20 65 73 74 4c 6f 67 28 57 68  reCost estLog(Wh
127a0 65 72 65 43 6f 73 74 20 4e 29 7b 0a 20 20 57 68  ereCost N){.  Wh
127b0 65 72 65 43 6f 73 74 20 78 20 3d 20 77 68 65 72  ereCost x = wher
127c0 65 43 6f 73 74 28 4e 29 3b 0a 20 20 72 65 74 75  eCost(N);.  retu
127d0 72 6e 20 78 3e 33 33 20 3f 20 78 20 2d 20 33 33  rn x>33 ? x - 33
127e0 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   : 0;.}../*.** T
127f0 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  wo routines for 
12800 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e  printing the con
12810 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74  tent of an sqlit
12820 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a  e3_index_info.**
12830 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65   structure.  Use
12840 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
12850 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
12860 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a  .  If neither.**
12870 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20   SQLITE_TEST or 
12880 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65  SQLITE_DEBUG are
12890 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74   defined, then t
128a0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a  hese routines.**
128b0 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a   are no-ops..*/.
128c0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
128d0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
128e0 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
128f0 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  d(WHERETRACE_ENA
12900 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f 69  BLED).static voi
12910 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  d TRACE_IDX_INPU
12920 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
12930 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
12940 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
12950 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
12960 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
12970 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
12980 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
12990 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
129a0 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25  ("  constraint[%
129b0 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69  d]: col=%d termi
129c0 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c  d=%d op=%d usabl
129d0 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ed=%d\n",.      
129e0 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
129f0 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f  onstraint[i].iCo
12a00 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
12a10 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
12a20 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20  TermOffset,.    
12a30 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
12a40 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20  t[i].op,.       
12a50 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
12a60 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20  ].usable);.  }. 
12a70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
12a80 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
12a90 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
12aa0 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79  rintf("  orderby
12ab0 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73  [%d]: col=%d des
12ac0 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
12ad0 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  i,.       p->aOr
12ae0 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
12af0 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
12b00 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20  erBy[i].desc);. 
12b10 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
12b20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
12b30 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
12b40 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
12b50 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
12b60 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
12b70 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
12b80 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
12b90 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
12ba0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
12bb0 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61  ("  usage[%d]: a
12bc0 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25  rgvIdx=%d omit=%
12bd0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
12be0 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
12bf0 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
12c00 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20  gvIndex,.       
12c10 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
12c20 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20  age[i].omit);.  
12c30 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
12c40 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d  Printf("  idxNum
12c50 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75  =%d\n", p->idxNu
12c60 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  m);.  sqlite3Deb
12c70 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53  ugPrintf("  idxS
12c80 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78  tr=%s\n", p->idx
12c90 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Str);.  sqlite3D
12ca0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72  ebugPrintf("  or
12cb0 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64  derByConsumed=%d
12cc0 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43  \n", p->orderByC
12cd0 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69  onsumed);.  sqli
12ce0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
12cf0 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d    estimatedCost=
12d00 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61  %g\n", p->estima
12d10 74 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73  tedCost);.}.#els
12d20 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f  e.#define TRACE_
12d30 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64  IDX_INPUTS(A).#d
12d40 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f  efine TRACE_IDX_
12d50 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69  OUTPUTS(A).#endi
12d60 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
12d70 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
12d80 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74  _INDEX./*.** Ret
12d90 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
12da0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
12db0 6d 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61 20  m pTerm is of a 
12dc0 66 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a  form where it.**
12dd0 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 77   could be used w
12de0 69 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ith an index to 
12df0 61 63 63 65 73 73 20 70 53 72 63 2c 20 61 73 73  access pSrc, ass
12e00 75 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72  uming an appropr
12e10 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78  iate.** index ex
12e20 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  isted..*/.static
12e30 20 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69 76   int termCanDriv
12e40 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 54  eIndex(.  WhereT
12e50 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20  erm *pTerm,     
12e60 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52           /* WHER
12e70 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  E clause term to
12e80 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75   check */.  stru
12e90 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
12ea0 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61  *pSrc,     /* Ta
12eb0 62 6c 65 20 77 65 20 61 72 65 20 74 72 79 69 6e  ble we are tryin
12ec0 67 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20  g to access */. 
12ed0 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
12ee0 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
12ef0 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75 74  /* Tables in out
12f00 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20  er loops of the 
12f10 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  join */.){.  cha
12f20 72 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54 65  r aff;.  if( pTe
12f30 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rm->leftCursor!=
12f40 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
12f50 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
12f60 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
12f70 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20  r & WO_EQ)==0 ) 
12f80 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
12f90 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
12fa0 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21  ght & notReady)!
12fb0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
12fc0 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65   if( pTerm->u.le
12fd0 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  ftColumn<0 ) ret
12fe0 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70  urn 0;.  aff = p
12ff0 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  Src->pTab->aCol[
13000 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
13010 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  umn].affinity;. 
13020 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64   if( !sqlite3Ind
13030 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65  exAffinityOk(pTe
13040 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20  rm->pExpr, aff) 
13050 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
13060 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
13070 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
13080 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
13090 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e  _INDEX./*.** Gen
130a0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f  erate code to co
130b0 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65  nstruct the Inde
130c0 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20  x object for an 
130d0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a  automatic index.
130e0 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70  ** and to set up
130f0 20 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20   the WhereLevel 
13100 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f  object pLevel so
13110 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 67   that the code g
13120 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65  enerator.** make
13130 73 20 75 73 65 20 6f 66 20 74 68 65 20 61 75 74  s use of the aut
13140 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f  omatic index..*/
13150 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e  .static void con
13160 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49  structAutomaticI
13170 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
13180 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
13190 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
131a0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
131b0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
131c0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
131d0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
131e0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
131f0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
13200 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
13210 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20  use term to get 
13220 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a  the next index *
13230 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
13240 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
13250 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
13260 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
13270 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57  available */.  W
13280 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
13290 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  l          /* Wr
132a0 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65  ite new index he
132b0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
132c0 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
132d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
132e0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
132f0 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  he constructed i
13300 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54  ndex */.  WhereT
13310 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
13320 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
13330 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
13340 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
13350 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e  WhereTerm *pWCEn
13360 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  d;          /* E
13370 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a  nd of pWC->a[] *
13380 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
13390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133a0 2f 2a 20 42 79 74 65 20 6f 66 20 6d 65 6d 6f 72  /* Byte of memor
133b0 79 20 6e 65 65 64 65 64 20 66 6f 72 20 70 49 64  y needed for pId
133c0 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  x */.  Index *pI
133d0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
133e0 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73     /* Object des
133f0 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e  cribing the tran
13400 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20  sient index */. 
13410 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
13420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13430 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
13440 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
13450 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
13460 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20  ddrInit;        
13470 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
13480 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c  s of the initial
13490 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a  ization bypass j
134a0 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ump */.  Table *
134b0 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  pTable;         
134c0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
134d0 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
134e0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
134f0 65 79 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyinfo;         
13500 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74   /* Key informat
13510 69 6f 6e 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ion for the inde
13520 78 20 2a 2f 20 20 20 0a 20 20 69 6e 74 20 61 64  x */   .  int ad
13530 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
13540 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
13550 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c  the index fill l
13560 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  oop */.  int reg
13570 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
13580 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
13590 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65   holding an inde
135a0 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  x record */.  in
135b0 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
135c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
135d0 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  umn counter */. 
135e0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
135f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13600 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
13610 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20    int mxBitCol; 
13620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13630 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20   Maximum column 
13640 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  in pSrc->colUsed
13650 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
13660 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
13670 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
13680 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20  equence to on a 
13690 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72  column */.  Wher
136a0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
136b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
136c0 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
136d0 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b  Bitmask idxCols;
136e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
136f0 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73  itmap of columns
13700 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69   used for indexi
13710 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ng */.  Bitmask 
13720 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20  extraCols;      
13730 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
13740 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
13750 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74  mns */.  u8 sent
13760 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20  Warning = 0;    
13770 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
13780 61 20 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62  a warnning has b
13790 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 0a 20  een issued */.. 
137a0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
137b0 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74  e to skip over t
137c0 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  he creation and 
137d0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
137e0 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  f the.  ** trans
137f0 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e  ient index on 2n
13800 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
13810 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74   iterations of t
13820 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20  he loop. */.  v 
13830 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
13840 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
13850 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20  );.  addrInit = 
13860 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
13870 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 43  pParse);..  /* C
13880 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
13890 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
138a0 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f  will be added to
138b0 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
138c0 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63  and used to matc
138d0 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  h WHERE clause c
138e0 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
138f0 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 70  nColumn = 0;.  p
13900 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
13910 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26  ab;.  pWCEnd = &
13920 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
13930 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  m];.  pLoop = pL
13940 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
13950 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
13960 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
13970 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
13980 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
13990 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
139a0 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
139b0 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
139c0 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
139d0 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
139e0 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
139f0 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
13a00 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53  MS ? MASKBIT(BMS
13a10 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43  -1) : MASKBIT(iC
13a20 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ol);.      testc
13a30 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29  ase( iCol==BMS )
13a40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13a50 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ( iCol==BMS-1 );
13a60 0a 20 20 20 20 20 20 69 66 28 20 21 73 65 6e 74  .      if( !sent
13a70 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20 20  Warning ){.     
13a80 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
13a90 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55  QLITE_WARNING_AU
13aa0 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20 20  TOINDEX,.       
13ab0 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63 20       "automatic 
13ac0 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29 22  index on %s(%s)"
13ad0 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c  , pTable->zName,
13ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61  .            pTa
13af0 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  ble->aCol[iCol].
13b00 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
13b10 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31 3b  sentWarning = 1;
13b20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
13b30 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
13b40 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
13b50 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
13b60 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64  Resize(pParse->d
13b70 62 2c 20 70 4c 6f 6f 70 2c 20 6e 43 6f 6c 75 6d  b, pLoop, nColum
13b80 6e 2b 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  n+1) ) return;. 
13b90 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c         pLoop->aL
13ba0 54 65 72 6d 5b 6e 43 6f 6c 75 6d 6e 2b 2b 5d 20  Term[nColumn++] 
13bb0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
13bc0 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
13bd0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
13be0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
13bf0 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c  Column>0 );.  pL
13c00 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
13c10 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d   = pLoop->nLTerm
13c20 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 4c   = nColumn;.  pL
13c30 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
13c40 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c  HERE_COLUMN_EQ |
13c50 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
13c60 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 0a  | WHERE_INDEXED.
13c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c80 20 20 20 20 20 7c 20 57 48 45 52 45 5f 41 55 54       | WHERE_AUT
13c90 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43  O_INDEX;..  /* C
13ca0 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
13cb0 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
13cc0 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
13cd0 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f  create a.  ** co
13ce0 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41  vering index.  A
13cf0 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78   "covering index
13d00 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  " is an index th
13d10 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  at contains all.
13d20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61    ** columns tha
13d30 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  t are needed by 
13d40 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68  the query.  With
13d50 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
13d60 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  x, the.  ** orig
13d70 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72  inal table never
13d80 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63   needs to be acc
13d90 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69  essed.  Automati
13da0 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20  c indices must. 
13db0 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e   ** be a coverin
13dc0 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  g index because 
13dd0 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e  the index will n
13de0 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66  ot be updated if
13df0 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
13e00 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73  al table changes
13e10 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61   and the index a
13e20 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20  nd table cannot 
13e30 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a  both be used.  *
13e40 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74  * if they go out
13e50 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20   of sync..  */. 
13e60 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72   extraCols = pSr
13e70 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69  c->colUsed & (~i
13e80 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54  dxCols | MASKBIT
13e90 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69  (BMS-1));.  mxBi
13ea0 74 43 6f 6c 20 3d 20 28 70 54 61 62 6c 65 2d 3e  tCol = (pTable->
13eb0 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29 20 3f  nCol >= BMS-1) ?
13ec0 20 42 4d 53 2d 31 20 3a 20 70 54 61 62 6c 65 2d   BMS-1 : pTable-
13ed0 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73 74 63 61 73  >nCol;.  testcas
13ee0 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d  e( pTable->nCol=
13ef0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74  =BMS-1 );.  test
13f00 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43  case( pTable->nC
13f10 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66  ol==BMS-2 );.  f
13f20 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43  or(i=0; i<mxBitC
13f30 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
13f40 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41  ( extraCols & MA
13f50 53 4b 42 49 54 28 69 29 20 29 20 6e 43 6f 6c 75  SKBIT(i) ) nColu
13f60 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  mn++;.  }.  if( 
13f70 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
13f80 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29  MASKBIT(BMS-1) )
13f90 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 2b 3d  {.    nColumn +=
13fa0 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20   pTable->nCol - 
13fb0 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 70  BMS + 1;.  }.  p
13fc0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
13fd0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
13fe0 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   | WHERE_IDX_ONL
13ff0 59 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75  Y;..  /* Constru
14000 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
14010 65 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20  ect to describe 
14020 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20  this index */.  
14030 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 49  nByte = sizeof(I
14040 6e 64 65 78 29 3b 0a 20 20 6e 42 79 74 65 20 2b  ndex);.  nByte +
14050 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66  = nColumn*sizeof
14060 28 69 6e 74 29 3b 20 20 20 20 20 2f 2a 20 49 6e  (int);     /* In
14070 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 2a 2f 0a  dex.aiColumn */.
14080 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75    nByte += nColu
14090 6d 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  mn*sizeof(char*)
140a0 3b 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43  ;   /* Index.azC
140b0 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b  oll */.  nByte +
140c0 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  = nColumn;      
140d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
140e0 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a  dex.aSortOrder *
140f0 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74  /.  pIdx = sqlit
14100 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
14110 50 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74 65  Parse->db, nByte
14120 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30  );.  if( pIdx==0
14130 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f   ) return;.  pLo
14140 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
14150 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64  ex = pIdx;.  pId
14160 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61  x->azColl = (cha
14170 72 2a 2a 29 26 70 49 64 78 5b 31 5d 3b 0a 20 20  r**)&pIdx[1];.  
14180 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  pIdx->aiColumn =
14190 20 28 69 6e 74 2a 29 26 70 49 64 78 2d 3e 61 7a   (int*)&pIdx->az
141a0 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20  Coll[nColumn];. 
141b0 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
141c0 72 20 3d 20 28 75 38 2a 29 26 70 49 64 78 2d 3e  r = (u8*)&pIdx->
141d0 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e  aiColumn[nColumn
141e0 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  ];.  pIdx->zName
141f0 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b   = "auto-index";
14200 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  .  pIdx->nColumn
14210 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 49   = nColumn;.  pI
14220 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  dx->pTable = pTa
14230 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  ble;.  n = 0;.  
14240 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
14250 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
14260 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
14270 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
14280 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
14290 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
142a0 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
142b0 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
142c0 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
142d0 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
142e0 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
142f0 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53  MS ? MASKBIT(BMS
14300 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43  -1) : MASKBIT(iC
14310 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ol);.      testc
14320 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31  ase( iCol==BMS-1
14330 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14340 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b  se( iCol==BMS );
14350 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43  .      if( (idxC
14360 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20  ols & cMask)==0 
14370 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
14380 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
14390 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43  pr;.        idxC
143a0 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20  ols |= cMask;.  
143b0 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
143c0 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d  lumn[n] = pTerm-
143d0 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
143e0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
143f0 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
14400 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
14410 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58  e, pX->pLeft, pX
14420 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
14430 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
14440 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70 43 6f 6c  n] = ALWAYS(pCol
14450 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  l) ? pColl->zNam
14460 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  e : "BINARY";.  
14470 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
14480 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
14490 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d 70  ssert( (u32)n==p
144a0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
144b0 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61  q );..  /* Add a
144c0 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
144d0 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65  s needed to make
144e0 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
144f0 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61  ndex into.  ** a
14500 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
14510 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
14520 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  mxBitCol; i++){.
14530 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c      if( extraCol
14540 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29  s & MASKBIT(i) )
14550 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69  {.      pIdx->ai
14560 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20  Column[n] = i;. 
14570 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
14580 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b  l[n] = "BINARY";
14590 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
145a0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  }.  }.  if( pSrc
145b0 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b  ->colUsed & MASK
145c0 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20  BIT(BMS-1) ){.  
145d0 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69    for(i=BMS-1; i
145e0 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69  <pTable->nCol; i
145f0 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ++){.      pIdx-
14600 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69  >aiColumn[n] = i
14610 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a  ;.      pIdx->az
14620 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52  Coll[n] = "BINAR
14630 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  Y";.      n++;. 
14640 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
14650 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b  t( n==nColumn );
14660 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
14670 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
14680 78 20 2a 2f 0a 20 20 70 4b 65 79 69 6e 66 6f 20  x */.  pKeyinfo 
14690 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
146a0 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
146b0 64 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dx);.  assert( p
146c0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d  Level->iIdxCur>=
146d0 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 69  0 );.  pLevel->i
146e0 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d  IdxCur = pParse-
146f0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74  >nTab++;.  sqlit
14700 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
14710 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78  OP_OpenAutoindex
14720 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
14730 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c  r, nColumn+1, 0,
14740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14750 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
14760 69 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  info, P4_KEYINFO
14770 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 56 64 62  _HANDOFF);.  Vdb
14780 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f  eComment((v, "fo
14790 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  r %s", pTable->z
147a0 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69  Name));..  /* Fi
147b0 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ll the automatic
147c0 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74   index with cont
147d0 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70  ent */.  addrTop
147e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
147f0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
14800 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  d, pLevel->iTabC
14810 75 72 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64  ur);.  regRecord
14820 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
14830 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
14840 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
14850 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20  ndexKey(pParse, 
14860 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  pIdx, pLevel->iT
14870 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64  abCur, regRecord
14880 2c 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 1, 0);.  sqlit
14890 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
148a0 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c  OP_IdxInsert, pL
148b0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72  evel->iIdxCur, r
148c0 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
148d0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
148e0 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
148f0 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c  EKRESULT);.  sql
14900 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14910 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65  , OP_Next, pLeve
14920 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64 72  l->iTabCur, addr
14930 54 6f 70 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  Top+1);.  sqlite
14940 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
14950 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
14960 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20  US_AUTOINDEX);. 
14970 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
14980 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29  Here(v, addrTop)
14990 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
149a0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
149b0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
149c0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
149d0 77 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68  when skipping th
149e0 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
149f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
14a00 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
14a10 72 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  rInit);.}.#endif
14a20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
14a30 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
14a40 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
14a50 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
14a60 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ABLE./*.** Alloc
14a70 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ate and populate
14a80 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
14a90 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
14aa0 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
14ab0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
14ac0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
14ad0 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61  eventually relea
14ae0 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  se the structure
14af0 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74  .** by passing t
14b00 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
14b10 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
14b20 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f  tion to sqlite3_
14b30 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
14b40 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  c sqlite3_index_
14b50 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e  info *allocateIn
14b60 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65  dexInfo(.  Parse
14b70 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65 72   *pParse,.  Wher
14b80 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20  eClause *pWC,.  
14b90 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
14ba0 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78 70  tem *pSrc,.  Exp
14bb0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 0a  rList *pOrderBy.
14bc0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
14bd0 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74   int nTerm;.  st
14be0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
14bf0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
14c00 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
14c10 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
14c20 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64  orderby *pIdxOrd
14c30 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73  erBy;.  struct s
14c40 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
14c50 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70  straint_usage *p
14c60 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65  Usage;.  WhereTe
14c70 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
14c80 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c   nOrderBy;.  sql
14c90 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
14ca0 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a  *pIdxInfo;..  /*
14cb0 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
14cc0 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48  r of possible WH
14cd0 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
14ce0 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67  raints referring
14cf0 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69  .  ** to this vi
14d00 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
14d10 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20   for(i=nTerm=0, 
14d20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
14d30 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
14d40 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
14d50 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
14d60 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
14d70 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
14d80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49 73  ;.    assert( Is
14d90 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d  PowerOfTwo(pTerm
14da0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57  ->eOperator & ~W
14db0 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20  O_EQUIV) );.    
14dc0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
14dd0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
14de0 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IN );.    testca
14df0 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
14e00 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
14e10 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72   );.    if( pTer
14e20 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
14e30 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e  WO_ISNULL) ) con
14e40 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
14e50 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
14e60 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e  TERM_VNULL ) con
14e70 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d  tinue;.    nTerm
14e80 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ++;.  }..  /* If
14e90 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
14ea0 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  ause contains on
14eb0 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ly columns in th
14ec0 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20  e current .  ** 
14ed0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
14ee0 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  en allocate spac
14ef0 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72  e for the aOrder
14f00 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20  By part of.  ** 
14f10 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
14f20 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
14f30 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42  ..  */.  nOrderB
14f40 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72  y = 0;.  if( pOr
14f50 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74  derBy ){.    int
14f60 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e   n = pOrderBy->n
14f70 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Expr;.    for(i=
14f80 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
14f90 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
14fa0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
14fb0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
14fc0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
14fd0 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d  COLUMN || pExpr-
14fe0 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69  >iTable!=pSrc->i
14ff0 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a  Cursor ) break;.
15000 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
15010 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65  =n){.      nOrde
15020 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20  rBy = n;.    }. 
15030 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
15040 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  e the sqlite3_in
15050 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
15060 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e  re.  */.  pIdxIn
15070 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
15080 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
15090 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64  >db, sizeof(*pId
150a0 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20  xInfo).         
150b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150c0 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64    + (sizeof(*pId
150d0 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28  xCons) + sizeof(
150e0 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a  *pUsage))*nTerm.
150f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15100 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a             + siz
15110 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79  eof(*pIdxOrderBy
15120 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  )*nOrderBy );.  
15130 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
15140 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
15150 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
15160 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b  out of memory");
15170 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
15180 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
15190 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ize the structur
151a0 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  e.  The sqlite3_
151b0 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
151c0 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20  ture contains.  
151d0 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
151e0 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
151f0 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
15200 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
15210 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e  rom.  ** changin
15220 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65  g them.  We have
15230 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b   to do some funk
15240 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64  y casting in ord
15250 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69  er to.  ** initi
15260 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c  alize those fiel
15270 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43  ds..  */.  pIdxC
15280 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71  ons = (struct sq
15290 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
152a0 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66  traint*)&pIdxInf
152b0 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65  o[1];.  pIdxOrde
152c0 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71  rBy = (struct sq
152d0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
152e0 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e  rby*)&pIdxCons[n
152f0 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20  Term];.  pUsage 
15300 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
15310 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
15320 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f  nt_usage*)&pIdxO
15330 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d  rderBy[nOrderBy]
15340 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
15350 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
15360 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69  t = nTerm;.  *(i
15370 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
15380 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
15390 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
153a0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
153b0 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
153c0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
153d0 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a   = pIdxCons;.  *
153e0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
153f0 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29  index_orderby**)
15400 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65  &pIdxInfo->aOrde
15410 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42  rBy = pIdxOrderB
15420 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
15430 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
15440 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26  traint_usage**)&
15450 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
15460 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20  raintUsage =.   
15470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154b0 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69  pUsage;..  for(i
154c0 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  =j=0, pTerm=pWC-
154d0 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
154e0 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
154f0 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20  .    u8 op;.    
15500 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
15510 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
15520 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
15530 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49  e;.    assert( I
15540 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72  sPowerOfTwo(pTer
15550 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
15560 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20  WO_EQUIV) );.   
15570 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
15580 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
15590 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
155a0 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
155b0 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
155c0 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  L );.    if( pTe
155d0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
155e0 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f  (WO_ISNULL) ) co
155f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
15600 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
15610 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
15620 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78  ntinue;.    pIdx
15630 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20  Cons[j].iColumn 
15640 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
15650 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43  olumn;.    pIdxC
15660 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[j].iTermOffs
15670 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d  et = i;.    op =
15680 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65   (u8)pTerm->eOpe
15690 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a  rator & WO_ALL;.
156a0 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49      if( op==WO_I
156b0 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a  N ) op = WO_EQ;.
156c0 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
156d0 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20  op = op;.    /* 
156e0 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69 67  The direct assig
156f0 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65  nment in the pre
15700 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f  vious line is po
15710 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61  ssible only beca
15720 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57  use.    ** the W
15730 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e  O_ and SQLITE_IN
15740 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20  DEX_CONSTRAINT_ 
15750 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69  codes are identi
15760 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  cal.  The.    **
15770 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
15780 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66  ts verify this f
15790 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  act. */.    asse
157a0 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54  rt( WO_EQ==SQLIT
157b0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
157c0 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73  NT_EQ );.    ass
157d0 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49  ert( WO_LT==SQLI
157e0 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
157f0 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73  INT_LT );.    as
15800 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c  sert( WO_LE==SQL
15810 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
15820 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61  AINT_LE );.    a
15830 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51  ssert( WO_GT==SQ
15840 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
15850 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20  RAINT_GT );.    
15860 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53  assert( WO_GE==S
15870 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
15880 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20  TRAINT_GE );.   
15890 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43   assert( WO_MATC
158a0 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  H==SQLITE_INDEX_
158b0 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48  CONSTRAINT_MATCH
158c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
158d0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
158e0 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c   & (WO_IN|WO_EQ|
158f0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
15900 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48  T|WO_GE|WO_MATCH
15910 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20  ) );.    j++;.  
15920 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
15930 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
15940 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
15950 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
15960 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f  pExpr;.    pIdxO
15970 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
15980 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
15990 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  mn;.    pIdxOrde
159a0 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f  rBy[i].desc = pO
159b0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
159c0 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72  tOrder;.  }..  r
159d0 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a  eturn pIdxInfo;.
159e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62  }../*.** The tab
159f0 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65  le object refere
15a00 6e 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68  nce passed as th
15a10 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
15a20 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
15a30 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65  on.** must repre
15a40 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74  sent a virtual t
15a50 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
15a60 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ion invokes the 
15a70 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20  xBestIndex().** 
15a80 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
15a90 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68  rtual table with
15aa0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
15ab0 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74  ex_info object t
15ac0 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20  hat.** comes in 
15ad0 61 73 20 74 68 65 20 33 72 64 20 61 72 67 75 6d  as the 3rd argum
15ae0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
15af0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
15b00 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
15b10 70 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61  pParse is popula
15b20 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ted with an erro
15b30 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a  r message and a.
15b40 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
15b50 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
15b60 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
15b70 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
15b80 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f  output.** part o
15b90 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  f the sqlite3_in
15ba0 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
15bb0 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c  re is left popul
15bc0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ated..**.** Whet
15bd0 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72  her or not an er
15be0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ror is returned,
15bf0 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
15c00 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
15c10 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
15c20 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d  entually free p-
15c30 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65  >idxStr if p->ne
15c40 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69  edToFreeIdxStr i
15c50 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74  ndicates.** that
15c60 20 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65   this is require
15c70 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
15c80 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50   vtabBestIndex(P
15c90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
15ca0 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74  ble *pTab, sqlit
15cb0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
15cc0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  ){.  sqlite3_vta
15cd0 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74  b *pVtab = sqlit
15ce0 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72  e3GetVTable(pPar
15cf0 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70  se->db, pTab)->p
15d00 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vtab;.  int i;. 
15d10 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43   int rc;..  TRAC
15d20 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b  E_IDX_INPUTS(p);
15d30 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70  .  rc = pVtab->p
15d40 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64  Module->xBestInd
15d50 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20  ex(pVtab, p);.  
15d60 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
15d70 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  S(p);..  if( rc!
15d80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15d90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15da0 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
15db0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
15dc0 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
15dd0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74    }else if( !pVt
15de0 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20  ab->zErrMsg ){. 
15df0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
15e00 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
15e10 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
15e20 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (rc));.    }else
15e30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
15e40 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15e50 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72  "%s", pVtab->zEr
15e60 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rMsg);.    }.  }
15e70 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
15e80 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
15e90 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  .  pVtab->zErrMs
15ea0 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  g = 0;..  for(i=
15eb0 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
15ec0 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  int; i++){.    i
15ed0 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69  f( !p->aConstrai
15ee0 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20  nt[i].usable && 
15ef0 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
15f00 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
15f10 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
15f20 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15f30 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
15f40 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49  table %s: xBestI
15f50 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e  ndex returned an
15f60 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20   invalid plan", 
15f70 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
15f80 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
15f90 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a  n pParse->nErr;.
15fa0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
15fb0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
15fc0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a  _VIRTUALTABLE) *
15fd0 2f 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  /...#ifdef SQLIT
15fe0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f  E_ENABLE_STAT3./
15ff0 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
16000 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20  e location of a 
16010 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20 61  particular key a
16020 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e  mong all keys in
16030 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53   an.** index.  S
16040 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
16050 20 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f 6c   in aStat as fol
16060 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61  lows:.**.**    a
16070 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73 74  Stat[0]      Est
16080 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  . number of rows
16090 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61 6c 0a   less than pVal.
160a0 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 20  **    aStat[1]  
160b0 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20      Est. number 
160c0 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74 6f  of rows equal to
160d0 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75   pVal.**.** Retu
160e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
160f0 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  success..*/.stat
16100 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53  ic int whereKeyS
16110 74 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70  tats(.  Parse *p
16120 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
16130 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
16140 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
16150 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
16160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
16170 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72  ndex to consider
16180 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20   domain of */.  
16190 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
161a0 56 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 56  Val,        /* V
161b0 61 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64 65 72  alue to consider
161c0 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55   */.  int roundU
161d0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
161e0 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66    /* Round up if
161f0 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f   true.  Round do
16200 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20  wn if false */. 
16210 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20   tRowcnt *aStat 
16220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16230 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74 74  OUT: stats writt
16240 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  en here */.){.  
16250 74 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 49 6e 64  tRowcnt n;.  Ind
16260 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c  exSample *aSampl
16270 65 3b 0a 20 20 69 6e 74 20 69 2c 20 65 54 79 70  e;.  int i, eTyp
16280 65 3b 0a 20 20 69 6e 74 20 69 73 45 71 20 3d 20  e;.  int isEq = 
16290 30 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 64 6f  0;.  i64 v;.  do
162a0 75 62 6c 65 20 72 2c 20 72 53 3b 0a 0a 20 20 61  uble r, rS;..  a
162b0 73 73 65 72 74 28 20 72 6f 75 6e 64 55 70 3d 3d  ssert( roundUp==
162c0 30 20 7c 7c 20 72 6f 75 6e 64 55 70 3d 3d 31 20  0 || roundUp==1 
162d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
162e0 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  x->nSample>0 );.
162f0 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 29 20    if( pVal==0 ) 
16300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
16310 52 4f 52 3b 0a 20 20 6e 20 3d 20 70 49 64 78 2d  ROR;.  n = pIdx-
16320 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20  >aiRowEst[0];.  
16330 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e  aSample = pIdx->
16340 61 53 61 6d 70 6c 65 3b 0a 20 20 65 54 79 70 65  aSample;.  eType
16350 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
16360 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a 20 20  _type(pVal);..  
16370 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  if( eType==SQLIT
16380 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  E_INTEGER ){.   
16390 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   v = sqlite3_val
163a0 75 65 5f 69 6e 74 36 34 28 70 56 61 6c 29 3b 0a  ue_int64(pVal);.
163b0 20 20 20 20 72 20 3d 20 28 69 36 34 29 76 3b 0a      r = (i64)v;.
163c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
163d0 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b  Idx->nSample; i+
163e0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
163f0 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d  ample[i].eType==
16400 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f  SQLITE_NULL ) co
16410 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
16420 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  ( aSample[i].eTy
16430 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  pe>=SQLITE_TEXT 
16440 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
16450 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  f( aSample[i].eT
16460 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  ype==SQLITE_INTE
16470 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 69  GER ){.        i
16480 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e  f( aSample[i].u.
16490 69 3e 3d 76 20 29 7b 0a 20 20 20 20 20 20 20 20  i>=v ){.        
164a0 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65    isEq = aSample
164b0 5b 69 5d 2e 75 2e 69 3d 3d 76 3b 0a 20 20 20 20  [i].u.i==v;.    
164c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
164d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
164e0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
164f0 72 74 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  rt( aSample[i].e
16500 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f  Type==SQLITE_FLO
16510 41 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AT );.        if
16520 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72  ( aSample[i].u.r
16530 3e 3d 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=r ){.         
16540 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b   isEq = aSample[
16550 69 5d 2e 75 2e 72 3d 3d 72 3b 0a 20 20 20 20 20  i].u.r==r;.     
16560 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16570 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
16580 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
16590 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c  eType==SQLITE_FL
165a0 4f 41 54 20 29 7b 0a 20 20 20 20 72 20 3d 20 73  OAT ){.    r = s
165b0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
165c0 62 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 66  ble(pVal);.    f
165d0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
165e0 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20  nSample; i++){. 
165f0 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65       if( aSample
16600 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54  [i].eType==SQLIT
16610 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  E_NULL ) continu
16620 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61  e;.      if( aSa
16630 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53  mple[i].eType>=S
16640 51 4c 49 54 45 5f 54 45 58 54 20 29 20 62 72 65  QLITE_TEXT ) bre
16650 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53  ak;.      if( aS
16660 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d  ample[i].eType==
16670 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a  SQLITE_FLOAT ){.
16680 20 20 20 20 20 20 20 20 72 53 20 3d 20 61 53 61          rS = aSa
16690 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3b 0a 20 20 20  mple[i].u.r;.   
166a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
166b0 20 20 72 53 20 3d 20 61 53 61 6d 70 6c 65 5b 69    rS = aSample[i
166c0 5d 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a 20  ].u.i;.      }. 
166d0 20 20 20 20 20 69 66 28 20 72 53 3e 3d 72 20 29       if( rS>=r )
166e0 7b 0a 20 20 20 20 20 20 20 20 69 73 45 71 20 3d  {.        isEq =
166f0 20 72 53 3d 3d 72 3b 0a 20 20 20 20 20 20 20 20   rS==r;.        
16700 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
16710 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
16720 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e   eType==SQLITE_N
16730 55 4c 4c 20 29 7b 0a 20 20 20 20 69 20 3d 20 30  ULL ){.    i = 0
16740 3b 0a 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c  ;.    if( aSampl
16750 65 5b 30 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49  e[0].eType==SQLI
16760 54 45 5f 4e 55 4c 4c 20 29 20 69 73 45 71 20 3d  TE_NULL ) isEq =
16770 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
16780 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
16790 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20 65  SQLITE_TEXT || e
167a0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  Type==SQLITE_BLO
167b0 42 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  B );.    for(i=0
167c0 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ; i<pIdx->nSampl
167d0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; i++){.      i
167e0 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  f( aSample[i].eT
167f0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype==SQLITE_TEXT
16800 20 7c 7c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65   || aSample[i].e
16810 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  Type==SQLITE_BLO
16820 42 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  B ){.        bre
16830 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
16840 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 49 64 78  }.    if( i<pIdx
16850 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 20 20 20 20  ->nSample ){    
16860 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33    .      sqlite3
16870 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
16880 62 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  b;.      CollSeq
16890 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 63   *pColl;.      c
168a0 6f 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20 20 20  onst u8 *z;.    
168b0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
168c0 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20  ITE_BLOB ){.    
168d0 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75      z = (const u
168e0 38 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  8 *)sqlite3_valu
168f0 65 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a 20 20  e_blob(pVal);.  
16900 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62        pColl = db
16910 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
16920 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
16930 6c 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  ll->enc==SQLITE_
16940 55 54 46 38 20 29 3b 0a 20 20 20 20 20 20 7d 65  UTF8 );.      }e
16950 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  lse{.        pCo
16960 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
16970 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 53  ollSeq(pParse, S
16980 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 2a  QLITE_UTF8, 0, *
16990 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20  pIdx->azColl);. 
169a0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
169b0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
169c0 6e 63 65 20 77 61 73 20 75 6e 61 76 61 69 6c 61  nce was unavaila
169d0 62 6c 65 2c 20 77 65 20 73 68 6f 75 6c 64 20 68  ble, we should h
169e0 61 76 65 20 66 61 69 6c 65 64 0a 20 20 20 20 20  ave failed.     
169f0 20 20 20 2a 2a 20 6c 6f 6e 67 20 61 67 6f 20 61     ** long ago a
16a00 6e 64 20 6e 65 76 65 72 20 72 65 61 63 68 65 64  nd never reached
16a10 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 20 42 75   this point.  Bu
16a20 74 20 77 65 27 6c 6c 20 63 68 65 63 6b 20 6a 75  t we'll check ju
16a30 73 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  st to.        **
16a40 20 62 65 20 64 6f 75 62 6c 79 20 73 75 72 65 2e   be doubly sure.
16a50 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
16a60 4e 45 56 45 52 28 70 43 6f 6c 6c 3d 3d 30 29 20  NEVER(pColl==0) 
16a70 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
16a80 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7a  ERROR;.        z
16a90 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a 29 73   = (const u8 *)s
16aa0 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
16ab0 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  pVal, pColl->enc
16ac0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
16ad0 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  z ){.          r
16ae0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
16af0 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  EM;.        }.  
16b00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 20        assert( z 
16b10 26 26 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  && pColl && pCol
16b20 6c 2d 3e 78 43 6d 70 20 29 3b 0a 20 20 20 20 20  l->xCmp );.     
16b30 20 7d 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c   }.      n = sql
16b40 69 74 65 33 56 61 6c 75 65 42 79 74 65 73 28 70  ite3ValueBytes(p
16b50 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29  Val, pColl->enc)
16b60 3b 0a 20 20 0a 20 20 20 20 20 20 66 6f 72 28 3b  ;.  .      for(;
16b70 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   i<pIdx->nSample
16b80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
16b90 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69  int c;.        i
16ba0 6e 74 20 65 53 61 6d 70 6c 65 74 79 70 65 20 3d  nt eSampletype =
16bb0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
16bc0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  e;.        if( e
16bd0 53 61 6d 70 6c 65 74 79 70 65 3c 65 54 79 70 65  Sampletype<eType
16be0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
16bf0 20 20 20 20 20 69 66 28 20 65 53 61 6d 70 6c 65       if( eSample
16c00 74 79 70 65 21 3d 65 54 79 70 65 20 29 20 62 72  type!=eType ) br
16c10 65 61 6b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  eak;.#ifndef SQL
16c20 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
16c30 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
16c40 2d 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54  ->enc!=SQLITE_UT
16c50 46 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  F8 ){.          
16c60 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20  int nSample;.   
16c70 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 61         char *zSa
16c80 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 55 74  mple = sqlite3Ut
16c90 66 38 74 6f 31 36 28 0a 20 20 20 20 20 20 20 20  f8to16(.        
16ca0 20 20 20 20 20 20 64 62 2c 20 70 43 6f 6c 6c 2d        db, pColl-
16cb0 3e 65 6e 63 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  >enc, aSample[i]
16cc0 2e 75 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  .u.z, aSample[i]
16cd0 2e 6e 42 79 74 65 2c 20 26 6e 53 61 6d 70 6c 65  .nByte, &nSample
16ce0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
16cf0 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 53 61          if( !zSa
16d00 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  mple ){.        
16d10 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
16d20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
16d30 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
16d40 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
16d50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
16d60 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c         c = pColl
16d70 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
16d80 73 65 72 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a 53  ser, nSample, zS
16d90 61 6d 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20 20  ample, n, z);.  
16da0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
16db0 62 46 72 65 65 28 64 62 2c 20 7a 53 61 6d 70 6c  bFree(db, zSampl
16dc0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
16dd0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  e.#endif.       
16de0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d   {.          c =
16df0 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
16e00 6c 6c 2d 3e 70 55 73 65 72 2c 20 61 53 61 6d 70  ll->pUser, aSamp
16e10 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 61 53 61  le[i].nByte, aSa
16e20 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c 20  mple[i].u.z, n, 
16e30 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  z);.        }.  
16e40 20 20 20 20 20 20 69 66 28 20 63 3e 3d 30 20 29        if( c>=0 )
16e50 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
16e60 63 3d 3d 30 20 29 20 69 73 45 71 20 3d 20 31 3b  c==0 ) isEq = 1;
16e70 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
16e80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16e90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
16ea0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
16eb0 74 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73  t, aSample[i] is
16ec0 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c   the first sampl
16ed0 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
16ee0 72 20 74 68 61 6e 0a 20 20 2a 2a 20 6f 72 20 65  r than.  ** or e
16ef0 71 75 61 6c 20 74 6f 20 70 56 61 6c 2e 20 20 4f  qual to pVal.  O
16f00 72 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53  r if i==pIdx->nS
16f10 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 6c 6c 20  ample, then all 
16f20 73 61 6d 70 6c 65 73 20 61 72 65 20 6c 65 73 73  samples are less
16f30 0a 20 20 2a 2a 20 74 68 61 6e 20 70 56 61 6c 2e  .  ** than pVal.
16f40 20 20 49 66 20 61 53 61 6d 70 6c 65 5b 69 5d 3d    If aSample[i]=
16f50 3d 70 56 61 6c 2c 20 74 68 65 6e 20 69 73 45 71  =pVal, then isEq
16f60 3d 3d 31 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ==1..  */.  if( 
16f70 69 73 45 71 20 29 7b 0a 20 20 20 20 61 73 73 65  isEq ){.    asse
16f80 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d  rt( i<pIdx->nSam
16f90 70 6c 65 20 29 3b 0a 20 20 20 20 61 53 74 61 74  ple );.    aStat
16fa0 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  [0] = aSample[i]
16fb0 2e 6e 4c 74 3b 0a 20 20 20 20 61 53 74 61 74 5b  .nLt;.    aStat[
16fc0 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  1] = aSample[i].
16fd0 6e 45 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nEq;.  }else{.  
16fe0 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72    tRowcnt iLower
16ff0 2c 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b 0a  , iUpper, iGap;.
17000 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a      if( i==0 ){.
17010 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30        iLower = 0
17020 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d  ;.      iUpper =
17030 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 6e 4c 74 3b   aSample[0].nLt;
17040 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17050 20 20 69 55 70 70 65 72 20 3d 20 69 3e 3d 70 49    iUpper = i>=pI
17060 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e 20  dx->nSample ? n 
17070 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74  : aSample[i].nLt
17080 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d  ;.      iLower =
17090 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 45   aSample[i-1].nE
170a0 71 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d  q + aSample[i-1]
170b0 2e 6e 4c 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  .nLt;.    }.    
170c0 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d  aStat[1] = pIdx-
170d0 3e 61 76 67 45 71 3b 0a 20 20 20 20 69 66 28 20  >avgEq;.    if( 
170e0 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29  iLower>=iUpper )
170f0 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 30  {.      iGap = 0
17100 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17110 20 20 20 69 47 61 70 20 3d 20 69 55 70 70 65 72     iGap = iUpper
17120 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d   - iLower;.    }
17130 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70  .    if( roundUp
17140 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d   ){.      iGap =
17150 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20   (iGap*2)/3;.   
17160 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
17170 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20  ap = iGap/3;.   
17180 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20   }.    aStat[0] 
17190 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b  = iLower + iGap;
171a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
171b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
171c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
171d0 4c 45 5f 53 54 41 54 33 20 2a 2f 0a 0a 2f 2a 0a  LE_STAT3 */../*.
171e0 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e  ** If expression
171f0 20 70 45 78 70 72 20 72 65 70 72 65 73 65 6e 74   pExpr represent
17200 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
17210 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f  e, set *pp to po
17220 69 6e 74 20 74 6f 0a 2a 2a 20 61 6e 20 73 71 6c  int to.** an sql
17230 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
17240 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
17250 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2c 20  the same value, 
17260 77 69 74 68 20 61 66 66 69 6e 69 74 79 0a 2a 2a  with affinity.**
17270 20 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f 20   aff applied to 
17280 69 74 2c 20 62 65 66 6f 72 65 20 72 65 74 75 72  it, before retur
17290 6e 69 6e 67 2e 20 49 74 20 69 73 20 74 68 65 20  ning. It is the 
172a0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
172b0 66 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  f the .** caller
172c0 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72   to eventually r
172d0 65 6c 65 61 73 65 20 74 68 69 73 20 73 74 72 75  elease this stru
172e0 63 74 75 72 65 20 62 79 20 70 61 73 73 69 6e 67  cture by passing
172f0 20 69 74 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74   it to .** sqlit
17300 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a  e3ValueFree()..*
17310 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
17320 65 6e 74 20 70 61 72 73 65 20 69 73 20 61 20 72  ent parse is a r
17330 65 63 6f 6d 70 69 6c 65 20 28 73 71 6c 69 74 65  ecompile (sqlite
17340 33 52 65 70 72 65 70 61 72 65 28 29 29 20 61 6e  3Reprepare()) an
17350 64 20 70 45 78 70 72 0a 2a 2a 20 69 73 20 61 6e  d pExpr.** is an
17360 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 74 68   SQL variable th
17370 61 74 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73  at currently has
17380 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
17390 65 20 62 6f 75 6e 64 20 74 6f 20 69 74 2c 0a 2a  e bound to it,.*
173a0 2a 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  * create an sqli
173b0 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
173c0 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
173d0 68 69 73 20 76 61 6c 75 65 2c 20 61 67 61 69 6e  his value, again
173e0 20 77 69 74 68 0a 2a 2a 20 61 66 66 69 6e 69 74   with.** affinit
173f0 79 20 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f  y aff applied to
17400 20 69 74 2c 20 69 6e 73 74 65 61 64 2e 0a 2a 2a   it, instead..**
17410 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 6f  .** If neither o
17420 66 20 74 68 65 20 61 62 6f 76 65 20 61 70 70 6c  f the above appl
17430 79 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55  y, set *pp to NU
17440 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  LL..**.** If an 
17450 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
17460 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
17470 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  de. Otherwise, S
17480 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66  QLITE_OK..*/.#if
17490 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
174a0 45 5f 53 54 41 54 33 0a 73 74 61 74 69 63 20 69  E_STAT3.static i
174b0 6e 74 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72  nt valueFromExpr
174c0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
174d0 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  e, .  Expr *pExp
174e0 72 2c 20 0a 20 20 75 38 20 61 66 66 2c 20 0a 20  r, .  u8 aff, . 
174f0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
17500 2a 70 70 0a 29 7b 0a 20 20 69 66 28 20 70 45 78  *pp.){.  if( pEx
17510 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  pr->op==TK_VARIA
17520 42 4c 45 0a 20 20 20 7c 7c 20 28 70 45 78 70 72  BLE.   || (pExpr
17530 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
17540 52 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 32 3d  R && pExpr->op2=
17550 3d 54 4b 5f 56 41 52 49 41 42 4c 45 29 0a 20 20  =TK_VARIABLE).  
17560 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 72 20  ){.    int iVar 
17570 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
17580 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17590 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72  eSetVarmask(pPar
175a0 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61 72 29  se->pVdbe, iVar)
175b0 3b 0a 20 20 20 20 2a 70 70 20 3d 20 73 71 6c 69  ;.    *pp = sqli
175c0 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56  te3VdbeGetBoundV
175d0 61 6c 75 65 28 70 50 61 72 73 65 2d 3e 70 52 65  alue(pParse->pRe
175e0 70 72 65 70 61 72 65 2c 20 69 56 61 72 2c 20 61  prepare, iVar, a
175f0 66 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ff);.    return 
17600 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
17610 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
17620 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61  alueFromExpr(pPa
17630 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
17640 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 61 66 66  SQLITE_UTF8, aff
17650 2c 20 70 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  , pp);.}.#endif.
17660 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
17670 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
17680 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  estimate the num
17690 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
176a0 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64   will be visited
176b0 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20  .** by scanning 
176c0 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72  an index for a r
176d0 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20  ange of values. 
176e0 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61  The range may ha
176f0 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62  ve an upper.** b
17700 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f  ound, a lower bo
17710 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68  und, or both. Th
17720 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
17730 65 72 6d 73 20 74 68 61 74 20 73 65 74 20 74 68  erms that set th
17740 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c  e upper.** and l
17750 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20  ower bounds are 
17760 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20 70  represented by p
17770 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
17780 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46   respectively. F
17790 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61  or.** example, a
177a0 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64  ssuming that ind
177b0 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29  ex p is on t1(a)
177c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
177d0 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20  OM t1 WHERE a > 
177e0 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a  ? AND a < ? ....
177f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
17800 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20        |_____|   
17810 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20  |_____|.**      
17820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17830 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20   |         |.** 
17840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17850 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55      pLower    pU
17860 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69  pper.**.** If ei
17870 74 68 65 72 20 6f 66 20 74 68 65 20 75 70 70 65  ther of the uppe
17880 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64  r or lower bound
17890 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c   is not present,
178a0 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61   then NULL is pa
178b0 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65  ssed in.** place
178c0 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f   of the correspo
178d0 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e  nding WhereTerm.
178e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 71 20 70  .**.** The nEq p
178f0 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73  arameter is pass
17900 65 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  ed the index of 
17910 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
17920 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 0a   subject to the.
17930 2a 2a 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  ** range constra
17940 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c  int. Or, equival
17950 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65  ently, the numbe
17960 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20 63 6f  r of equality co
17970 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 6f 70 74  nstraints.** opt
17980 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70 72  imized by the pr
17990 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61  oposed index sca
179a0 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  n. For example, 
179b0 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70  assuming index p
179c0 20 69 73 0a 2a 2a 20 6f 6e 20 74 31 28 61 2c 20   is.** on t1(a, 
179d0 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20  b), and the SQL 
179e0 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  query is:.**.** 
179f0 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
17a00 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20  ERE a = ? AND b 
17a10 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e  > ? AND b < ? ..
17a20 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
17a30 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
17a40 64 20 74 68 65 20 76 61 6c 75 65 20 31 20 28 61  d the value 1 (a
17a50 73 20 74 68 65 20 72 61 6e 67 65 20 72 65 73 74  s the range rest
17a60 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 0a 2a  ricted column,.*
17a70 2a 20 62 2c 20 69 73 20 74 68 65 20 73 65 63 6f  * b, is the seco
17a80 6e 64 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  nd left-most col
17a90 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
17aa0 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75  ). Or, if the qu
17ab0 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery is:.**.**   
17ac0 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
17ad0 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20  E a > ? AND a < 
17ae0 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ? ....**.** then
17af0 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65 20 70   nEq should be p
17b00 61 73 73 65 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 54  assed 0..**.** T
17b10 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
17b20 65 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  e is an integer 
17b30 64 69 76 69 73 6f 72 20 74 6f 20 72 65 64 75 63  divisor to reduc
17b40 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 0a  e the estimated.
17b50 2a 2a 20 73 65 61 72 63 68 20 73 70 61 63 65 2e  ** search space.
17b60 20 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75 65    A return value
17b70 20 6f 66 20 31 20 6d 65 61 6e 73 20 74 68 61 74   of 1 means that
17b80 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
17b90 74 73 20 61 72 65 0a 2a 2a 20 6e 6f 20 68 65 6c  ts are.** no hel
17ba0 70 20 61 74 20 61 6c 6c 2e 20 20 41 20 72 65 74  p at all.  A ret
17bb0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 32 20 6d  urn value of 2 m
17bc0 65 61 6e 73 20 72 61 6e 67 65 20 63 6f 6e 73 74  eans range const
17bd0 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20 65 78  raints are.** ex
17be0 70 65 63 74 65 64 20 74 6f 20 72 65 64 75 63 65  pected to reduce
17bf0 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
17c00 65 20 62 79 20 68 61 6c 66 2e 20 20 41 6e 64 20  e by half.  And 
17c10 73 6f 20 66 6f 72 74 68 2e 2e 2e 0a 2a 2a 0a 2a  so forth....**.*
17c20 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65  * In the absence
17c30 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33   of sqlite_stat3
17c40 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 65   ANALYZE data, e
17c50 61 63 68 20 72 61 6e 67 65 20 69 6e 65 71 75 61  ach range inequa
17c60 6c 69 74 79 0a 2a 2a 20 72 65 64 75 63 65 73 20  lity.** reduces 
17c70 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
17c80 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20   by a factor of 
17c90 34 2e 20 20 48 65 6e 63 65 20 61 20 73 69 6e 67  4.  Hence a sing
17ca0 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 78  le constraint (x
17cb0 3e 3f 29 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  >?).** results i
17cc0 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20 34 20  n a return of 4 
17cd0 61 6e 64 20 61 20 72 61 6e 67 65 20 63 6f 6e 73  and a range cons
17ce0 74 72 61 69 6e 74 20 28 78 3e 3f 20 41 4e 44 20  traint (x>? AND 
17cf0 78 3c 3f 29 20 72 65 73 75 6c 74 73 0a 2a 2a 20  x<?) results.** 
17d00 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20 31  in a return of 1
17d10 36 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  6..*/.static int
17d20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45   whereRangeScanE
17d30 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
17d40 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
17d50 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
17d60 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
17d70 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20  */.  Index *p,  
17d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17d90 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 69 6e   index containin
17da0 67 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70  g the range-comp
17db0 61 72 65 64 20 63 6f 6c 75 6d 6e 3b 20 22 78 22  ared column; "x"
17dc0 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c 20 20   */.  int nEq,  
17dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
17de0 64 65 78 20 69 6e 74 6f 20 70 2d 3e 61 43 6f 6c  dex into p->aCol
17df0 5b 5d 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2d  [] of the range-
17e00 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e 20  compared column 
17e10 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
17e20 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77  pLower,   /* Low
17e30 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
17e40 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32  range. ex: "x>12
17e50 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  3" Might be NULL
17e60 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
17e70 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70  *pUpper,   /* Up
17e80 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  per bound on the
17e90 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34   range. ex: "x<4
17ea0 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  55" Might be NUL
17eb0 4c 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  L */.  WhereCost
17ec0 20 2a 70 52 61 6e 67 65 44 69 76 20 2f 2a 20 4f   *pRangeDiv /* O
17ed0 55 54 3a 20 52 65 64 75 63 65 20 73 65 61 72 63  UT: Reduce searc
17ee0 68 20 73 70 61 63 65 20 62 79 20 74 68 69 73 20  h space by this 
17ef0 64 69 76 69 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20  divisor */.){.  
17f00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17f10 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  OK;..#ifdef SQLI
17f20 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
17f30 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26  .  if( nEq==0 &&
17f40 20 70 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20 4f   p->nSample && O
17f50 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
17f60 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  ed(pParse->db, S
17f70 51 4c 49 54 45 5f 53 74 61 74 33 29 20 29 7b 0a  QLITE_Stat3) ){.
17f80 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
17f90 65 20 2a 70 52 61 6e 67 65 56 61 6c 3b 0a 20 20  e *pRangeVal;.  
17fa0 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72    tRowcnt iLower
17fb0 20 3d 20 30 3b 0a 20 20 20 20 74 52 6f 77 63 6e   = 0;.    tRowcn
17fc0 74 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 61 69  t iUpper = p->ai
17fd0 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 74  RowEst[0];.    t
17fe0 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20  Rowcnt a[2];.   
17ff0 20 75 38 20 61 66 66 20 3d 20 70 2d 3e 70 54 61   u8 aff = p->pTa
18000 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43  ble->aCol[p->aiC
18010 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69  olumn[0]].affini
18020 74 79 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 6f  ty;..    if( pLo
18030 77 65 72 20 29 7b 0a 20 20 20 20 20 20 45 78 70  wer ){.      Exp
18040 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65  r *pExpr = pLowe
18050 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
18060 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 76 61 6c  ;.      rc = val
18070 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
18080 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26  e, pExpr, aff, &
18090 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20  pRangeVal);.    
180a0 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 77 65    assert( (pLowe
180b0 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
180c0 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30  WO_GT|WO_GE))!=0
180d0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   );.      if( rc
180e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ==SQLITE_OK.    
180f0 20 20 20 26 26 20 77 68 65 72 65 4b 65 79 53 74     && whereKeySt
18100 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
18110 52 61 6e 67 65 56 61 6c 2c 20 30 2c 20 61 29 3d  RangeVal, 0, a)=
18120 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
18130 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77   ){.        iLow
18140 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20  er = a[0];.     
18150 20 20 20 69 66 28 20 28 70 4c 6f 77 65 72 2d 3e     if( (pLower->
18160 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
18170 54 29 21 3d 30 20 29 20 69 4c 6f 77 65 72 20 2b  T)!=0 ) iLower +
18180 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a  = a[1];.      }.
18190 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
181a0 75 65 46 72 65 65 28 70 52 61 6e 67 65 56 61 6c  ueFree(pRangeVal
181b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
181c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
181d0 26 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  & pUpper ){.    
181e0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
181f0 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70  pUpper->pExpr->p
18200 52 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20  Right;.      rc 
18210 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  = valueFromExpr(
18220 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61  pParse, pExpr, a
18230 66 66 2c 20 26 70 52 61 6e 67 65 56 61 6c 29 3b  ff, &pRangeVal);
18240 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
18250 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pUpper->eOperato
18260 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  r & (WO_LT|WO_LE
18270 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ))!=0 );.      i
18280 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18290 0a 20 20 20 20 20 20 20 26 26 20 77 68 65 72 65  .       && where
182a0 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
182b0 20 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20 31   p, pRangeVal, 1
182c0 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  , a)==SQLITE_OK.
182d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
182e0 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 3b 0a   iUpper = a[0];.
182f0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 55 70          if( (pUp
18300 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  per->eOperator &
18310 20 57 4f 5f 4c 45 29 21 3d 30 20 29 20 69 55 70   WO_LE)!=0 ) iUp
18320 70 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20  per += a[1];.   
18330 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
18340 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 61 6e  e3ValueFree(pRan
18350 67 65 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  geVal);.    }.  
18360 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18370 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 57 68 65  _OK ){.      Whe
18380 72 65 43 6f 73 74 20 69 42 61 73 65 20 3d 20 77  reCost iBase = w
18390 68 65 72 65 43 6f 73 74 28 70 2d 3e 61 69 52 6f  hereCost(p->aiRo
183a0 77 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20  wEst[0]);.      
183b0 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65  if( iUpper>iLowe
183c0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 42 61  r ){.        iBa
183d0 73 65 20 2d 3d 20 77 68 65 72 65 43 6f 73 74 28  se -= whereCost(
183e0 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29  iUpper - iLower)
183f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18400 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 69 42 61  *pRangeDiv = iBa
18410 73 65 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  se;.      WHERET
18420 52 41 43 45 28 30 78 31 30 30 2c 20 28 22 72 61  RACE(0x100, ("ra
18430 6e 67 65 20 73 63 61 6e 20 72 65 67 69 6f 6e 73  nge scan regions
18440 3a 20 25 75 2e 2e 25 75 20 20 64 69 76 3d 25 64  : %u..%u  div=%d
18450 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
18460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
18470 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29  32)iLower, (u32)
18480 69 55 70 70 65 72 2c 20 2a 70 52 61 6e 67 65 44  iUpper, *pRangeD
18490 69 76 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  iv));.      retu
184a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
184b0 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
184c0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
184d0 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53  (pParse);.  UNUS
184e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
184f0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
18500 54 45 52 28 6e 45 71 29 3b 0a 23 65 6e 64 69 66  TER(nEq);.#endif
18510 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65  .  assert( pLowe
18520 72 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 20  r || pUpper );. 
18530 20 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 30 3b   *pRangeDiv = 0;
18540 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 45  .  /* TUNING:  E
18550 61 63 68 20 69 6e 65 71 75 61 6c 69 74 79 20 63  ach inequality c
18560 6f 6e 73 74 72 61 69 6e 74 20 72 65 64 75 63 65  onstraint reduce
18570 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  s the search spa
18580 63 65 20 34 2d 66 6f 6c 64 2e 0a 20 20 2a 2a 20  ce 4-fold..  ** 
18590 41 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74  A BETWEEN operat
185a0 6f 72 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 72  or, therefore, r
185b0 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63  educes the searc
185c0 68 20 73 70 61 63 65 20 31 36 2d 66 6f 6c 64 20  h space 16-fold 
185d0 2a 2f 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20  */.  if( pLower 
185e0 26 26 20 28 70 4c 6f 77 65 72 2d 3e 77 74 46 6c  && (pLower->wtFl
185f0 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
18600 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 61  )==0 ){.    *pRa
18610 6e 67 65 44 69 76 20 2b 3d 20 32 30 3b 20 20 61  ngeDiv += 20;  a
18620 73 73 65 72 74 28 20 32 30 3d 3d 77 68 65 72 65  ssert( 20==where
18630 43 6f 73 74 28 34 29 20 29 3b 0a 20 20 7d 0a 20  Cost(4) );.  }. 
18640 20 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20   if( pUpper ){. 
18650 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20 2b 3d     *pRangeDiv +=
18660 20 32 30 3b 20 20 61 73 73 65 72 74 28 20 32 30   20;  assert( 20
18670 3d 3d 77 68 65 72 65 43 6f 73 74 28 34 29 20 29  ==whereCost(4) )
18680 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
18690 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
186a0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
186b0 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
186c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
186d0 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
186e0 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
186f0 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79  n.** an equality
18700 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41   constraint x=VA
18710 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68  LUE and where th
18720 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20  at VALUE occurs 
18730 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67  in.** the histog
18740 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20  ram data.  This 
18750 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20  only works when 
18760 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  x is the left-mo
18770 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20  st.** column of 
18780 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c  an index and sql
18790 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67  ite_stat3 histog
187a0 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69  ram data is avai
187b0 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61  lable.** for tha
187c0 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70  t index.  When p
187d0 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Expr==NULL that 
187e0 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72  means the constr
187f0 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53  aint is.** "x IS
18800 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f   NULL" instead o
18810 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a  f "x=VALUE"..**.
18820 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
18830 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
18840 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
18850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18860 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
18870 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
18880 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
18890 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
188a0 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
188b0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
188c0 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
188d0 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
188e0 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
188f0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
18900 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
18910 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
18920 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
18930 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
18940 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
18950 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
18960 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
18970 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
18980 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
18990 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
189a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
189b0 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
189c0 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
189d0 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
189e0 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
189f0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
18a00 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20  */.  Index *p,  
18a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18a20 20 69 6e 64 65 78 20 77 68 6f 73 65 20 6c 65 66   index whose lef
18a30 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73  t-most column is
18a40 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72   pTerm */.  Expr
18a50 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
18a60 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66   /* Expression f
18a70 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20  or VALUE in the 
18a80 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69  x=VALUE constrai
18a90 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  nt */.  tRowcnt 
18aa0 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20  *pnRow       /* 
18ab0 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
18ac0 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
18ad0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
18ae0 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 68 73 20  te3_value *pRhs 
18af0 3d 20 30 3b 20 20 2f 2a 20 56 41 4c 55 45 20 6f  = 0;  /* VALUE o
18b00 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  n right-hand sid
18b10 65 20 6f 66 20 70 54 65 72 6d 20 2a 2f 0a 20 20  e of pTerm */.  
18b20 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20 20  u8 aff;         
18b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
18b40 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a  umn affinity */.
18b50 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
18b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18b70 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
18b80 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
18b90 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20  cnt a[2];       
18ba0 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74        /* Statist
18bb0 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ics */..  assert
18bc0 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20  ( p->aSample!=0 
18bd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
18be0 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61  nSample>0 );.  a
18bf0 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e  ff = p->pTable->
18c00 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e  aCol[p->aiColumn
18c10 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  [0]].affinity;. 
18c20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20   if( pExpr ){.  
18c30 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d    rc = valueFrom
18c40 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
18c50 70 72 2c 20 61 66 66 2c 20 26 70 52 68 73 29 3b  pr, aff, &pRhs);
18c60 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
18c70 74 6f 20 77 68 65 72 65 45 71 75 61 6c 53 63 61  to whereEqualSca
18c80 6e 45 73 74 5f 63 61 6e 63 65 6c 3b 0a 20 20 7d  nEst_cancel;.  }
18c90 65 6c 73 65 7b 0a 20 20 20 20 70 52 68 73 20 3d  else{.    pRhs =
18ca0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
18cb0 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
18cc0 7d 0a 20 20 69 66 28 20 70 52 68 73 3d 3d 30 20  }.  if( pRhs==0 
18cd0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
18ce0 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 72 63 20 3d  NOTFOUND;.  rc =
18cf0 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
18d00 50 61 72 73 65 2c 20 70 2c 20 70 52 68 73 2c 20  Parse, p, pRhs, 
18d10 30 2c 20 61 29 3b 0a 20 20 69 66 28 20 72 63 3d  0, a);.  if( rc=
18d20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18d30 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
18d40 30 30 2c 28 22 65 71 75 61 6c 69 74 79 20 73 63  00,("equality sc
18d50 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e  an regions: %d\n
18d60 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a  ", (int)a[1]));.
18d70 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31      *pnRow = a[1
18d80 5d 3b 0a 20 20 7d 0a 77 68 65 72 65 45 71 75 61  ];.  }.whereEqua
18d90 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3a  lScanEst_cancel:
18da0 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
18db0 72 65 65 28 70 52 68 73 29 3b 0a 20 20 72 65 74  ree(pRhs);.  ret
18dc0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
18dd0 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
18de0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29  TE_ENABLE_STAT3)
18df0 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
18e00 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
18e10 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
18e20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
18e30 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
18e40 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
18e50 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72  .** an IN constr
18e60 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 72  aint where the r
18e70 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
18e80 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
18e90 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f  r.** is a list o
18ea0 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70  f values.  Examp
18eb0 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  le:.**.**       
18ec0 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32   WHERE x IN (1,2
18ed0 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74  ,3,4).**.** Writ
18ee0 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  e the estimated 
18ef0 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a  row count into *
18f00 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  pnRow and return
18f10 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20   SQLITE_OK. .** 
18f20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  If unable to mak
18f30 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c  e an estimate, l
18f40 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68  eave *pnRow unch
18f50 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e  anged and return
18f60 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  .** non-zero..**
18f70 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18f80 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20   can fail if it 
18f90 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61  is unable to loa
18fa0 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  d a collating se
18fb0 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72  quence.** requir
18fc0 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f  ed for string co
18fd0 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20  mparison, or if 
18fe0 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
18ff0 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  te memory.** for
19000 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f   a UTF conversio
19010 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  n required for c
19020 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20  omparison.  The 
19030 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a  error is stored.
19040 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  ** in the pParse
19050 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
19060 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 49  tatic int whereI
19070 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  nScanEst(.  Pars
19080 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
19090 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
190a0 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
190b0 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
190c0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
190d0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f  /* The index who
190e0 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  se left-most col
190f0 75 6d 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a  umn is pTerm */.
19100 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
19110 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61  t,     /* The va
19120 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20  lue list on the 
19130 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31  RHS of "x IN (v1
19140 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a  ,v2,v3,...)" */.
19150 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77    tRowcnt *pnRow
19160 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
19170 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20  the revised row 
19180 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f  estimate here */
19190 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
191a0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a  QLITE_OK;     /*
191b0 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74   Subfunction ret
191c0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52  urn code */.  tR
191d0 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20 20  owcnt nEst;     
191e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
191f0 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69  of rows for a si
19200 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74  ngle term */.  t
19210 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d  Rowcnt nRowEst =
19220 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65 73   0;    /* New es
19230 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
19240 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a  mber of rows */.
19250 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
19260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
19270 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
19280 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70  assert( p->aSamp
19290 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  le!=0 );.  for(i
192a0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
192b0 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  K && i<pList->nE
192c0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  xpr; i++){.    n
192d0 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73  Est = p->aiRowEs
192e0 74 5b 30 5d 3b 0a 20 20 20 20 72 63 20 3d 20 77  t[0];.    rc = w
192f0 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
19300 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4c 69 73  (pParse, p, pLis
19310 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26  t->a[i].pExpr, &
19320 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45  nEst);.    nRowE
19330 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 7d 0a  st += nEst;.  }.
19340 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19350 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  _OK ){.    if( n
19360 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61 69 52 6f  RowEst > p->aiRo
19370 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f 77 45 73  wEst[0] ) nRowEs
19380 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b  t = p->aiRowEst[
19390 30 5d 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d  0];.    *pnRow =
193a0 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48   nRowEst;.    WH
193b0 45 52 45 54 52 41 43 45 28 30 78 31 30 30 2c 28  ERETRACE(0x100,(
193c0 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65  "IN row estimate
193d0 3a 20 65 73 74 3d 25 67 5c 6e 22 2c 20 6e 52 6f  : est=%g\n", nRo
193e0 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 72 65  wEst));.  }.  re
193f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
19400 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
19410 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
19420 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61  ) */../*.** Disa
19430 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68  ble a term in th
19440 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
19450 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20   Except, do not 
19460 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d  disable the term
19470 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f  .** if it contro
19480 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  ls a LEFT OUTER 
19490 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20  JOIN and it did 
194a0 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e  not originate in
194b0 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53   the ON.** or US
194c0 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ING clause of th
194d0 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43  at join..**.** C
194e0 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d  onsider the term
194f0 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68   t2.z='ok' in th
19500 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
19510 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  ies:.**.**   (1)
19520 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
19530 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
19540 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45  ON t1.a=t2.x WHE
19550 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20  RE t2.z='ok'.** 
19560 20 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20    (2)  SELECT * 
19570 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
19580 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
19590 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
195a0 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54  **   (3)  SELECT
195b0 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57   * FROM t1, t2 W
195c0 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41  HERE t1.a=t2.x A
195d0 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a  ND t2.z='ok'.**.
195e0 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27  ** The t2.z='ok'
195f0 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
19600 74 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75  the in (2) becau
19610 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73  se it originates
19620 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c  .** in the ON cl
19630 61 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20  ause.  The term 
19640 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  is disabled in (
19650 33 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73  3) because it is
19660 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20   not part.** of 
19670 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
19680 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20  N.  In (1), the 
19690 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61  term is not disa
196a0 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61  bled..**.** Disa
196b0 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75  bling a term cau
196c0 73 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f  ses that term to
196d0 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69   not be tested i
196e0 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  n the inner loop
196f0 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  .** of the join.
19700 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61    Disabling is a
19710 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
19720 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20   When terms are 
19730 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20  satisfied.** by 
19740 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73 61  indices, we disa
19750 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76  ble them to prev
19760 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65  ent redundant te
19770 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72  sts in the inner
19780 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f  .** loop.  We wo
19790 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72  uld get the corr
197a0 65 63 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e  ect results if n
197b0 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76 65 72  othing were ever
197c0 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75   disabled,.** bu
197d0 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75  t joins might ru
197e0 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65  n a little slowe
197f0 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69 73  r.  The trick is
19800 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d   to disable as m
19810 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e  uch.** as we can
19820 20 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69   without disabli
19830 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66  ng too much.  If
19840 20 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20   we disabled in 
19850 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a  (1), we'd get.**
19860 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65   the wrong answe
19870 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  r.  See ticket #
19880 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  813..*/.static v
19890 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28  oid disableTerm(
198a0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
198b0 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70  el, WhereTerm *p
198c0 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65  Term){.  if( pTe
198d0 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54 65  rm.      && (pTe
198e0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
198f0 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20  RM_CODED)==0.   
19900 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69     && (pLevel->i
19910 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45  LeftJoin==0 || E
19920 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
19930 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
19940 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a  FromJoin)).  ){.
19950 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
19960 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
19970 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
19980 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20  >iParent>=0 ){. 
19990 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
199a0 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d  pOther = &pTerm-
199b0 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69  >pWC->a[pTerm->i
199c0 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69  Parent];.      i
199d0 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43  f( (--pOther->nC
199e0 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  hild)==0 ){.    
199f0 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
19a00 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b  pLevel, pOther);
19a10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19a20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
19a30 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79 20   an OP_Affinity 
19a40 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79 20  opcode to apply 
19a50 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  the column affin
19a60 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66 0a  ity string zAff.
19a70 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67 69  ** to the n regi
19a80 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
19a90 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41  t base. .**.** A
19aa0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
19ab0 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  n, SQLITE_AFF_NO
19ac0 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68 69 63  NE entries (whic
19ad0 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74  h are no-ops) at
19ae0 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e   the.** beginnin
19af0 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66  g and end of zAf
19b00 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20 20  f are ignored.  
19b10 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  If all entries i
19b20 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53 51  n zAff are.** SQ
19b30 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74  LITE_AFF_NONE, t
19b40 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74 73  hen no code gets
19b50 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a   generated..**.*
19b60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
19b70 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f 70  akes its own cop
19b80 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68 61  y of zAff so tha
19b90 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  t the caller is 
19ba0 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66  free.** to modif
19bb0 79 20 7a 41 66 66 20 61 66 74 65 72 20 74 68 69  y zAff after thi
19bc0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
19bd0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
19be0 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e  d codeApplyAffin
19bf0 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ity(Parse *pPars
19c00 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e 74  e, int base, int
19c10 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29 7b   n, char *zAff){
19c20 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
19c30 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
19c40 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20  ( zAff==0 ){.   
19c50 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
19c60 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
19c70 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d );.    return;
19c80 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 76  .  }.  assert( v
19c90 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a  !=0 );..  /* Adj
19ca0 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20 74  ust base and n t
19cb0 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c 49  o skip over SQLI
19cc0 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72  TE_AFF_NONE entr
19cd0 69 65 73 20 61 74 20 74 68 65 20 62 65 67 69 6e  ies at the begin
19ce0 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e  ning.  ** and en
19cf0 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69 74  d of the affinit
19d00 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20  y string..  */. 
19d10 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a   while( n>0 && z
19d20 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41  Aff[0]==SQLITE_A
19d30 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e  FF_NONE ){.    n
19d40 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a  --;.    base++;.
19d50 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a      zAff++;.  }.
19d60 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20    while( n>1 && 
19d70 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54  zAff[n-1]==SQLIT
19d80 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
19d90 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    n--;.  }..  /*
19da0 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66 66   Code the OP_Aff
19db0 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66 20  inity opcode if 
19dc0 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69 6e  there is anythin
19dd0 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f  g left to do. */
19de0 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
19df0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19e00 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op2(v, OP_Affini
19e10 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20  ty, base, n);.  
19e20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
19e30 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66  ngeP4(v, -1, zAf
19e40 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  f, n);.    sqlit
19e50 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
19e60 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
19e70 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a  , base, n);.  }.
19e80 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
19e90 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69  te code for a si
19ea0 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65  ngle equality te
19eb0 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
19ec0 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61  clause.  An equa
19ed0 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e  lity.** term can
19ee0 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78 70   be either X=exp
19ef0 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e  r or X IN (...).
19f00 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65 20     pTerm is the 
19f10 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63  term to be .** c
19f20 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oded..**.** The 
19f30 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f  current value fo
19f40 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  r the constraint
19f50 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69   is left in regi
19f60 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a  ster iReg..**.**
19f70 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e   For a constrain
19f80 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d  t of the form X=
19f90 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65 73  expr, the expres
19fa0 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65  sion is evaluate
19fb0 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73  d and its.** res
19fc0 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74  ult is left on t
19fd0 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63  he stack.  For c
19fe0 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68  onstraints of th
19ff0 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e  e form X IN (...
1a000 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ).** this routin
1a010 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70  e sets up a loop
1a020 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61   that will itera
1a030 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75  te over all valu
1a040 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74  es of X..*/.stat
1a050 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61 6c  ic int codeEqual
1a060 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ityTerm(.  Parse
1a070 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
1a080 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
1a090 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
1a0a0 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f  Term *pTerm,   /
1a0b0 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68  * The term of th
1a0c0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
1a0d0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
1a0e0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
1a0f0 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76 65 6c  el, /* The level
1a100 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1a110 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b 69  use we are worki
1a120 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ng on */.  int i
1a130 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  Eq,            /
1a140 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 65  * Index of the e
1a150 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77 69 74  quality term wit
1a160 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c 20 2a  hin this level *
1a170 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20  /.  int bRev,   
1a180 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1a190 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72 64 65  for reverse-orde
1a1a0 72 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e 73 20  r IN operations 
1a1b0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65 74  */.  int iTarget
1a1c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 65           /* Atte
1a1d0 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65 73  mpt to leave res
1a1e0 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65 67  ults in this reg
1a1f0 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78  ister */.){.  Ex
1a200 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
1a210 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76  pExpr;.  Vdbe *v
1a220 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1a230 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20  ;.  int iReg;   
1a240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a250 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
1a260 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20  ng results */.. 
1a270 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65 74   assert( iTarget
1a280 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e  >0 );.  if( pX->
1a290 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20  op==TK_EQ ){.   
1a2a0 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45   iReg = sqlite3E
1a2b0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
1a2c0 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
1a2d0 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 65  , iTarget);.  }e
1a2e0 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d  lse if( pX->op==
1a2f0 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  TK_ISNULL ){.   
1a300 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b   iReg = iTarget;
1a310 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a320 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
1a330 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69 66  l, 0, iReg);.#if
1a340 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a350 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73  _SUBQUERY.  }els
1a360 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65  e{.    int eType
1a370 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a  ;.    int iTab;.
1a380 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f      struct InLoo
1a390 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68 65 72  p *pIn;.    Wher
1a3a0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70  eLoop *pLoop = p
1a3b0 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a  Level->pWLoop;..
1a3c0 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
1a3d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1a3e0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
1a3f0 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d  .      && pLoop-
1a400 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
1a410 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f  =0.      && pLoo
1a420 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
1a430 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 45  x->aSortOrder[iE
1a440 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q].    ){.      
1a450 74 65 73 74 63 61 73 65 28 20 69 45 71 3d 3d 30  testcase( iEq==0
1a460 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1a470 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20  se( bRev );.    
1a480 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a    bRev = !bRev;.
1a490 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1a4a0 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  ( pX->op==TK_IN 
1a4b0 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54  );.    iReg = iT
1a4c0 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70 65  arget;.    eType
1a4d0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
1a4e0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 58  Index(pParse, pX
1a4f0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 65 54  , 0);.    if( eT
1a500 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype==IN_INDEX_IN
1a510 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20  DEX_DESC ){.    
1a520 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76    testcase( bRev
1a530 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d   );.      bRev =
1a540 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20   !bRev;.    }.  
1a550 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61    iTab = pX->iTa
1a560 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ble;.    sqlite3
1a570 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52  VdbeAddOp2(v, bR
1a580 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f  ev ? OP_Last : O
1a590 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20  P_Rewind, iTab, 
1a5a0 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
1a5b0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1a5c0 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
1a5d0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f  )==0 );.    pLoo
1a5e0 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  p->wsFlags |= WH
1a5f0 45 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20 20  ERE_IN_ABLE;.   
1a600 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69   if( pLevel->u.i
1a610 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  n.nIn==0 ){.    
1a620 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78    pLevel->addrNx
1a630 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
1a640 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1a650 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75   }.    pLevel->u
1a660 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70  .in.nIn++;.    p
1a670 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
1a680 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c  oop =.       sql
1a690 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
1a6a0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
1a6b0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
1a6c0 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  Loop,.          
1a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6e0 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65      sizeof(pLeve
1a6f0 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b  l->u.in.aInLoop[
1a700 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  0])*pLevel->u.in
1a710 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d  .nIn);.    pIn =
1a720 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
1a730 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70  nLoop;.    if( p
1a740 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20  In ){.      pIn 
1a750 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  += pLevel->u.in.
1a760 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70  nIn - 1;.      p
1a770 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b  In->iCur = iTab;
1a780 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
1a790 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
1a7a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d   ){.        pIn-
1a7b0 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c  >addrInTop = sql
1a7c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a7d0 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62  , OP_Rowid, iTab
1a7e0 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  , iReg);.      }
1a7f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49  else{.        pI
1a800 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73  n->addrInTop = s
1a810 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1a820 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
1a830 54 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20  Tab, 0, iReg);. 
1a840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
1a850 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62  ->eEndLoopOp = b
1a860 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20  Rev ? OP_Prev : 
1a870 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  OP_Next;.      s
1a880 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
1a890 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69  (v, OP_IsNull, i
1a8a0 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Reg);.    }else{
1a8b0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75  .      pLevel->u
1a8c0 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20  .in.nIn = 0;.   
1a8d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
1a8e0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1a8f0 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72 65  el, pTerm);.  re
1a900 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a  turn iReg;.}../*
1a910 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1a920 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
1a930 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20  uate all == and 
1a940 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66  IN constraints f
1a950 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a  or an.** index..
1a960 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1a970 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c  e, consider tabl
1a980 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66  e t1(a,b,c,d,e,f
1a990 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31 28  ) with index i1(
1a9a0 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f  a,b,c)..** Suppo
1a9b0 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  se the WHERE cla
1a9c0 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d  use is this:  a=
1a9d0 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32  =5 AND b IN (1,2
1a9e0 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20  ,3) AND c>5 AND 
1a9f0 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65  c<10.** The inde
1aa00 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73  x has as many as
1aa10 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79 20   three equality 
1aa20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74  constraints, but
1aa30 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d   in this.** exam
1aa40 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20 22  ple, the third "
1aa50 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69  c" value is an i
1aa60 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f  nequality.  So o
1aa70 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73  nly two .** cons
1aa80 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65  traints are code
1aa90 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
1aaa0 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63   will generate c
1aab0 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a  ode to evaluate.
1aac0 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e  ** a==5 and b IN
1aad0 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63   (1,2,3).  The c
1aae0 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f  urrent values fo
1aaf0 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62  r a and b will b
1ab00 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63  e stored.** in c
1ab10 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73  onsecutive regis
1ab20 74 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64  ters and the ind
1ab30 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ex of the first 
1ab40 72 65 67 69 73 74 65 72 20 69 73 20 72 65 74 75  register is retu
1ab50 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  rned..**.** In t
1ab60 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
1ab70 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68   nEq==2.  But th
1ab80 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f  is subroutine wo
1ab90 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75  rks for any valu
1aba0 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c  e.** of nEq incl
1abb0 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71  uding 0.  If nEq
1abc0 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ==0, this routin
1abd0 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f  e is nearly a no
1abe0 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  -op..** The only
1abf0 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69   thing it does i
1ac00 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70  s allocate the p
1ac10 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f  Level->iMem memo
1ac20 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63  ry cell and.** c
1ac30 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66 69 6e  ompute the affin
1ac40 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ity string..**.*
1ac50 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1ac60 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73 20  lways allocates 
1ac70 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d  at least one mem
1ac80 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 74  ory cell and ret
1ac90 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65  urns.** the inde
1aca0 78 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72 79  x of that memory
1acb0 20 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65 20   cell. The code 
1acc0 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68  that.** calls th
1acd0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
1ace0 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20  use that memory 
1acf0 63 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74 68  cell to store th
1ad00 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a  e termination.**
1ad10 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68   key value of th
1ad20 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20  e loop.  If one 
1ad30 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61  or more IN opera
1ad40 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68 65  tors appear, the
1ad50 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
1ad60 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61  e allocates an a
1ad70 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65  dditional nEq me
1ad80 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69  mory cells for i
1ad90 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a  nternal.** use..
1ada0 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
1adb0 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20 69  urning, *pzAff i
1adc0 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
1add0 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
1ade0 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79 20  ining a.** copy 
1adf0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66  of the column af
1ae00 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f 66  finity string of
1ae10 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f 63   the index alloc
1ae20 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71  ated using.** sq
1ae30 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e  lite3DbMalloc().
1ae40 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69 65 73   Except, entries
1ae50 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f 66 20   in the copy of 
1ae60 74 68 65 20 73 74 72 69 6e 67 20 61 73 73 6f 63  the string assoc
1ae70 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 65 71  iated.** with eq
1ae80 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1ae90 74 73 20 74 68 61 74 20 75 73 65 20 4e 4f 4e 45  ts that use NONE
1aea0 20 61 66 66 69 6e 69 74 79 20 61 72 65 20 73 65   affinity are se
1aeb0 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  t to.** SQLITE_A
1aec0 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69 73  FF_NONE. This is
1aed0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 51   to deal with SQ
1aee0 4c 20 73 75 63 68 20 61 73 20 74 68 65 20 66 6f  L such as the fo
1aef0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
1af00 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
1af10 28 61 20 54 45 58 54 20 50 52 49 4d 41 52 59 20  (a TEXT PRIMARY 
1af20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45  KEY, b);.**   SE
1af30 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
1af40 20 41 53 20 74 32 2c 20 74 31 20 57 48 45 52 45   AS t2, t1 WHERE
1af50 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a   t1.a = t2.b;.**
1af60 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70  .** In the examp
1af70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 69 6e  le above, the in
1af80 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68 61 73  dex on t1(a) has
1af90 20 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20   TEXT affinity. 
1afa0 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65  But since.** the
1afb0 20 72 69 67 68 74 20 68 61 6e 64 20 73 69 64 65   right hand side
1afc0 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74 79   of the equality
1afd0 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74 32 2e   constraint (t2.
1afe0 62 29 20 68 61 73 20 4e 4f 4e 45 20 61 66 66 69  b) has NONE affi
1aff0 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76  nity,.** no conv
1b000 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  ersion should be
1b010 20 61 74 74 65 6d 70 74 65 64 20 62 65 66 6f 72   attempted befor
1b020 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62 20 76  e using a t2.b v
1b030 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f 66 0a  alue as part of.
1b040 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65 61 72  ** a key to sear
1b050 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20 48 65  ch the index. He
1b060 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 62 79  nce the first by
1b070 74 65 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  te in the return
1b080 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73  ed affinity.** s
1b090 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20 65 78  tring in this ex
1b0a0 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65 20 73  ample would be s
1b0b0 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41 46 46  et to SQLITE_AFF
1b0c0 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  _NONE..*/.static
1b0d0 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75 61   int codeAllEqua
1b0e0 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72  lityTerms(.  Par
1b0f0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1b100 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1b110 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
1b120 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20  Level *pLevel,  
1b130 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64   /* Which nested
1b140 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f   loop of the FRO
1b150 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20  M we are coding 
1b160 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20  */.  int bRev,  
1b170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1b180 76 65 72 73 65 20 74 68 65 20 6f 72 64 65 72 20  verse the order 
1b190 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  of IN operators 
1b1a0 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52  */.  int nExtraR
1b1b0 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  eg,        /* Nu
1b1c0 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
1b1d0 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63  gisters to alloc
1b1e0 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ate */.  char **
1b1f0 70 7a 41 66 66 20 20 20 20 20 20 20 20 20 20 2f  pzAff          /
1b200 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 70 6f  * OUT: Set to po
1b210 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74 79 20  int to affinity 
1b220 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  string */.){.  i
1b230 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20  nt nEq;         
1b240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b250 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d  The number of ==
1b260 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   or IN constrain
1b270 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20  ts to code */.  
1b280 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1b290 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
1b2a0 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f   The vm under co
1b2b0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1b2c0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b2e0 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   The index being
1b2f0 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c   used for this l
1b300 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  oop */.  WhereTe
1b310 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
1b320 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
1b330 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  le constraint te
1b340 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  rm */.  WhereLoo
1b350 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
1b360 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
1b370 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
1b380 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
1b390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3a0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1b3b0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
1b3c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1b3d0 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
1b3e0 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ster */.  int nR
1b3f0 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
1b400 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1b410 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  r of registers t
1b420 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
1b430 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20  char *zAff;     
1b440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b450 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   Affinity string
1b460 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20   to return */.. 
1b470 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20   /* This module 
1b480 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f  is only called o
1b490 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68  n query plans th
1b4a0 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e  at use an index.
1b4b0 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c   */.  pLoop = pL
1b4c0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
1b4d0 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
1b4e0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1b4f0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
1b500 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f   );.  nEq = pLoo
1b510 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
1b520 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
1b530 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
1b540 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
1b550 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  0 );..  /* Figur
1b560 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d  e out how many m
1b570 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77  emory cells we w
1b580 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c  ill need then al
1b590 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a  locate them..  *
1b5a0 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50  /.  regBase = pP
1b5b0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
1b5c0 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e    nReg = pLoop->
1b5d0 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45  u.btree.nEq + nE
1b5e0 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73  xtraReg;.  pPars
1b5f0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
1b600 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74  ..  zAff = sqlit
1b610 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73  e3DbStrDup(pPars
1b620 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33 49 6e  e->db, sqlite3In
1b630 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76  dexAffinityStr(v
1b640 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66 28 20  , pIdx));.  if( 
1b650 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70 50 61  !zAff ){.    pPa
1b660 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1b670 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a  ailed = 1;.  }..
1b680 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
1b690 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
1b6a0 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73  raints.  */.  as
1b6b0 73 65 72 74 28 20 7a 41 66 66 3d 3d 30 20 7c 7c  sert( zAff==0 ||
1b6c0 20 73 74 72 6c 65 6e 28 7a 41 66 66 29 3e 3d 6e   strlen(zAff)>=n
1b6d0 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  Eq );.  for(j=0;
1b6e0 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20   j<nEq; j++){.  
1b6f0 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 70 54    int r1;.    pT
1b700 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  erm = pLoop->aLT
1b710 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61 73 73 65  erm[j];.    asse
1b720 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
1b730 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
1b740 77 69 6e 67 20 74 72 75 65 20 66 6f 72 20 69 6e  wing true for in
1b750 64 69 63 65 73 20 77 69 74 68 20 72 65 64 75 6e  dices with redun
1b760 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20  dant columns. . 
1b770 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54 45     ** Ex: CREATE
1b780 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
1b790 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a  a,b,a); SELECT *
1b7a0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
1b7b0 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20  =0 AND b=0; */. 
1b7c0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 54     testcase( (pT
1b7d0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
1b7e0 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b  ERM_CODED)!=0 );
1b7f0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1b800 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1b810 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
1b820 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71 75      r1 = codeEqu
1b830 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
1b840 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c  , pTerm, pLevel,
1b850 20 6a 2c 20 62 52 65 76 2c 20 72 65 67 42 61 73   j, bRev, regBas
1b860 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31  e+j);.    if( r1
1b870 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20  !=regBase+j ){. 
1b880 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31       if( nReg==1
1b890 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1b8a0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1b8b0 67 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  g(pParse, regBas
1b8c0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42  e);.        regB
1b8d0 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20  ase = r1;.      
1b8e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1b8f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b900 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31  (v, OP_SCopy, r1
1b910 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
1b920 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b930 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
1b940 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1b950 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
1b960 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
1b970 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
1b980 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65   );.    if( (pTe
1b990 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1b9a0 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e  (WO_ISNULL|WO_IN
1b9b0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  ))==0 ){.      E
1b9c0 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54  xpr *pRight = pT
1b9d0 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
1b9e0 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ht;.      sqlite
1b9f0 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a  3ExprCodeIsNullJ
1ba00 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72  ump(v, pRight, r
1ba10 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c  egBase+j, pLevel
1ba20 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
1ba30 20 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20    if( zAff ){.  
1ba40 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1ba50 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1ba60 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d  (pRight, zAff[j]
1ba70 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )==SQLITE_AFF_NO
1ba80 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
1ba90 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45  zAff[j] = SQLITE
1baa0 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
1bab0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1bac0 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
1bad0 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
1bae0 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a  e(pRight, zAff[j
1baf0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
1bb00 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45  zAff[j] = SQLITE
1bb10 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
1bb20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1bb30 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20   }.  }.  *pzAff 
1bb40 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e  = zAff;.  return
1bb50 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66   regBase;.}..#if
1bb60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1bb70 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54  _EXPLAIN./*.** T
1bb80 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1bb90 20 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70 6c   helper for expl
1bba0 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29 20  ainIndexRange() 
1bbb0 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72  below.**.** pStr
1bbc0 20 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74 20   holds the text 
1bbd0 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
1bbe0 20 74 68 61 74 20 77 65 20 61 72 65 20 62 75 69   that we are bui
1bbf0 6c 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65 72  lding up one ter
1bc00 6d 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e 20  m.** at a time. 
1bc10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64   This routine ad
1bc20 64 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f  ds a new term to
1bc30 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1bc40 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54  expression..** T
1bc50 65 72 6d 73 20 61 72 65 20 73 65 70 61 72 61 74  erms are separat
1bc60 65 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64 64  ed by AND so add
1bc70 20 74 68 65 20 22 41 4e 44 22 20 74 65 78 74 20   the "AND" text 
1bc80 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20 73  for second and s
1bc90 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72  ubsequent.** ter
1bca0 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ms only..*/.stat
1bcb0 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 41  ic void explainA
1bcc0 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74 72  ppendTerm(.  Str
1bcd0 41 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20 20  Accum *pStr,    
1bce0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1bcf0 74 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e 20  text expression 
1bd00 62 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20  being built */. 
1bd10 20 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20 20   int iTerm,     
1bd20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bd30 49 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74 65  Index of this te
1bd40 72 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a 65  rm.  First is ze
1bd50 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ro */.  const ch
1bd60 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20  ar *zColumn,    
1bd70 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1bd80 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  he column */.  c
1bd90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 20  onst char *zOp  
1bda0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1bdb0 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  me of the operat
1bdc0 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69  or */.){.  if( i
1bdd0 54 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53 74  Term ) sqlite3St
1bde0 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
1bdf0 72 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a  r, " AND ", 5);.
1be00 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
1be10 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 43  mAppend(pStr, zC
1be20 6f 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20 73 71  olumn, -1);.  sq
1be30 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
1be40 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31  end(pStr, zOp, 1
1be50 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
1be60 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
1be70 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a   "?", 1);.}../*.
1be80 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76  ** Argument pLev
1be90 65 6c 20 64 65 73 63 72 69 62 65 73 20 61 20 73  el describes a s
1bea0 74 72 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e  trategy for scan
1beb0 6e 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e  ning table pTab.
1bec0 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
1bed0 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
1bee0 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
1bef0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
1bf00 6e 67 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ng a description
1bf10 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 73 65  .** of the subse
1bf20 74 20 6f 66 20 74 61 62 6c 65 20 72 6f 77 73 20  t of table rows 
1bf30 73 63 61 6e 6e 65 64 20 62 79 20 74 68 65 20 73  scanned by the s
1bf40 74 72 61 74 65 67 79 20 69 6e 20 74 68 65 20 66  trategy in the f
1bf50 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c  orm of an.** SQL
1bf60 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c   expression. Or,
1bf70 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65   if all rows are
1bf80 20 73 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69   scanned, NULL i
1bf90 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
1bfa0 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
1bfb0 66 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a  f the query:.**.
1bfc0 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
1bfd0 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 20  OM t1 WHERE a=1 
1bfe0 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69  AND b>2;.**.** i
1bff0 73 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65 20  s run and there 
1c000 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28  is an index on (
1c010 61 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69 73  a, b), then this
1c020 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1c030 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69  s a.** string si
1c040 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  milar to:.**.** 
1c050 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a    "a=? AND b>?".
1c060 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
1c070 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  ed pointer point
1c080 73 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  s to memory obta
1c090 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
1c0a0 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  3DbMalloc()..** 
1c0b0 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
1c0c0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
1c0d0 63 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74  caller to free t
1c0e0 68 65 20 62 75 66 66 65 72 20 77 68 65 6e 20 69  he buffer when i
1c0f0 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65  t is.** no longe
1c100 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  r required..*/.s
1c110 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 6c  tatic char *expl
1c120 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 73 71  ainIndexRange(sq
1c130 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
1c140 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 54 61 62  Loop *pLoop, Tab
1c150 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64  le *pTab){.  Ind
1c160 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 4c 6f  ex *pIndex = pLo
1c170 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
1c180 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  ex;.  int nEq = 
1c190 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
1c1a0 45 71 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  Eq;.  int i, j;.
1c1b0 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d    Column *aCol =
1c1c0 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69   pTab->aCol;.  i
1c1d0 6e 74 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20 70  nt *aiColumn = p
1c1e0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b  Index->aiColumn;
1c1f0 0a 20 20 53 74 72 41 63 63 75 6d 20 74 78 74 3b  .  StrAccum txt;
1c200 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26  ..  if( nEq==0 &
1c210 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
1c220 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c  s & (WHERE_BTM_L
1c230 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  IMIT|WHERE_TOP_L
1c240 49 4d 49 54 29 29 3d 3d 30 20 29 7b 0a 20 20 20  IMIT))==0 ){.   
1c250 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1c260 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
1c270 49 6e 69 74 28 26 74 78 74 2c 20 30 2c 20 30 2c  Init(&txt, 0, 0,
1c280 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
1c290 54 48 29 3b 0a 20 20 74 78 74 2e 64 62 20 3d 20  TH);.  txt.db = 
1c2a0 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  db;.  sqlite3Str
1c2b0 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74  AccumAppend(&txt
1c2c0 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20 20 66 6f  , " (", 2);.  fo
1c2d0 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69 2b  r(i=0; i<nEq; i+
1c2e0 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20  +){.    char *z 
1c2f0 3d 20 28 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43  = (i==pIndex->nC
1c300 6f 6c 75 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64  olumn ) ? "rowid
1c310 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d  " : aCol[aiColum
1c320 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  n[i]].zName;.   
1c330 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
1c340 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20 22  rm(&txt, i, z, "
1c350 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20  =");.  }..  j = 
1c360 69 3b 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  i;.  if( pLoop->
1c370 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 42 54  wsFlags&WHERE_BT
1c380 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 63  M_LIMIT ){.    c
1c390 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e  har *z = (j==pIn
1c3a0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 3f  dex->nColumn ) ?
1c3b0 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b   "rowid" : aCol[
1c3c0 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61  aiColumn[j]].zNa
1c3d0 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41  me;.    explainA
1c3e0 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20  ppendTerm(&txt, 
1c3f0 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a 20 20  i++, z, ">");.  
1c400 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  }.  if( pLoop->w
1c410 73 46 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50  sFlags&WHERE_TOP
1c420 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68  _LIMIT ){.    ch
1c430 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64  ar *z = (j==pInd
1c440 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 3f 20  ex->nColumn ) ? 
1c450 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61  "rowid" : aCol[a
1c460 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d  iColumn[j]].zNam
1c470 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70  e;.    explainAp
1c480 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69  pendTerm(&txt, i
1c490 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a 20  , z, "<");.  }. 
1c4a0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
1c4b0 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 29 22  Append(&txt, ")"
1c4c0 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  , 1);.  return s
1c4d0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69  qlite3StrAccumFi
1c4e0 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f  nish(&txt);.}../
1c4f0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1c500 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e  on is a no-op un
1c510 6c 65 73 73 20 63 75 72 72 65 6e 74 6c 79 20 70  less currently p
1c520 72 6f 63 65 73 73 69 6e 67 20 61 6e 20 45 58 50  rocessing an EXP
1c530 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a  LAIN QUERY PLAN.
1c540 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49 66 20 74  ** command. If t
1c550 68 65 20 71 75 65 72 79 20 62 65 69 6e 67 20 63  he query being c
1c560 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e 20 45 58  ompiled is an EX
1c570 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
1c580 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 65  , a single.** re
1c590 63 6f 72 64 20 69 73 20 61 64 64 65 64 20 74 6f  cord is added to
1c5a0 20 74 68 65 20 6f 75 74 70 75 74 20 74 6f 20 64   the output to d
1c5b0 65 73 63 72 69 62 65 20 74 68 65 20 74 61 62 6c  escribe the tabl
1c5c0 65 20 73 63 61 6e 20 73 74 72 61 74 65 67 79 20  e scan strategy 
1c5d0 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a  in .** pLevel..*
1c5e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
1c5f0 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20  plainOneScan(.  
1c600 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1c610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c620 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
1c630 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1c640 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20  TabList,        
1c650 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c        /* Table l
1c660 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20 72 65  ist this loop re
1c670 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65  fers to */.  Whe
1c680 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
1c690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c6a0 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20 4f 50  Scan to write OP
1c6b0 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20  _Explain opcode 
1c6c0 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  for */.  int iLe
1c6d0 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
1c6e0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1c6f0 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 63 6f  e for "level" co
1c700 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a  lumn of output *
1c710 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
1c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c730 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72      /* Value for
1c740 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f   "from" column o
1c750 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75 31  f output */.  u1
1c760 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20  6 wctrlFlags    
1c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c780 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   Flags passed to
1c790 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1c7a0 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  in() */.){.  if(
1c7b0 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
1c7c0 3d 3d 32 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ==2 ){.    struc
1c7d0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1c7e0 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
1c7f0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
1c800 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  om];.    Vdbe *v
1c810 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1c820 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69  ;      /* VM bei
1c830 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a  ng constructed *
1c840 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  /.    sqlite3 *d
1c850 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
1c860 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1c870 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 63 68  handle */.    ch
1c880 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20 20 20  ar *zMsg;       
1c890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c8a0 65 78 74 20 74 6f 20 61 64 64 20 74 6f 20 45 51  ext to add to EQ
1c8b0 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  P output */.    
1c8c0 69 6e 74 20 69 49 64 20 3d 20 70 50 61 72 73 65  int iId = pParse
1c8d0 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a  ->iSelectId;  /*
1c8e0 20 53 65 6c 65 63 74 20 69 64 20 28 6c 65 66 74   Select id (left
1c8f0 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20 63 6f 6c  -most output col
1c900 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  umn) */.    int 
1c910 69 73 53 65 61 72 63 68 3b 20 20 20 20 20 20 20  isSearch;       
1c920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1c930 65 20 66 6f 72 20 61 20 53 45 41 52 43 48 2e 20  e for a SEARCH. 
1c940 46 61 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e 20  False for SCAN. 
1c950 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  */.    WhereLoop
1c960 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
1c970 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74       /* The cont
1c980 72 6f 6c 6c 69 6e 67 20 57 68 65 72 65 4c 6f 6f  rolling WhereLoo
1c990 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  p object */.    
1c9a0 75 33 32 20 66 6c 61 67 73 3b 20 20 20 20 20 20  u32 flags;      
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c9c0 20 46 6c 61 67 73 20 74 68 61 74 20 64 65 73 63   Flags that desc
1c9d0 72 69 62 65 20 74 68 69 73 20 6c 6f 6f 70 20 2a  ribe this loop *
1c9e0 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  /..    pLoop = p
1c9f0 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
1ca00 20 20 20 66 6c 61 67 73 20 3d 20 70 4c 6f 6f 70     flags = pLoop
1ca10 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 69  ->wsFlags;.    i
1ca20 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f  f( (flags&WHERE_
1ca30 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63  MULTI_OR) || (wc
1ca40 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
1ca50 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 29 20  NETABLE_ONLY) ) 
1ca60 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 73 53  return;..    isS
1ca70 65 61 72 63 68 20 3d 20 28 66 6c 61 67 73 26 28  earch = (flags&(
1ca80 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c  WHERE_BTM_LIMIT|
1ca90 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
1caa0 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
1cab0 20 7c 7c 20 28 28 66 6c 61 67 73 26 57 48 45 52   || ((flags&WHER
1cac0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
1cad0 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 75 2e  =0 && (pLoop->u.
1cae0 62 74 72 65 65 2e 6e 45 71 3e 30 29 29 0a 20 20  btree.nEq>0)).  
1caf0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 77 63            || (wc
1cb00 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f  trlFlags&(WHERE_
1cb10 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52  ORDERBY_MIN|WHER
1cb20 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 29 3b  E_ORDERBY_MAX));
1cb30 0a 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  ..    zMsg = sql
1cb40 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1cb50 22 25 73 22 2c 20 69 73 53 65 61 72 63 68 3f 22  "%s", isSearch?"
1cb60 53 45 41 52 43 48 22 3a 22 53 43 41 4e 22 29 3b  SEARCH":"SCAN");
1cb70 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
1cb80 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
1cb90 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1cba0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1cbb0 2c 20 22 25 73 20 53 55 42 51 55 45 52 59 20 25  , "%s SUBQUERY %
1cbc0 64 22 2c 20 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e  d", zMsg,pItem->
1cbd0 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  iSelectId);.    
1cbe0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4d 73  }else{.      zMs
1cbf0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
1cc00 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
1cc10 73 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 4d 73  s TABLE %s", zMs
1cc20 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  g, pItem->zName)
1cc30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1cc40 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
1cc50 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
1cc60 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1cc70 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41 53 20  b, zMsg, "%s AS 
1cc80 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d  %s", zMsg, pItem
1cc90 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d  ->zAlias);.    }
1cca0 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
1ccb0 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45  & (WHERE_IPK|WHE
1ccc0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
1ccd0 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 41 4c 57  )==0.     && ALW
1cce0 41 59 53 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  AYS(pLoop->u.btr
1ccf0 65 65 2e 70 49 6e 64 65 78 21 3d 30 29 0a 20 20  ee.pIndex!=0).  
1cd00 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20    ){.      char 
1cd10 2a 7a 57 68 65 72 65 20 3d 20 65 78 70 6c 61 69  *zWhere = explai
1cd20 6e 49 6e 64 65 78 52 61 6e 67 65 28 64 62 2c 20  nIndexRange(db, 
1cd30 70 4c 6f 6f 70 2c 20 70 49 74 65 6d 2d 3e 70 54  pLoop, pItem->pT
1cd40 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20  ab);.      zMsg 
1cd50 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1cd60 66 28 64 62 2c 20 7a 4d 73 67 2c 0a 20 20 20 20  f(db, zMsg,.    
1cd70 20 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61             ((fla
1cd80 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
1cd90 49 4e 44 45 58 29 20 3f 20 0a 20 20 20 20 20 20  INDEX) ? .      
1cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73               "%s
1cdb0 20 55 53 49 4e 47 20 41 55 54 4f 4d 41 54 49 43   USING AUTOMATIC
1cdc0 20 25 73 49 4e 44 45 58 25 2e 30 73 25 73 22 20   %sINDEX%.0s%s" 
1cdd0 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
1cde0 20 20 20 20 20 22 25 73 20 55 53 49 4e 47 20 25       "%s USING %
1cdf0 73 49 4e 44 45 58 20 25 73 25 73 22 29 2c 20 0a  sINDEX %s%s"), .
1ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
1ce10 4d 73 67 2c 20 28 28 66 6c 61 67 73 20 26 20 57  Msg, ((flags & W
1ce20 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 3f  HERE_IDX_ONLY) ?
1ce30 20 22 43 4f 56 45 52 49 4e 47 20 22 20 3a 20 22   "COVERING " : "
1ce40 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  "),.            
1ce50 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
1ce60 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  e.pIndex->zName,
1ce70 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20   zWhere);.      
1ce80 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1ce90 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 7d  , zWhere);.    }
1cea0 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20  else if( (flags 
1ceb0 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 20  & WHERE_IPK)!=0 
1cec0 26 26 20 28 66 6c 61 67 73 20 26 20 57 48 45 52  && (flags & WHER
1ced0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30  E_CONSTRAINT)!=0
1cee0 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d   ){.      zMsg =
1cef0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1cf00 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55  (db, zMsg, "%s U
1cf10 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49  SING INTEGER PRI
1cf20 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29  MARY KEY", zMsg)
1cf30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61  ;..      if( fla
1cf40 67 73 26 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  gs&(WHERE_COLUMN
1cf50 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  _EQ|WHERE_COLUMN
1cf60 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  _IN) ){.        
1cf70 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1cf80 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1cf90 20 22 25 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c   "%s (rowid=?)",
1cfa0 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65   zMsg);.      }e
1cfb0 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 26 57  lse if( (flags&W
1cfc0 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29  HERE_BOTH_LIMIT)
1cfd0 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d  ==WHERE_BOTH_LIM
1cfe0 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  IT ){.        zM
1cff0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1d000 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1d010 25 73 20 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20  %s (rowid>? AND 
1d020 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29  rowid<?)", zMsg)
1d030 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1d040 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42 54  ( flags&WHERE_BT
1d050 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  M_LIMIT ){.     
1d060 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1d070 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1d080 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f  sg, "%s (rowid>?
1d090 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
1d0a0 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
1d0b0 53 28 66 6c 61 67 73 26 57 48 45 52 45 5f 54 4f  S(flags&WHERE_TO
1d0c0 50 5f 4c 49 4d 49 54 29 20 29 7b 0a 20 20 20 20  P_LIMIT) ){.    
1d0d0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1d0e0 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1d0f0 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3c  Msg, "%s (rowid<
1d100 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  ?)", zMsg);.    
1d110 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65    }.    }.#ifnde
1d120 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1d130 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 65  RTUALTABLE.    e
1d140 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
1d150 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
1d160 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  BLE)!=0 ){.     
1d170 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1d180 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1d190 2c 20 22 25 73 20 56 49 52 54 55 41 4c 20 54 41  , "%s VIRTUAL TA
1d1a0 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22  BLE INDEX %d:%s"
1d1b0 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20  , zMsg,.        
1d1c0 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d            pLoop-
1d1d0 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
1d1e0 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
1d1f0 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  xStr);.    }.#en
1d200 64 69 66 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73  dif.    zMsg = s
1d210 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1d220 62 2c 20 7a 4d 73 67 2c 20 22 25 73 22 2c 20 7a  b, zMsg, "%s", z
1d230 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
1d240 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1d250 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64 2c 20  P_Explain, iId, 
1d260 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a  iLevel, iFrom, z
1d270 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
1d280 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
1d290 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 4f 6e  define explainOn
1d2a0 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c  eScan(u,v,w,x,y,
1d2b0 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  z).#endif /* SQL
1d2c0 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
1d2d0 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   */.../*.** Gene
1d2e0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
1d2f0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69  e start of the i
1d300 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e  Level-th loop in
1d310 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1d320 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
1d330 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79  ion described by
1d340 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74   pWInfo..*/.stat
1d350 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f  ic Bitmask codeO
1d360 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57  neLoopStart(.  W
1d370 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1d380 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20  ,   /* Complete 
1d390 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
1d3a0 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
1d3b0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  se */.  int iLev
1d3c0 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  el,          /* 
1d3d0 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70  Which level of p
1d3e0 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c  WInfo->a[] shoul
1d3f0 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  d be coded */.  
1d400 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
1d410 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61       /* Which ta
1d420 62 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74  bles are current
1d430 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ly available */.
1d440 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20  ){.  int j, k;  
1d450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1d460 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
1d470 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
1d480 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
1d490 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1d4a0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61  table */.  int a
1d4b0 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20  ddrNxt;         
1d4c0 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70  /* Where to jump
1d4d0 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
1d4e0 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61  h the next IN ca
1d4f0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74  se */.  int omit
1d500 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  Table;       /* 
1d510 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74  True if we use t
1d520 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f  he index only */
1d530 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20  .  int bRev;    
1d540 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1d550 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63  if we need to sc
1d560 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
1d570 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  der */.  WhereLe
1d580 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a  vel *pLevel;  /*
1d590 20 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c   The where level
1d5a0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
1d5b0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
1d5c0 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 57 68  op;    /* The Wh
1d5d0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62  ereLoop object b
1d5e0 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
1d5f0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1d600 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73  ;    /* Decompos
1d610 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74  ition of the ent
1d620 69 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ire WHERE clause
1d630 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
1d640 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
1d650 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45        /* A WHERE
1d660 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a   clause term */.
1d670 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
1d680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d690 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
1d6a0 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
1d6b0 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
1d6c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1d6d0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1d6e0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
1d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d700 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
1d710 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72  pared stmt under
1d720 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a   constructions *
1d730 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
1d740 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
1d750 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75  m;  /* FROM clau
1d760 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f  se term being co
1d770 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ded */.  int add
1d780 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  rBrk;           
1d790 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
1d7a0 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f   here to break o
1d7b0 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a  ut of the loop *
1d7c0 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
1d7d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d7e0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
1d7f0 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
1d800 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a  h next cycle */.
1d810 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65 67 20    int iRowidReg 
1d820 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  = 0;        /* R
1d830 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64 20 69  owid is stored i
1d840 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 2c  n this register,
1d850 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a   if not zero */.
1d860 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65 52 65    int iReleaseRe
1d870 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54  g = 0;      /* T
1d880 65 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20  emp register to 
1d890 66 72 65 65 20 62 65 66 6f 72 65 20 72 65 74 75  free before retu
1d8a0 72 6e 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61  rning */.  Bitma
1d8b0 73 6b 20 6e 65 77 4e 6f 74 52 65 61 64 79 3b 20  sk newNotReady; 
1d8c0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
1d8d0 61 6c 75 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73  alue */..  pPars
1d8e0 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
1d8f0 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  se;.  v = pParse
1d900 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d  ->pVdbe;.  pWC =
1d910 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20   &pWInfo->sWC;. 
1d920 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1d930 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57  ;.  pLevel = &pW
1d940 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b  Info->a[iLevel];
1d950 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
1d960 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54 61  l->pWLoop;.  pTa
1d970 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d  bItem = &pWInfo-
1d980 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
1d990 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69  vel->iFrom];.  i
1d9a0 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
1d9b0 69 43 75 72 73 6f 72 3b 0a 20 20 62 52 65 76 20  iCursor;.  bRev 
1d9c0 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61  = (pWInfo->revMa
1d9d0 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b 0a 20  sk>>iLevel)&1;. 
1d9e0 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c   omitTable = (pL
1d9f0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1da00 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d  HERE_IDX_ONLY)!=
1da10 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  0 .           &&
1da20 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
1da30 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52  lags & WHERE_FOR
1da40 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 20 20  CE_TABLE)==0;.  
1da50 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1da60 28 76 2c 20 22 42 65 67 69 6e 20 4a 6f 69 6e 20  (v, "Begin Join 
1da70 4c 6f 6f 70 20 25 64 22 2c 20 69 4c 65 76 65 6c  Loop %d", iLevel
1da80 29 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  ));..  /* Create
1da90 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20   labels for the 
1daa0 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e  "break" and "con
1dab0 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69  tinue" instructi
1dac0 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ons.  ** for the
1dad0 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20   current loop.  
1dae0 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20  Jump to addrBrk 
1daf0 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
1db00 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d  a loop..  ** Jum
1db10 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20  p to cont to go 
1db20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74  immediately to t
1db30 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
1db40 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f  n of the.  ** lo
1db50 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  op..  **.  ** Wh
1db60 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 49  en there is an I
1db70 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61  N operator, we a
1db80 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64 64 72  lso have a "addr
1db90 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a  Nxt" label that.
1dba0 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f    ** means to co
1dbb0 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20  ntinue with the 
1dbc0 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f  next IN value co
1dbd0 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e  mbination.  When
1dbe0 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20  .  ** there are 
1dbf0 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  no IN operators 
1dc00 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  in the constrain
1dc10 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74  ts, the "addrNxt
1dc20 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20  " label.  ** is 
1dc30 74 68 65 20 73 61 6d 65 20 61 73 20 22 61 64 64  the same as "add
1dc40 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64  rBrk"..  */.  ad
1dc50 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e  drBrk = pLevel->
1dc60 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c  addrBrk = pLevel
1dc70 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69  ->addrNxt = sqli
1dc80 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1dc90 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20  (v);.  addrCont 
1dca0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
1dcb0 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
1dcc0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
1dcd0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
1dce0 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
1dcf0 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
1dd00 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e  OIN, allocate an
1dd10 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  d.  ** initializ
1dd20 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  e a memory cell 
1dd30 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20  that records if 
1dd40 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68  this table match
1dd50 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20  es any.  ** row 
1dd60 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  of the left tabl
1dd70 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20  e of the join.. 
1dd80 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c   */.  if( pLevel
1dd90 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54  ->iFrom>0 && (pT
1dda0 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79  abItem[0].jointy
1ddb0 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
1ddc0 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   ){.    pLevel->
1ddd0 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50  iLeftJoin = ++pP
1dde0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1ddf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1de00 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1de10 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   0, pLevel->iLef
1de20 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65  tJoin);.    Vdbe
1de30 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69  Comment((v, "ini
1de40 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d  t LEFT JOIN no-m
1de50 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20  atch flag"));.  
1de60 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  }..  /* Special 
1de70 63 61 73 65 20 6f 66 20 61 20 46 52 4f 4d 20 63  case of a FROM c
1de80 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 20 69  lause subquery i
1de90 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
1dea0 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  co-routine */.  
1deb0 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69  if( pTabItem->vi
1dec0 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  aCoroutine ){.  
1ded0 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d    int regYield =
1dee0 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65   pTabItem->regRe
1def0 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
1df00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1df10 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62 49  P_Integer, pTabI
1df20 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
1df30 2d 31 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20  -1, regYield);. 
1df40 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
1df50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1df60 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
1df70 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 56  regYield);.    V
1df80 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1df90 6e 65 78 74 20 72 6f 77 20 6f 66 20 63 6f 2d 72  next row of co-r
1dfa0 6f 75 74 69 6e 65 20 25 73 22 2c 20 70 54 61 62  outine %s", pTab
1dfb0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
1dfc0 65 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e));.    sqlite3
1dfd0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1dfe0 5f 49 66 2c 20 72 65 67 59 69 65 6c 64 2b 31 2c  _If, regYield+1,
1dff0 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 70   addrBrk);.    p
1e000 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47  Level->op = OP_G
1e010 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69  oto;.  }else..#i
1e020 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e030 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
1e040 20 69 66 28 20 20 28 70 4c 6f 6f 70 2d 3e 77 73   if(  (pLoop->ws
1e050 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
1e060 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
1e070 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a  {.    /* Case 1:
1e080 20 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 61    The table is a
1e090 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20   virtual-table. 
1e0a0 20 55 73 65 20 74 68 65 20 56 46 69 6c 74 65 72   Use the VFilter
1e0b0 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20 20 2a   and VNext.    *
1e0c0 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 61 63  *          to ac
1e0d0 63 65 73 73 20 74 68 65 20 64 61 74 61 2e 0a 20  cess the data.. 
1e0e0 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52     */.    int iR
1e0f0 65 67 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c 75  eg;   /* P3 Valu
1e100 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72  e for OP_VFilter
1e110 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
1e120 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20 20 20 69 6e  NotFound;.    in
1e130 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  t nConstraint = 
1e140 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b 0a 0a  pLoop->nLTerm;..
1e150 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1e160 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
1e170 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c  ;.    iReg = sql
1e180 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
1e190 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72  (pParse, nConstr
1e1a0 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 61 64 64  aint+2);.    add
1e1b0 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76  rNotFound = pLev
1e1c0 65 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a 20 20 20  el->addrBrk;.   
1e1d0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e   for(j=0; j<nCon
1e1e0 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20  straint; j++){. 
1e1f0 20 20 20 20 20 69 6e 74 20 69 54 61 72 67 65 74       int iTarget
1e200 20 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a 20 20 20   = iReg+j+2;.   
1e210 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70     pTerm = pLoop
1e220 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  ->aLTerm[j];.   
1e230 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
1e240 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1e250 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
1e260 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
1e270 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 45 71  {.        codeEq
1e280 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
1e290 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
1e2a0 2c 20 6a 2c 20 62 52 65 76 2c 20 69 54 61 72 67  , j, bRev, iTarg
1e2b0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  et);.        add
1e2c0 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76  rNotFound = pLev
1e2d0 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20  el->addrNxt;.   
1e2e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e2f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1e300 65 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d  e(pParse, pTerm-
1e310 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
1e320 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20  iTarget);.      
1e330 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
1e340 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e350 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 4c 6f   OP_Integer, pLo
1e360 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75  op->u.vtab.idxNu
1e370 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71  m, iReg);.    sq
1e380 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1e390 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e  v, OP_Integer, n
1e3a0 43 6f 6e 73 74 72 61 69 6e 74 2c 20 69 52 65 67  Constraint, iReg
1e3b0 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +1);.    sqlite3
1e3c0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1e3d0 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c 20  _VFilter, iCur, 
1e3e0 61 64 64 72 4e 6f 74 46 6f 75 6e 64 2c 20 69 52  addrNotFound, iR
1e3f0 65 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eg,.            
1e400 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d            pLoop-
1e410 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 0a  >u.vtab.idxStr,.
1e420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e430 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76        pLoop->u.v
1e440 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3f 20 50  tab.needFree ? P
1e450 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f 53  4_MPRINTF : P4_S
1e460 54 41 54 49 43 29 3b 0a 20 20 20 20 70 4c 6f 6f  TATIC);.    pLoo
1e470 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
1e480 65 65 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ee = 0;.    for(
1e490 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69  j=0; j<nConstrai
1e4a0 6e 74 20 26 26 20 6a 3c 31 36 3b 20 6a 2b 2b 29  nt && j<16; j++)
1e4b0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f  {.      if( (pLo
1e4c0 6f 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d  op->u.vtab.omitM
1e4d0 61 73 6b 3e 3e 6a 29 26 31 20 29 7b 0a 20 20 20  ask>>j)&1 ){.   
1e4e0 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
1e4f0 28 70 4c 65 76 65 6c 2c 20 70 4c 6f 6f 70 2d 3e  (pLevel, pLoop->
1e500 61 4c 54 65 72 6d 5b 6a 5d 29 3b 0a 20 20 20 20  aLTerm[j]);.    
1e510 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c    }.    }.    pL
1e520 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e  evel->op = OP_VN
1e530 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ext;.    pLevel-
1e540 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
1e550 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c  pLevel->p2 = sql
1e560 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1e570 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
1e580 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
1e590 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52 65 67  nge(pParse, iReg
1e5a0 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29  , nConstraint+2)
1e5b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1e5c0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
1e5d0 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  , 1);.  }else.#e
1e5e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1e5f0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1e600 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 4c 6f 6f   */..  if( (pLoo
1e610 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1e620 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 26 26  RE_IPK)!=0.   &&
1e630 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1e640 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   & (WHERE_COLUMN
1e650 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  _IN|WHERE_COLUMN
1e660 5f 45 51 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20  _EQ))!=0.  ){.  
1e670 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65    /* Case 2:  We
1e680 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72 65   can directly re
1e690 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65  ference a single
1e6a0 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20 20   row using an.  
1e6b0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71    **          eq
1e6c0 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
1e6d0 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
1e6e0 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20  WID field.  Or. 
1e6f0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77     **          w
1e700 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74  e reference mult
1e710 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20  iple rows using 
1e720 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e  a "rowid IN (...
1e730 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  )".    **       
1e740 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20     construct..  
1e750 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1e760 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1e770 6e 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20 69 52  nEq==1 );.    iR
1e780 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69  eleaseReg = sqli
1e790 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
1e7a0 61 72 73 65 29 3b 0a 20 20 20 20 70 54 65 72 6d  arse);.    pTerm
1e7b0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
1e7c0 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [0];.    assert(
1e7d0 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
1e7e0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
1e7f0 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
1e800 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c  assert( omitTabl
1e810 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  e==0 );.    test
1e820 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
1e830 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
1e840 55 41 4c 20 29 3b 0a 20 20 20 20 69 52 6f 77 69  UAL );.    iRowi
1e850 64 52 65 67 20 3d 20 63 6f 64 65 45 71 75 61 6c  dReg = codeEqual
1e860 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ityTerm(pParse, 
1e870 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30  pTerm, pLevel, 0
1e880 2c 20 62 52 65 76 2c 20 69 52 65 6c 65 61 73 65  , bRev, iRelease
1e890 52 65 67 29 3b 0a 20 20 20 20 61 64 64 72 4e 78  Reg);.    addrNx
1e8a0 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  t = pLevel->addr
1e8b0 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Nxt;.    sqlite3
1e8c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e8d0 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 52 6f 77  _MustBeInt, iRow
1e8e0 69 64 52 65 67 2c 20 61 64 64 72 4e 78 74 29 3b  idReg, addrNxt);
1e8f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1e900 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp3(v, OP_Not
1e910 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20 61 64  Exists, iCur, ad
1e920 64 72 4e 78 74 2c 20 69 52 6f 77 69 64 52 65 67  drNxt, iRowidReg
1e930 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1e940 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1e950 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52  hange(pParse, iR
1e960 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a 20 20 20  owidReg, 1);.   
1e970 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1e980 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
1e990 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
1e9a0 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  eg);.    VdbeCom
1e9b0 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
1e9c0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1e9d0 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c  = OP_Noop;.  }el
1e9e0 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77  se if( (pLoop->w
1e9f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1ea00 50 4b 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  PK)!=0.         
1ea10 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
1ea20 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
1ea30 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20 29 7b  N_RANGE)!=0.  ){
1ea40 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20  .    /* Case 3: 
1ea50 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71   We have an ineq
1ea60 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
1ea70 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
1ea80 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a  WID field..    *
1ea90 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70  /.    int testOp
1eaa0 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
1eab0 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 69  int start;.    i
1eac0 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d  nt memEndValue =
1ead0 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72   0;.    WhereTer
1eae0 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64  m *pStart, *pEnd
1eaf0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  ;..    assert( o
1eb00 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
1eb10 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 70 53     j = 0;.    pS
1eb20 74 61 72 74 20 3d 20 70 45 6e 64 20 3d 20 30 3b  tart = pEnd = 0;
1eb30 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1eb40 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1eb50 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53 74 61  BTM_LIMIT ) pSta
1eb60 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rt = pLoop->aLTe
1eb70 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66 28  rm[j++];.    if(
1eb80 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1eb90 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
1eba0 54 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f 6f 70  T ) pEnd = pLoop
1ebb0 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20  ->aLTerm[j++];. 
1ebc0 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72     assert( pStar
1ebd0 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20  t!=0 || pEnd!=0 
1ebe0 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 20  );.    if( bRev 
1ebf0 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  ){.      pTerm =
1ec00 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70   pStart;.      p
1ec10 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20  Start = pEnd;.  
1ec20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d      pEnd = pTerm
1ec30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ec40 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  pStart ){.      
1ec50 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20  Expr *pX;       
1ec60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
1ec70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66  ression that def
1ec80 69 6e 65 73 20 74 68 65 20 73 74 61 72 74 20 62  ines the start b
1ec90 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ound */.      in
1eca0 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20  t r1, rTemp;    
1ecb0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
1ecc0 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65   for holding the
1ecd0 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20   start boundary 
1ece0 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  */..      /* The
1ecf0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74   following const
1ed00 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63  ant maps TK_xx c
1ed10 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73  odes into corres
1ed20 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a  ponding .      *
1ed30 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20  * seek opcodes. 
1ed40 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61   It depends on a
1ed50 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65   particular orde
1ed60 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20  ring of TK_xx.  
1ed70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e      */.      con
1ed80 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20  st u8 aMoveOp[] 
1ed90 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f  = {.           /
1eda0 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53  * TK_GT */  OP_S
1edb0 65 65 6b 47 74 2c 0a 20 20 20 20 20 20 20 20 20  eekGt,.         
1edc0 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f    /* TK_LE */  O
1edd0 50 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20 20 20  P_SeekLe,.      
1ede0 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f       /* TK_LT */
1edf0 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20 20 20    OP_SeekLt,.   
1ee00 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45          /* TK_GE
1ee10 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65 0a 20   */  OP_SeekGe. 
1ee20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73       };.      as
1ee30 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f  sert( TK_LE==TK_
1ee40 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+1 );      /* 
1ee50 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72  Make sure the or
1ee60 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20  dering.. */.    
1ee70 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
1ee80 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20  =TK_GT+2 );     
1ee90 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20   /*  ... of the 
1eea0 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20  TK_xx values... 
1eeb0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1eec0 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20   TK_GE==TK_GT+3 
1eed0 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20  );      /*  ... 
1eee0 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a  is correcct. */.
1eef0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
1ef00 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  pStart->wtFlags 
1ef10 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
1ef20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1ef30 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74 46 6c  se( pStart->wtFl
1ef40 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1ef50 41 4c 20 29 3b 0a 20 20 20 20 20 20 70 58 20 3d  AL );.      pX =
1ef60 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a   pStart->pExpr;.
1ef70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
1ef80 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  !=0 );.      tes
1ef90 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 6c  tcase( pStart->l
1efa0 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20  eftCursor!=iCur 
1efb0 29 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69 76 65  ); /* transitive
1efc0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
1efd0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1efe0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1eff0 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
1f000 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20  t, &rTemp);.    
1f010 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f020 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70  Op3(v, aMoveOp[p
1f030 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43  X->op-TK_GT], iC
1f040 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29  ur, addrBrk, r1)
1f050 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
1f060 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
1f070 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f080 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
1f090 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
1f0a0 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
1f0b0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1f0c0 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b  (pParse, rTemp);
1f0d0 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
1f0e0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72  rm(pLevel, pStar
1f0f0 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
1f100 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f110 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f  AddOp2(v, bRev ?
1f120 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65   OP_Last : OP_Re
1f130 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72  wind, iCur, addr
1f140 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Brk);.    }.    
1f150 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20  if( pEnd ){.    
1f160 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20    Expr *pX;.    
1f170 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78    pX = pEnd->pEx
1f180 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
1f190 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
1f1a0 20 61 73 73 65 72 74 28 20 28 70 45 6e 64 2d 3e   assert( (pEnd->
1f1b0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1f1c0 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  NULL)==0 );.    
1f1d0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 6e 64    testcase( pEnd
1f1e0 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43  ->leftCursor!=iC
1f1f0 75 72 20 29 3b 20 2f 2a 20 54 72 61 6e 73 69 74  ur ); /* Transit
1f200 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ive constraints 
1f210 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
1f220 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73  e( pEnd->wtFlags
1f230 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1f240 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64 56  );.      memEndV
1f250 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d  alue = ++pParse-
1f260 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
1f270 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1f280 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
1f290 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20   memEndValue);. 
1f2a0 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d       if( pX->op=
1f2b0 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70  =TK_LT || pX->op
1f2c0 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20  ==TK_GT ){.     
1f2d0 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76     testOp = bRev
1f2e0 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65   ? OP_Le : OP_Ge
1f2f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1f300 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
1f310 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f  bRev ? OP_Lt : O
1f320 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  P_Gt;.      }.  
1f330 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
1f340 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20  pLevel, pEnd);. 
1f350 20 20 20 7d 0a 20 20 20 20 73 74 61 72 74 20 3d     }.    start =
1f360 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1f370 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
1f380 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65  pLevel->op = bRe
1f390 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50  v ? OP_Prev : OP
1f3a0 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65  _Next;.    pLeve
1f3b0 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
1f3c0 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
1f3d0 74 61 72 74 3b 0a 20 20 20 20 61 73 73 65 72 74  tart;.    assert
1f3e0 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20  ( pLevel->p5==0 
1f3f0 29 3b 0a 20 20 20 20 69 66 28 20 74 65 73 74 4f  );.    if( testO
1f400 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
1f410 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
1f420 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71  iReleaseReg = sq
1f430 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1f440 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
1f450 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1f460 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43  (v, OP_Rowid, iC
1f470 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  ur, iRowidReg);.
1f480 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f490 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
1f4a0 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
1f4b0 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1f4c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f4d0 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d  3(v, testOp, mem
1f4e0 45 6e 64 56 61 6c 75 65 2c 20 61 64 64 72 42 72  EndValue, addrBr
1f4f0 6b 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  k, iRowidReg);. 
1f500 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f510 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
1f520 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c  TE_AFF_NUMERIC |
1f530 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
1f540 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  LL);.    }.  }el
1f550 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  se if( pLoop->ws
1f560 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
1f570 44 45 58 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20  DEXED ){.    /* 
1f580 43 61 73 65 20 34 3a 20 41 20 73 63 61 6e 20 75  Case 4: A scan u
1f590 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20  sing an index.. 
1f5a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1f5b0 20 20 20 20 20 54 68 65 20 57 48 45 52 45 20 63       The WHERE c
1f5c0 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61 69  lause may contai
1f5d0 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65  n zero or more e
1f5e0 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20  quality .    ** 
1f5f0 20 20 20 20 20 20 20 20 74 65 72 6d 73 20 28 22          terms ("
1f600 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72  ==" or "IN" oper
1f610 61 74 6f 72 73 29 20 74 68 61 74 20 72 65 66 65  ators) that refe
1f620 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a  r to the N.    *
1f630 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74 2d 6d  *         left-m
1f640 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ost columns of t
1f650 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d 61 79  he index. It may
1f660 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20   also contain.  
1f670 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 65    **         ine
1f680 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1f690 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72  nts (>, <, >= or
1f6a0 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64 65   <=) on the inde
1f6b0 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  xed.    **      
1f6c0 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69     column that i
1f6d0 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
1f6e0 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69 74  ws the N equalit
1f6f0 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a  ies. Only .    *
1f700 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69  *         the ri
1f710 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  ght-most column 
1f720 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61  can be an inequa
1f730 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73 74 20  lity - the rest 
1f740 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  must.    **     
1f750 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22      use the "=="
1f760 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74   and "IN" operat
1f770 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ors. For example
1f780 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a  , if the .    **
1f790 20 20 20 20 20 20 20 20 20 69 6e 64 65 78 20 69           index i
1f7a0 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68  s on (x,y,z), th
1f7b0 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  en the following
1f7c0 20 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c 6c   clauses are all
1f7d0 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
1f7e0 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20   optimized:.    
1f7f0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1f800 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20       x=5.    ** 
1f810 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1f820 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20  ND y=10.    **  
1f830 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
1f840 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20  D y<10.    **   
1f850 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
1f860 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20 20   y>5 AND y<10.  
1f870 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1f880 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44 20  x=5 AND y=5 AND 
1f890 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20  z<=10.    **.   
1f8a0 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20   **         The 
1f8b0 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68 65  z<10 term of the
1f8c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f   following canno
1f8d0 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a  t be used, only.
1f8e0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
1f8f0 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20  he x=5 term:.   
1f900 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1f910 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c        x=5 AND z<
1f920 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  10.    **.    **
1f930 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79 20 62           N may b
1f940 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20  e zero if there 
1f950 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  are inequality c
1f960 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20  onstraints..    
1f970 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 74 68  **         If th
1f980 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71 75  ere are no inequ
1f990 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1f9a0 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74 0a  s, then N is at.
1f9b0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c      **         l
1f9c0 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a  east one..    **
1f9d0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f9e0 54 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73  This case is als
1f9f0 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 72  o used when ther
1fa00 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63  e are no WHERE c
1fa10 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20 20 20  lause.    **    
1fa20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73       constraints
1fa30 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73   but an index is
1fa40 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79   selected anyway
1fa50 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a  , in order.    *
1fa60 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72  *         to for
1fa70 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72  ce the output or
1fa80 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74  der to conform t
1fa90 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20  o an ORDER BY.. 
1faa0 20 20 20 2a 2f 20 20 0a 20 20 20 20 73 74 61 74     */  .    stat
1fab0 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61  ic const u8 aSta
1fac0 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  rtOp[] = {.     
1fad0 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20 20   0,.      0,.   
1fae0 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20     OP_Rewind,   
1faf0 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 21          /* 2: (!
1fb00 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1fb10 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20  s && startEq && 
1fb20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
1fb30 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20 20   OP_Last,       
1fb40 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73 74        /* 3: (!st
1fb50 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1fb60 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20 20  && startEq &&   
1fb70 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
1fb80 50 5f 53 65 65 6b 47 74 2c 20 20 20 20 20 20 20  P_SeekGt,       
1fb90 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72 74      /* 4: (start
1fba0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
1fbb0 20 21 73 74 61 72 74 45 71 20 26 26 20 21 62 52   !startEq && !bR
1fbc0 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1fbd0 53 65 65 6b 4c 74 2c 20 20 20 20 20 20 20 20 20  SeekLt,         
1fbe0 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f 63    /* 5: (start_c
1fbf0 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21  onstraints  && !
1fc00 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76  startEq &&  bRev
1fc10 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
1fc20 65 6b 47 65 2c 20 20 20 20 20 20 20 20 20 20 20  ekGe,           
1fc30 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 6: (start_con
1fc40 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74  straints  &&  st
1fc50 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20  artEq && !bRev) 
1fc60 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
1fc70 4c 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Le            /*
1fc80 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   7: (start_const
1fc90 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72  raints  &&  star
1fca0 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f  tEq &&  bRev) */
1fcb0 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74 61 74  .    };.    stat
1fcc0 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e 64  ic const u8 aEnd
1fcd0 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f  Op[] = {.      O
1fce0 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20 20  P_Noop,         
1fcf0 20 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e 64 5f      /* 0: (!end_
1fd00 63 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a 2f 0a  constraints) */.
1fd10 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45 2c 20        OP_IdxGE, 
1fd20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a             /* 1:
1fd30 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74   (end_constraint
1fd40 73 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  s && !bRev) */. 
1fd50 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 20 20 20       OP_IdxLT   
1fd60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20            /* 2: 
1fd70 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  (end_constraints
1fd80 20 26 26 20 62 52 65 76 29 20 2a 2f 0a 20 20 20   && bRev) */.   
1fd90 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 45 71 20   };.    int nEq 
1fda0 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
1fdb0 2e 6e 45 71 3b 20 20 2f 2a 20 4e 75 6d 62 65 72  .nEq;  /* Number
1fdc0 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72   of == or IN ter
1fdd0 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  ms */.    int is
1fde0 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b 20 20 20  MinQuery = 0;   
1fdf0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1fe00 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
1fe10 7a 65 64 20 53 45 4c 45 43 54 20 6d 69 6e 28 78  zed SELECT min(x
1fe20 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ).. */.    int r
1fe30 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20  egBase;         
1fe40 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20          /* Base 
1fe50 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
1fe60 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75   constraint valu
1fe70 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31  es */.    int r1
1fe80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fe90 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72         /* Temp r
1fea0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 57  egister */.    W
1feb0 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65  hereTerm *pRange
1fec0 53 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49  Start = 0;  /* I
1fed0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1fee0 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 73 74  aint at range st
1fef0 61 72 74 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  art */.    Where
1ff00 54 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20  Term *pRangeEnd 
1ff10 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75  = 0;    /* Inequ
1ff20 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1ff30 20 61 74 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f   at range end */
1ff40 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 45 71  .    int startEq
1ff50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ff60 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e    /* True if ran
1ff70 67 65 20 73 74 61 72 74 20 75 73 65 73 20 3d 3d  ge start uses ==
1ff80 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20  , >= or <= */.  
1ff90 20 20 69 6e 74 20 65 6e 64 45 71 3b 20 20 20 20    int endEq;    
1ffa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ffb0 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20  * True if range 
1ffc0 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20  end uses ==, >= 
1ffd0 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74  or <= */.    int
1ffe0 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
1fff0 74 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61  ts;       /* Sta
20000 72 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20 63  rt of range is c
20010 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20  onstrained */.  
20020 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e    int nConstrain
20030 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
20040 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73  * Number of cons
20050 74 72 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a  traint terms */.
20060 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
20070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20080 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65   /* The index we
20090 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a   will be using *
200a0 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75  /.    int iIdxCu
200b0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
200c0 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
200d0 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e  ursor for the in
200e0 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  dex */.    int n
200f0 45 78 74 72 61 52 65 67 20 3d 20 30 3b 20 20 20  ExtraReg = 0;   
20100 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20110 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
20120 74 65 72 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20  ters needed */. 
20130 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20     int op;      
20140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20150 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f  /* Instruction o
20160 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68 61  pcode */.    cha
20170 72 20 2a 7a 53 74 61 72 74 41 66 66 3b 20 20 20  r *zStartAff;   
20180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
20190 69 6e 69 74 79 20 66 6f 72 20 73 74 61 72 74 20  inity for start 
201a0 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  of range constra
201b0 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  int */.    char 
201c0 2a 7a 45 6e 64 41 66 66 3b 20 20 20 20 20 20 20  *zEndAff;       
201d0 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e          /* Affin
201e0 69 74 79 20 66 6f 72 20 65 6e 64 20 6f 66 20 72  ity for end of r
201f0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ange constraint 
20200 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d 20 70  */..    pIdx = p
20210 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
20220 6e 64 65 78 3b 0a 20 20 20 20 69 49 64 78 43 75  ndex;.    iIdxCu
20230 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
20240 43 75 72 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  Cur;..    /* If 
20250 74 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73 66  this loop satisf
20260 69 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65 72  ies a sort order
20270 20 28 70 4f 72 64 65 72 42 79 29 20 72 65 71 75   (pOrderBy) requ
20280 65 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a 2a  est that .    **
20290 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74   was passed to t
202a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
202b0 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c  implement a "SEL
202c0 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20  ECT min(x) ..." 
202d0 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 74  .    ** query, t
202e0 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 77  hen the caller w
202f0 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74  ill only allow t
20300 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66  he loop to run f
20310 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67  or.    ** a sing
20320 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68  le iteration. Th
20330 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
20340 65 20 66 69 72 73 74 20 72 6f 77 20 72 65 74 75  e first row retu
20350 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75  rned.    ** shou
20360 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55  ld not have a NU
20370 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  LL value stored 
20380 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d  in 'x'. If colum
20390 6e 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a 20  n 'x' is.    ** 
203a0 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61 66  the first one af
203b0 74 65 72 20 74 68 65 20 6e 45 71 20 65 71 75 61  ter the nEq equa
203c0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
203d0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20   in the index,. 
203e0 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75 69     ** this requi
203f0 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c  res some special
20400 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a   handling..    *
20410 2f 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66  /.    if( (pWInf
20420 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48  o->wctrlFlags&WH
20430 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29  ERE_ORDERBY_MIN)
20440 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57 49  !=0.     && (pWI
20450 6e 66 6f 2d 3e 62 4f 42 53 61 74 21 3d 30 29 0a  nfo->bOBSat!=0).
20460 20 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e 6e       && (pIdx->n
20470 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20  Column>nEq).    
20480 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65  ){.      /* asse
20490 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  rt( pOrderBy->nE
204a0 78 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20  xpr==1 ); */.   
204b0 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f     /* assert( pO
204c0 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78  rderBy->a[0].pEx
204d0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64  pr->iColumn==pId
204e0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d  x->aiColumn[nEq]
204f0 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 69 73 4d   ); */.      isM
20500 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a 20 20 20  inQuery = 1;.   
20510 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31     nExtraReg = 1
20520 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
20530 46 69 6e 64 20 61 6e 79 20 69 6e 65 71 75 61 6c  Find any inequal
20540 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  ity constraint t
20550 65 72 6d 73 20 66 6f 72 20 74 68 65 20 73 74 61  erms for the sta
20560 72 74 20 61 6e 64 20 65 6e 64 20 0a 20 20 20 20  rt and end .    
20570 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  ** of the range.
20580 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6a 20 3d   .    */.    j =
20590 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 4c   nEq;.    if( pL
205a0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
205b0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
205c0 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 53 74  {.      pRangeSt
205d0 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  art = pLoop->aLT
205e0 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20  erm[j++];.      
205f0 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
20600 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f     }.    if( pLo
20610 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
20620 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b  ERE_TOP_LIMIT ){
20630 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64  .      pRangeEnd
20640 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
20650 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78  [j++];.      nEx
20660 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
20670 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  }..    /* Genera
20680 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
20690 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ate all constrai
206a0 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d  nt terms using =
206b0 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61  = or IN.    ** a
206c0 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c  nd store the val
206d0 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72  ues of those ter
206e0 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  ms in an array o
206f0 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20  f registers.    
20700 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 72  ** starting at r
20710 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  egBase..    */. 
20720 20 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64     regBase = cod
20730 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d  eAllEqualityTerm
20740 73 28 70 50 61 72 73 65 2c 70 4c 65 76 65 6c 2c  s(pParse,pLevel,
20750 62 52 65 76 2c 6e 45 78 74 72 61 52 65 67 2c 26  bRev,nExtraReg,&
20760 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20  zStartAff);.    
20770 7a 45 6e 64 41 66 66 20 3d 20 73 71 6c 69 74 65  zEndAff = sqlite
20780 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 53  3DbStrDup(db, zS
20790 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 61 64  tartAff);.    ad
207a0 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  drNxt = pLevel->
207b0 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20 2f 2a  addrNxt;..    /*
207c0 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
207d0 20 61 20 72 65 76 65 72 73 65 20 6f 72 64 65 72   a reverse order
207e0 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65   scan on an asce
207f0 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a  nding index, or.
20800 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61 72 64      ** a forward
20810 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61   order scan on a
20820 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65   descending inde
20830 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65 20 74  x, interchange t
20840 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  he .    ** start
20850 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73 20 28   and end terms (
20860 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e 64 20  pRangeStart and 
20870 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20  pRangeEnd)..    
20880 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e 45 71 3c  */.    if( (nEq<
20890 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26  pIdx->nColumn &&
208a0 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53   bRev==(pIdx->aS
208b0 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53  ortOrder[nEq]==S
208c0 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 29 0a 20  QLITE_SO_ASC)). 
208d0 20 20 20 20 7c 7c 20 28 62 52 65 76 20 26 26 20      || (bRev && 
208e0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6e  pIdx->nColumn==n
208f0 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
20900 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 20   SWAP(WhereTerm 
20910 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20 70 52  *, pRangeEnd, pR
20920 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20  angeStart);.    
20930 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  }..    testcase(
20940 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20   pRangeStart && 
20950 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f  (pRangeStart->eO
20960 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29  perator & WO_LE)
20970 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
20980 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
20990 20 26 26 20 28 70 52 61 6e 67 65 53 74 61 72 74   && (pRangeStart
209a0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
209b0 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74  _GE)!=0 );.    t
209c0 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
209d0 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64  nd && (pRangeEnd
209e0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
209f0 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74  _LE)!=0 );.    t
20a00 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
20a10 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64  nd && (pRangeEnd
20a20 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
20a30 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 73  _GE)!=0 );.    s
20a40 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65  tartEq = !pRange
20a50 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53  Start || pRangeS
20a60 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
20a70 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
20a80 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21  .    endEq =   !
20a90 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61  pRangeEnd || pRa
20aa0 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
20ab0 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45  r & (WO_LE|WO_GE
20ac0 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e  );.    start_con
20ad0 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67  straints = pRang
20ae0 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b  eStart || nEq>0;
20af0 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68  ..    /* Seek th
20b00 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74  e index cursor t
20b10 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
20b20 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20  he range. */.   
20b30 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e   nConstraint = n
20b40 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e  Eq;.    if( pRan
20b50 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  geStart ){.     
20b60 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
20b70 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78  pRangeStart->pEx
20b80 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
20b90 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
20ba0 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
20bb0 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
20bc0 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67        if( (pRang
20bd0 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  eStart->wtFlags 
20be0 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
20bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20c00 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c  te3ExprCodeIsNul
20c10 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c  lJump(v, pRight,
20c20 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64   regBase+nEq, ad
20c30 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  drNxt);.      }.
20c40 20 20 20 20 20 20 69 66 28 20 7a 53 74 61 72 74        if( zStart
20c50 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
20c60 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
20c70 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
20c80 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d  , zStartAff[nEq]
20c90 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )==SQLITE_AFF_NO
20ca0 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  NE){.          /
20cb0 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70  * Since the comp
20cc0 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20  arison is to be 
20cd0 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e  performed with n
20ce0 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20  o conversions.  
20cf0 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69          ** appli
20d00 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e  ed to the operan
20d10 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69  ds, set the affi
20d20 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f  nity to apply to
20d30 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20   pRight to .    
20d40 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
20d50 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20  AFF_NONE.  */.  
20d60 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66          zStartAf
20d70 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
20d80 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
20d90 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
20da0 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
20db0 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
20dc0 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41  (pRight, zStartA
20dd0 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20  ff[nEq]) ){.    
20de0 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b        zStartAff[
20df0 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
20e00 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
20e10 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20  }.      }  .    
20e20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
20e30 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20e40 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74   pRangeStart->wt
20e50 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
20e60 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73  TUAL );.    }els
20e70 65 20 69 66 28 20 69 73 4d 69 6e 51 75 65 72 79  e if( isMinQuery
20e80 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
20e90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20ea0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61  P_Null, 0, regBa
20eb0 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e  se+nEq);.      n
20ec0 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
20ed0 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b      startEq = 0;
20ee0 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e  .      start_con
20ef0 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20  straints = 1;.  
20f00 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70 6c    }.    codeAppl
20f10 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  yAffinity(pParse
20f20 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73  , regBase, nCons
20f30 74 72 61 69 6e 74 2c 20 7a 53 74 61 72 74 41 66  traint, zStartAf
20f40 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53 74  f);.    op = aSt
20f50 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e  artOp[(start_con
20f60 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28  straints<<2) + (
20f70 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62 52  startEq<<1) + bR
20f80 65 76 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ev];.    assert(
20f90 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 74 65   op!=0 );.    te
20fa0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52  stcase( op==OP_R
20fb0 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 74 65 73  ewind );.    tes
20fc0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61  tcase( op==OP_La
20fd0 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
20fe0 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47  se( op==OP_SeekG
20ff0 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
21000 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 65  e( op==OP_SeekGe
21010 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
21020 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20  ( op==OP_SeekLe 
21030 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
21040 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 29   op==OP_SeekLt )
21050 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
21060 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70  eAddOp4Int(v, op
21070 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e  , iIdxCur, addrN
21080 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  xt, regBase, nCo
21090 6e 73 74 72 61 69 6e 74 29 3b 0a 0a 20 20 20 20  nstraint);..    
210a0 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75  /* Load the valu
210b0 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75 61  e for the inequa
210c0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
210d0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
210e0 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 28  e.    ** range (
210f0 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a  if any)..    */.
21100 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20      nConstraint 
21110 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
21120 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20  RangeEnd ){.    
21130 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
21140 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70   pRangeEnd->pExp
21150 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
21160 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
21170 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
21180 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b  regBase+nEq, 1);
21190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
211a0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
211b0 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e  Right, regBase+n
211c0 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  Eq);.      if( (
211d0 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61  pRangeEnd->wtFla
211e0 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
211f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
21200 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73  qlite3ExprCodeIs
21210 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67  NullJump(v, pRig
21220 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  ht, regBase+nEq,
21230 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20   addrNxt);.     
21240 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45 6e   }.      if( zEn
21250 64 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  dAff ){.        
21260 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  if( sqlite3Compa
21270 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68  reAffinity(pRigh
21280 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29  t, zEndAff[nEq])
21290 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
212a0 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  E){.          /*
212b0 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61   Since the compa
212c0 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70  rison is to be p
212d0 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f  erformed with no
212e0 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20   conversions.   
212f0 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65         ** applie
21300 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64  d to the operand
21310 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e  s, set the affin
21320 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ity to apply to 
21330 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20  pRight to .     
21340 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41       ** SQLITE_A
21350 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20  FF_NONE.  */.   
21360 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e         zEndAff[n
21370 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  Eq] = SQLITE_AFF
21380 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
21390 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
213a0 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
213b0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52  ffinityChange(pR
213c0 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45  ight, zEndAff[nE
213d0 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  q]) ){.         
213e0 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20   zEndAff[nEq] = 
213f0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
21400 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21410 20 7d 20 20 0a 20 20 20 20 20 20 63 6f 64 65 41   }  .      codeA
21420 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61  pplyAffinity(pPa
21430 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45  rse, regBase, nE
21440 71 2b 31 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 20  q+1, zEndAff);. 
21450 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
21460 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ++;.      testca
21470 73 65 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77  se( pRangeEnd->w
21480 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
21490 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d 0a 20  RTUAL );.    }. 
214a0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
214b0 28 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b  (db, zStartAff);
214c0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
214d0 65 65 28 64 62 2c 20 7a 45 6e 64 41 66 66 29 3b  ee(db, zEndAff);
214e0 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20  ..    /* Top of 
214f0 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f  the loop body */
21500 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
21510 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
21520 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20  rentAddr(v);..  
21530 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
21540 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69  e index cursor i
21550 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  s past the end o
21560 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
21570 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b      op = aEndOp[
21580 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 6e 45  (pRangeEnd || nE
21590 71 29 20 2a 20 28 31 20 2b 20 62 52 65 76 29 5d  q) * (1 + bRev)]
215a0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
215b0 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20  op==OP_Noop );. 
215c0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
215d0 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20  =OP_IdxGE );.   
215e0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
215f0 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 69  P_IdxLT );.    i
21600 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  f( op!=OP_Noop )
21610 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
21620 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
21630 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64  op, iIdxCur, add
21640 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e  rNxt, regBase, n
21650 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20  Constraint);.   
21660 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
21670 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45 71 21  angeP5(v, endEq!
21680 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20 20 20  =bRev ?1:0);.   
21690 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
216a0 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69  ere are inequali
216b0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
216c0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  check that the v
216d0 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  alue.    ** of t
216e0 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
216f0 74 68 61 74 20 74 68 65 20 69 6e 65 71 75 61 6c  that the inequal
21700 69 74 79 20 63 6f 6e 74 72 61 69 6e 73 20 69 73  ity contrains is
21710 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a   not NULL..    *
21720 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75 6d 70  * If it is, jump
21730 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65   to the next ite
21740 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f  ration of the lo
21750 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
21760 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
21770 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
21780 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 6f     testcase( pLo
21790 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
217a0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b  ERE_BTM_LIMIT );
217b0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
217c0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
217d0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
217e0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  );.    if( (pLoo
217f0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
21800 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48  ERE_BTM_LIMIT|WH
21810 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21  ERE_TOP_LIMIT))!
21820 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
21830 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
21840 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78   OP_Column, iIdx
21850 43 75 72 2c 20 6e 45 71 2c 20 72 31 29 3b 0a 20  Cur, nEq, r1);. 
21860 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21870 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
21880 75 6c 6c 2c 20 72 31 2c 20 61 64 64 72 43 6f 6e  ull, r1, addrCon
21890 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
218a0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
218b0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
218c0 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68  ..    /* Seek th
218d0 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20  e table cursor, 
218e0 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
218f0 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
21900 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61  Level, pRangeSta
21910 72 74 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65  rt);.    disable
21920 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61  Term(pLevel, pRa
21930 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 69 66 28  ngeEnd);.    if(
21940 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20   !omitTable ){. 
21950 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d       iRowidReg =
21960 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73   iReleaseReg = s
21970 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
21980 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
21990 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
219a0 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64  2(v, OP_IdxRowid
219b0 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f 77 69  , iIdxCur, iRowi
219c0 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
219d0 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
219e0 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
219f0 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
21a00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21a10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
21a20 65 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77 69  eek, iCur, iRowi
21a30 64 52 65 67 29 3b 20 20 2f 2a 20 44 65 66 65 72  dReg);  /* Defer
21a40 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20  red seek */.    
21a50 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64  }..    /* Record
21a60 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
21a70 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61   used to termina
21a80 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73  te the loop. Dis
21a90 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45  able .    ** WHE
21aa0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
21ab0 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62  made redundant b
21ac0 79 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67  y the index rang
21ad0 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20  e scan..    */. 
21ae0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
21af0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
21b00 45 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 70 4c  EROW ){.      pL
21b10 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f  evel->op = OP_No
21b20 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  op;.    }else if
21b30 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ( bRev ){.      
21b40 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
21b50 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Prev;.    }else{
21b60 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
21b70 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  p = OP_Next;.   
21b80 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70   }.    pLevel->p
21b90 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20  1 = iIdxCur;.   
21ba0 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
21bb0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e  lags & WHERE_CON
21bc0 53 54 52 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20  STRAINT)==0 ){. 
21bd0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20       pLevel->p5 
21be0 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  = SQLITE_STMTSTA
21bf0 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
21c00 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  P;.    }else{.  
21c10 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
21c20 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20  el->p5==0 );.   
21c30 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e   }.  }else..#ifn
21c40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21c50 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  OR_OPTIMIZATION.
21c60 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
21c70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
21c80 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20  TI_OR ){.    /* 
21c90 43 61 73 65 20 35 3a 20 20 54 77 6f 20 6f 72 20  Case 5:  Two or 
21ca0 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79 20  more separately 
21cb0 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f  indexed terms co
21cc0 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20  nnected by OR.  
21cd0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
21ce0 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
21cf0 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
21d00 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20  E t1(a,b,c,d);. 
21d10 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49     **   CREATE I
21d20 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29  NDEX i1 ON t1(a)
21d30 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
21d40 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31  E INDEX i2 ON t1
21d50 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  (b);.    **   CR
21d60 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e  EATE INDEX i3 ON
21d70 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20   t1(c);.    **. 
21d80 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a     **   SELECT *
21d90 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
21da0 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d  =5 OR b=7 OR (c=
21db0 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20  11 AND d=13).   
21dc0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68   **.    ** In th
21dd0 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65  e example, there
21de0 20 61 72 65 20 74 68 72 65 65 20 69 6e 64 65 78   are three index
21df0 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74  ed terms connect
21e00 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a  ed by OR..    **
21e10 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   The top of the 
21e20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  loop looks like 
21e30 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  this:.    **.   
21e40 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c   **          Nul
21e50 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20  l       1       
21e60 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20           # Zero 
21e70 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65  the rowset in re
21e80 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  g 1.    **.    *
21e90 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68  * Then, for each
21ea0 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74   indexed term, t
21eb0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68  he following. Th
21ec0 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20  e arguments to. 
21ed0 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74     ** RowSetTest
21ee0 20 61 72 65 20 73 75 63 68 20 74 68 61 74 20 74   are such that t
21ef0 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
21f00 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69  current row is i
21f10 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69  nserted.    ** i
21f20 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20  nto the RowSet. 
21f30 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
21f40 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f   present, contro
21f50 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20  l skips the.    
21f60 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20  ** Gosub opcode 
21f70 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67  and jumps straig
21f80 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  ht to the code g
21f90 65 6e 65 72 61 74 65 64 20 62 79 20 57 68 65 72  enerated by Wher
21fa0 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  eEnd()..    **. 
21fb0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c     **        sql
21fc0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c  ite3WhereBegin(<
21fd0 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20  term>).    **   
21fe0 20 20 20 20 20 20 20 52 6f 77 53 65 74 54 65 73         RowSetTes
21ff0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
22000 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69     # Insert rowi
22010 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20  d into rowset.  
22020 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
22030 73 75 62 20 20 20 20 20 20 32 20 41 0a 20 20 20  sub      2 A.   
22040 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74   **        sqlit
22050 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20  e3WhereEnd().   
22060 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f   **.    ** Follo
22070 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20  wing the above, 
22080 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74  code to terminat
22090 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65  e the loop. Labe
220a0 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a  l A, the target.
220b0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f      ** of the Go
220c0 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73  sub above, jumps
220d0 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74   to the instruct
220e0 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72 20  ion right after 
220f0 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a  the Goto..    **
22100 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
22110 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20   Null       1   
22120 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a               # Z
22130 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69  ero the rowset i
22140 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20  n reg 1.    **  
22150 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20          Goto    
22160 20 20 20 42 20 20 20 20 20 20 20 20 20 20 20 20     B            
22170 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69      # The loop i
22180 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20  s finished..    
22190 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
221a0 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20  A: <loop body>  
221b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
221c0 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68   Return data, wh
221d0 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20  atever..    **. 
221e0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52     **          R
221f0 65 74 75 72 6e 20 20 20 20 20 32 20 20 20 20 20  eturn     2     
22200 20 20 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d             # Jum
22210 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f  p back to the Go
22220 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  sub.    **.    *
22230 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65  *       B: <afte
22240 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20  r the loop>.    
22250 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68  **.    */.    Wh
22260 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63  ereClause *pOrWc
22270 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63  ;    /* The OR-c
22280 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74  lause broken out
22290 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
222a0 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  /.    SrcList *p
222b0 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20  OrTab;       /* 
222c0 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20  Shortened table 
222d0 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73  list or OR-claus
222e0 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  e generation */.
222f0 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 20      Index *pCov 
22300 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
22310 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f   /* Potential co
22320 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f 72  vering index (or
22330 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e   NULL) */.    in
22340 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61 72  t iCovCur = pPar
22350 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20  se->nTab++;  /* 
22360 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  Cursor used for 
22370 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66 20  index scans (if 
22380 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74  any) */..    int
22390 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70   regReturn = ++p
223a0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20  Parse->nMem;    
223b0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
223c0 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f  er used with OP_
223d0 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74  Gosub */.    int
223e0 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20   regRowset = 0; 
223f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22400 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
22410 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62  er for RowSet ob
22420 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ject */.    int 
22430 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20  regRowid = 0;   
22440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22450 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
22460 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20  r holding rowid 
22470 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70  */.    int iLoop
22480 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64  Body = sqlite3Vd
22490 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
224a0 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f   /* Start of loo
224b0 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e  p body */.    in
224c0 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20  t iRetInit;     
224d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224e0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
224f0 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20  ss of regReturn 
22500 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  init */.    int 
22510 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20  untestedTerms = 
22520 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
22530 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74  * Some terms not
22540 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74   completely test
22550 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  ed */.    int ii
22560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22580 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
22590 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64 45 78      Expr *pAndEx
225a0 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pr = 0;         
225b0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e         /* An "..
225c0 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70 72   AND (...)" expr
225d0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a 20 20  ession */.   .  
225e0 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d    pTerm = pLoop-
225f0 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20  >aLTerm[0];.    
22600 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
22610 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
22620 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
22630 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20   & WO_OR );.    
22640 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
22650 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
22660 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20  RINFO)!=0 );.   
22670 20 70 4f 72 57 63 20 3d 20 26 70 54 65 72 6d 2d   pOrWc = &pTerm-
22680 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  >u.pOrInfo->wc;.
22690 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
226a0 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20   OP_Return;.    
226b0 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67  pLevel->p1 = reg
226c0 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20  Return;..    /* 
226d0 53 65 74 20 75 70 20 61 20 6e 65 77 20 53 72 63  Set up a new Src
226e0 4c 69 73 74 20 69 6e 20 70 4f 72 54 61 62 20 63  List in pOrTab c
226f0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
22700 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e 65  ble being scanne
22710 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73  d.    ** by this
22720 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b 30   loop in the a[0
22730 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e  ] slot and all n
22740 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 69  otReady tables i
22750 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a  n a[1..] slots..
22760 20 20 20 20 2a 2a 20 54 68 69 73 20 62 65 63 6f      ** This beco
22770 6d 65 73 20 74 68 65 20 53 72 63 4c 69 73 74 20  mes the SrcList 
22780 69 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65  in the recursive
22790 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
227a0 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20  WhereBegin()..  
227b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 49    */.    if( pWI
227c0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b  nfo->nLevel>1 ){
227d0 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52  .      int nNotR
227e0 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20  eady;           
227f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
22800 62 65 72 20 6f 66 20 6e 6f 74 52 65 61 64 79 20  ber of notReady 
22810 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20  tables */.      
22820 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
22830 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20 20  tem *origSrc;   
22840 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69    /* Original li
22850 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
22860 20 20 20 20 20 20 6e 4e 6f 74 52 65 61 64 79 20        nNotReady 
22870 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
22880 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20   - iLevel - 1;. 
22890 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 73 71       pOrTab = sq
228a0 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52  lite3StackAllocR
228b0 61 77 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20  aw(db,.         
228c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228d0 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f 72 54 61     sizeof(*pOrTa
228e0 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79 2a 73 69  b)+ nNotReady*si
228f0 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 30  zeof(pOrTab->a[0
22900 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ]));.      if( p
22910 4f 72 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72  OrTab==0 ) retur
22920 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20 20 20 20  n notReady;.    
22930 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63    pOrTab->nAlloc
22940 20 3d 20 28 75 38 29 28 6e 4e 6f 74 52 65 61 64   = (u8)(nNotRead
22950 79 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 70 4f  y + 1);.      pO
22960 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72  rTab->nSrc = pOr
22970 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20  Tab->nAlloc;.   
22980 20 20 20 6d 65 6d 63 70 79 28 70 4f 72 54 61 62     memcpy(pOrTab
22990 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c 20 73  ->a, pTabItem, s
229a0 69 7a 65 6f 66 28 2a 70 54 61 62 49 74 65 6d 29  izeof(*pTabItem)
229b0 29 3b 0a 20 20 20 20 20 20 6f 72 69 67 53 72 63  );.      origSrc
229c0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
229d0 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f  ist->a;.      fo
229e0 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65  r(k=1; k<=nNotRe
229f0 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  ady; k++){.     
22a00 20 20 20 6d 65 6d 63 70 79 28 26 70 4f 72 54 61     memcpy(&pOrTa
22a10 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72  b->a[k], &origSr
22a20 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f  c[pLevel[k].iFro
22a30 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72 54 61  m], sizeof(pOrTa
22a40 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20  b->a[k]));.     
22a50 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
22a60 20 20 20 20 70 4f 72 54 61 62 20 3d 20 70 57 49      pOrTab = pWI
22a70 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
22a80 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69     }..    /* Ini
22a90 74 69 61 6c 69 7a 65 20 74 68 65 20 72 6f 77 73  tialize the rows
22aa0 65 74 20 72 65 67 69 73 74 65 72 20 74 6f 20 63  et register to c
22ab0 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20  ontain NULL. An 
22ac0 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20  SQL NULL is .   
22ad0 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74   ** equivalent t
22ae0 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f 77 73 65  o an empty rowse
22af0 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
22b00 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65   Also initialize
22b10 20 72 65 67 52 65 74 75 72 6e 20 74 6f 20 63 6f   regReturn to co
22b20 6e 74 61 69 6e 20 74 68 65 20 61 64 64 72 65 73  ntain the addres
22b30 73 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75 63  s of the instruc
22b40 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d  tion .    ** imm
22b50 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
22b60 6e 67 20 74 68 65 20 4f 50 5f 52 65 74 75 72 6e  ng the OP_Return
22b70 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
22b80 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73  f the loop. This
22b90 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69  .    ** is requi
22ba0 72 65 64 20 69 6e 20 61 20 66 65 77 20 6f 62 73  red in a few obs
22bb0 63 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63  cure LEFT JOIN c
22bc0 61 73 65 73 20 77 68 65 72 65 20 63 6f 6e 74 72  ases where contr
22bd0 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20  ol jumps.    ** 
22be0 6f 76 65 72 20 74 68 65 20 74 6f 70 20 6f 66 20  over the top of 
22bf0 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68  the loop into th
22c00 65 20 62 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e  e body of it. In
22c10 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
22c20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 72      ** correct r
22c30 65 73 70 6f 6e 73 65 20 66 6f 72 20 74 68 65 20  esponse for the 
22c40 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65  end-of-loop code
22c50 20 28 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 29   (the OP_Return)
22c60 20 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66   is to .    ** f
22c70 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
22c80 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
22c90 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e 20  ion, just as an 
22ca0 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20 69 66 0a  OP_Next does if.
22cb0 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e      ** called on
22cc0 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   an uninitialize
22cd0 64 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f  d cursor..    */
22ce0 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f  .    if( (pWInfo
22cf0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
22d00 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f  HERE_DUPLICATES_
22d10 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OK)==0 ){.      
22d20 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50  regRowset = ++pP
22d30 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
22d40 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70    regRowid = ++p
22d50 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
22d60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22d70 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
22d80 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a   0, regRowset);.
22d90 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49 6e      }.    iRetIn
22da0 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  it = sqlite3Vdbe
22db0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
22dc0 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74 75  eger, 0, regRetu
22dd0 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  rn);..    /* If 
22de0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45  the original WHE
22df0 52 45 20 63 6c 61 75 73 65 20 69 73 20 7a 20 6f  RE clause is z o
22e00 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 28 78 31  f the form:  (x1
22e10 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41   OR x2 OR ...) A
22e20 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e  ND y.    ** Then
22e30 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20   for every term 
22e40 78 4e 2c 20 65 76 61 6c 75 61 74 65 20 61 73 20  xN, evaluate as 
22e50 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
22e60 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20  n: xN AND z.    
22e70 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 74 65 72  ** That way, ter
22e80 6d 73 20 69 6e 20 79 20 74 68 61 74 20 61 72 65  ms in y that are
22e90 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f 20 74   factored into t
22ea0 68 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77  he disjunction w
22eb0 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 69  ill.    ** be pi
22ec0 63 6b 65 64 20 75 70 20 62 79 20 74 68 65 20 72  cked up by the r
22ed0 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74  ecursive calls t
22ee0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
22ef0 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20  gin() below..   
22f00 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74 75 61   **.    ** Actua
22f10 6c 6c 79 2c 20 65 61 63 68 20 73 75 62 65 78 70  lly, each subexp
22f20 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65  ression is conve
22f30 72 74 65 64 20 74 6f 20 22 78 4e 20 41 4e 44 20  rted to "xN AND 
22f40 77 22 20 77 68 65 72 65 20 77 20 69 73 0a 20 20  w" where w is.  
22f50 20 20 2a 2a 20 74 68 65 20 22 69 6e 74 65 72 65    ** the "intere
22f60 73 74 69 6e 67 22 20 74 65 72 6d 73 20 6f 66 20  sting" terms of 
22f70 7a 20 2d 20 74 65 72 6d 73 20 74 68 61 74 20 64  z - terms that d
22f80 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65  id not originate
22f90 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f   in the.    ** O
22fa0 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
22fb0 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
22fc0 2c 20 61 6e 64 20 74 65 72 6d 73 20 74 68 61 74  , and terms that
22fd0 20 61 72 65 20 75 73 61 62 6c 65 20 61 73 20 0a   are usable as .
22fe0 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a      ** indices..
22ff0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
23000 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
23010 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70 6c 69 65  also only applie
23020 73 20 69 66 20 74 68 65 20 28 78 31 20 4f 52 20  s if the (x1 OR 
23030 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65 72 6d 0a  x2 OR ...) term.
23040 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f      ** is not co
23050 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 4f  ntained in the O
23060 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45  N clause of a LE
23070 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20  FT JOIN..    ** 
23080 53 65 65 20 74 69 63 6b 65 74 20 68 74 74 70 3a  See ticket http:
23090 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67  //www.sqlite.org
230a0 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33 36 39 33  /src/info/f23693
230b0 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20 20 20 20  04e4.    */.    
230c0 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31  if( pWC->nTerm>1
230d0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54   ){.      int iT
230e0 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  erm;.      for(i
230f0 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57  Term=0; iTerm<pW
23100 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b  C->nTerm; iTerm+
23110 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
23120 20 2a 70 45 78 70 72 20 3d 20 70 57 43 2d 3e 61   *pExpr = pWC->a
23130 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20  [iTerm].pExpr;. 
23140 20 20 20 20 20 20 20 69 66 28 20 26 70 57 43 2d         if( &pWC-
23150 3e 61 5b 69 54 65 72 6d 5d 20 3d 3d 20 70 54 65  >a[iTerm] == pTe
23160 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  rm ) continue;. 
23170 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
23180 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
23190 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
231a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
231b0 20 20 20 69 66 28 20 70 57 43 2d 3e 61 5b 69 54     if( pWC->a[iT
231c0 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 28  erm].wtFlags & (
231d0 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 20 29 20 63  TERM_ORINFO) ) c
231e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
231f0 20 69 66 28 20 28 70 57 43 2d 3e 61 5b 69 54 65   if( (pWC->a[iTe
23200 72 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm].eOperator & 
23210 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e  WO_ALL)==0 ) con
23220 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70  tinue;.        p
23230 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
23240 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c  prDup(db, pExpr,
23250 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e   0);.        pAn
23260 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  dExpr = sqlite3E
23270 78 70 72 41 6e 64 28 64 62 2c 20 70 41 6e 64 45  xprAnd(db, pAndE
23280 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  xpr, pExpr);.   
23290 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
232a0 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20  AndExpr ){.     
232b0 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71     pAndExpr = sq
232c0 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
232d0 65 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41  e, TK_AND, 0, pA
232e0 6e 64 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  ndExpr, 0);.    
232f0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
23300 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57  or(ii=0; ii<pOrW
23310 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b  c->nTerm; ii++){
23320 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
23330 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72   *pOrTerm = &pOr
23340 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20  Wc->a[ii];.     
23350 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
23360 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c  ftCursor==iCur |
23370 7c 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  | (pOrTerm->eOpe
23380 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21  rator & WO_AND)!
23390 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68  =0 ){.        Wh
233a0 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e  ereInfo *pSubWIn
233b0 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fo;          /* 
233c0 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20  Info for single 
233d0 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a  OR-term scan */.
233e0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4f          Expr *pO
233f0 72 45 78 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d  rExpr = pOrTerm-
23400 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
23410 69 66 28 20 70 41 6e 64 45 78 70 72 20 26 26 20  if( pAndExpr && 
23420 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
23430 28 70 4f 72 45 78 70 72 2c 20 45 50 5f 46 72 6f  (pOrExpr, EP_Fro
23440 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
23450 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c      pAndExpr->pL
23460 65 66 74 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20  eft = pOrExpr;. 
23470 20 20 20 20 20 20 20 20 20 70 4f 72 45 78 70 72           pOrExpr
23480 20 3d 20 70 41 6e 64 45 78 70 72 3b 0a 20 20 20   = pAndExpr;.   
23490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
234a0 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  * Loop through t
234b0 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61  able entries tha
234c0 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72  t match term pOr
234d0 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20  Term. */.       
234e0 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c   pSubWInfo = sql
234f0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
23500 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70  Parse, pOrTab, p
23510 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20  OrExpr, 0, 0,.  
23520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23530 20 20 20 20 20 20 57 48 45 52 45 5f 4f 4d 49 54        WHERE_OMIT
23540 5f 4f 50 45 4e 5f 43 4c 4f 53 45 20 7c 20 57 48  _OPEN_CLOSE | WH
23550 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 7c 0a 20  ERE_AND_ONLY |. 
23560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23570 20 20 20 20 20 20 20 57 48 45 52 45 5f 46 4f 52         WHERE_FOR
23580 43 45 5f 54 41 42 4c 45 20 7c 20 57 48 45 52 45  CE_TABLE | WHERE
23590 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 2c 20  _ONETABLE_ONLY, 
235a0 69 43 6f 76 43 75 72 29 3b 0a 20 20 20 20 20 20  iCovCur);.      
235b0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 57 49    assert( pSubWI
235c0 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  nfo || pParse->n
235d0 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
235e0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
235f0 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
23600 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68   ){.          Wh
23610 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f  ereLoop *pSubLoo
23620 70 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70  p;.          exp
23630 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20  lainOneScan(.   
23640 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
23650 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62  e, pOrTab, &pSub
23660 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65  WInfo->a[0], iLe
23670 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72  vel, pLevel->iFr
23680 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20  om, 0.          
23690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
236a0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
236b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50  lags & WHERE_DUP
236c0 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29  LICATES_OK)==0 )
236d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
236e0 74 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70  t iSet = ((ii==p
236f0 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d  OrWc->nTerm-1)?-
23700 31 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20  1:ii);.         
23710 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20     int r;.      
23720 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65        r = sqlite
23730 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
23740 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 49  mn(pParse, pTabI
23750 74 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69  tem->pTab, -1, i
23760 43 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Cur, .          
23770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
23790 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20  egRowid, 0);.   
237a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
237b0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
237c0 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20   OP_RowSetTest, 
237d0 72 65 67 52 6f 77 73 65 74 2c 0a 20 20 20 20 20  regRowset,.     
237e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
23800 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
23810 64 72 28 76 29 2b 32 2c 20 72 2c 20 69 53 65 74  dr(v)+2, r, iSet
23820 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
23830 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23840 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
23850 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72  _Gosub, regRetur
23860 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a  n, iLoopBody);..
23870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
23880 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65   pSubWInfo->unte
23890 73 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d  stedTerms flag m
238a0 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f  eans that this O
238b0 52 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20  R term.         
238c0 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e   ** contained on
238d0 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65  e or more AND te
238e0 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61  rm from a notRea
238f0 64 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20  dy table.  The. 
23900 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d           ** term
23910 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65  s from the notRe
23920 61 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20  ady table could 
23930 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 61 6e  not be tested an
23940 64 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20  d will.         
23950 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74   ** need to be t
23960 65 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20  ested later..   
23970 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
23980 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66      if( pSubWInf
23990 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
239a0 20 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73   ) untestedTerms
239b0 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20   = 1;..         
239c0 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68   /* If all of th
239d0 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74  e OR-connected t
239e0 65 72 6d 73 20 61 72 65 20 6f 70 74 69 6d 69 7a  erms are optimiz
239f0 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
23a00 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  e.          ** i
23a10 6e 64 65 78 2c 20 61 6e 64 20 74 68 65 20 69 6e  ndex, and the in
23a20 64 65 78 20 69 73 20 6f 70 65 6e 65 64 20 75 73  dex is opened us
23a30 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 75 72  ing the same cur
23a40 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  sor number.     
23a50 20 20 20 20 20 2a 2a 20 62 79 20 65 61 63 68 20       ** by each 
23a60 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
23a70 68 65 72 65 42 65 67 69 6e 28 29 20 6d 61 64 65  hereBegin() made
23a80 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69   by this loop, i
23a90 74 20 6d 61 79 0a 20 20 20 20 20 20 20 20 20 20  t may.          
23aa0 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ** be possible t
23ab0 6f 20 75 73 65 20 74 68 61 74 20 69 6e 64 65 78  o use that index
23ac0 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69   as a covering i
23ad0 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20  ndex..          
23ae0 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
23af0 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  If the call to s
23b00 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
23b10 28 29 20 61 62 6f 76 65 20 72 65 73 75 6c 74 65  () above resulte
23b20 64 20 69 6e 20 61 20 73 63 61 6e 20 74 68 61 74  d in a scan that
23b30 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73  .          ** us
23b40 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64  es an index, and
23b50 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20   this is either 
23b60 74 68 65 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e  the first OR-con
23b70 6e 65 63 74 65 64 20 74 65 72 6d 0a 20 20 20 20  nected term.    
23b80 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
23b90 65 64 20 6f 72 20 74 68 65 20 69 6e 64 65 78 20  ed or the index 
23ba0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
23bb0 68 61 74 20 75 73 65 64 20 62 79 20 61 6c 6c 20  hat used by all 
23bc0 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20  previous.       
23bd0 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74     ** terms, set
23be0 20 70 43 6f 76 20 74 6f 20 74 68 65 20 63 61 6e   pCov to the can
23bf0 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20  didate covering 
23c00 69 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73 65  index. Otherwise
23c10 2c 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 20  , set .         
23c20 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c   ** pCov to NULL
23c30 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
23c40 74 20 6e 6f 20 63 61 6e 64 69 64 61 74 65 20 63  t no candidate c
23c50 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 77 69  overing index wi
23c60 6c 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ll .          **
23c70 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20   be available.. 
23c80 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
23c90 20 20 20 20 20 20 70 53 75 62 4c 6f 6f 70 20 3d        pSubLoop =
23ca0 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d   pSubWInfo->a[0]
23cb0 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  .pWLoop;.       
23cc0 20 20 20 61 73 73 65 72 74 28 20 28 70 53 75 62     assert( (pSub
23cd0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
23ce0 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
23cf0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
23d00 20 20 69 66 28 20 28 70 53 75 62 4c 6f 6f 70 2d    if( (pSubLoop-
23d10 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
23d20 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20  _INDEXED)!=0.   
23d30 20 20 20 20 20 20 20 20 26 26 20 28 69 69 3d 3d          && (ii==
23d40 30 20 7c 7c 20 70 53 75 62 4c 6f 6f 70 2d 3e 75  0 || pSubLoop->u
23d50 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70  .btree.pIndex==p
23d60 43 6f 76 29 0a 20 20 20 20 20 20 20 20 20 20 29  Cov).          )
23d70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
23d80 73 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f 2d  sert( pSubWInfo-
23d90 3e 61 5b 30 5d 2e 69 49 64 78 43 75 72 3d 3d 69  >a[0].iIdxCur==i
23da0 43 6f 76 43 75 72 20 29 3b 0a 20 20 20 20 20 20  CovCur );.      
23db0 20 20 20 20 20 20 70 43 6f 76 20 3d 20 70 53 75        pCov = pSu
23dc0 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  bLoop->u.btree.p
23dd0 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20  Index;.         
23de0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23df0 20 20 20 20 70 43 6f 76 20 3d 20 30 3b 0a 20 20      pCov = 0;.  
23e00 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
23e10 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 20 74       /* Finish t
23e20 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20  he loop through 
23e30 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68  table entries th
23e40 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f  at match term pO
23e50 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20  rTerm. */.      
23e60 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
23e70 45 6e 64 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a  End(pSubWInfo);.
23e80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23e90 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76  }.    }.    pLev
23ea0 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 20 3d 20  el->u.pCovidx = 
23eb0 70 43 6f 76 3b 0a 20 20 20 20 69 66 28 20 70 43  pCov;.    if( pC
23ec0 6f 76 20 29 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ov ) pLevel->iId
23ed0 78 43 75 72 20 3d 20 69 43 6f 76 43 75 72 3b 0a  xCur = iCovCur;.
23ee0 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72      if( pAndExpr
23ef0 20 29 7b 0a 20 20 20 20 20 20 70 41 6e 64 45 78   ){.      pAndEx
23f00 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20  pr->pLeft = 0;. 
23f10 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
23f20 44 65 6c 65 74 65 28 64 62 2c 20 70 41 6e 64 45  Delete(db, pAndE
23f30 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xpr);.    }.    
23f40 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
23f50 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69 74 2c  eP1(v, iRetInit,
23f60 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
23f70 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20  entAddr(v));.   
23f80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23f90 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
23fa0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
23fb0 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  k);.    sqlite3V
23fc0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
23fd0 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a  v, iLoopBody);..
23fe0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
23ff0 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69 74  nLevel>1 ) sqlit
24000 65 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c 20  e3StackFree(db, 
24010 70 4f 72 54 61 62 29 3b 0a 20 20 20 20 69 66 28  pOrTab);.    if(
24020 20 21 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20   !untestedTerms 
24030 29 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c  ) disableTerm(pL
24040 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20  evel, pTerm);.  
24050 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
24060 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
24070 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
24080 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20    {.    /* Case 
24090 36 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  6:  There is no 
240a0 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57  usable index.  W
240b0 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70  e must do a comp
240c0 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  lete.    **     
240d0 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65       scan of the
240e0 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20   entire table.. 
240f0 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63     */.    static
24100 20 63 6f 6e 73 74 20 75 38 20 61 53 74 65 70 5b   const u8 aStep[
24110 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f  ] = { OP_Next, O
24120 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20 73 74  P_Prev };.    st
24130 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
24140 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65  tart[] = { OP_Re
24150 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b  wind, OP_Last };
24160 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 52 65  .    assert( bRe
24170 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20  v==0 || bRev==1 
24180 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
24190 70 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b  p = aStep[bRev];
241a0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
241b0 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76  = iCur;.    pLev
241c0 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c  el->p2 = 1 + sql
241d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
241e0 2c 20 61 53 74 61 72 74 5b 62 52 65 76 5d 2c 20  , aStart[bRev], 
241f0 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a  iCur, addrBrk);.
24200 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d      pLevel->p5 =
24210 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
24220 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
24230 3b 0a 20 20 7d 0a 20 20 6e 65 77 4e 6f 74 52 65  ;.  }.  newNotRe
24240 61 64 79 20 3d 20 6e 6f 74 52 65 61 64 79 20 26  ady = notReady &
24250 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66   ~getMask(&pWInf
24260 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75  o->sMaskSet, iCu
24270 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74  r);..  /* Insert
24280 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76   code to test ev
24290 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69 6f  ery subexpressio
242a0 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f  n that can be co
242b0 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f  mpletely.  ** co
242c0 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68 65  mputed using the
242d0 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20   current set of 
242e0 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66  tables..  */.  f
242f0 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
24300 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a   j=pWC->nTerm; j
24310 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b  >0; j--, pTerm++
24320 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b  ){.    Expr *pE;
24330 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
24340 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
24350 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
24360 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
24370 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
24380 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20  ERM_CODED );.   
24390 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
243a0 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
243b0 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
243c0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
243d0 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
243e0 65 71 41 6c 6c 20 26 20 6e 65 77 4e 6f 74 52 65  eqAll & newNotRe
243f0 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ady)!=0 ){.     
24400 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66   testcase( pWInf
24410 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
24420 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
24430 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
24440 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
24450 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
24460 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49  !=0 );.      pWI
24470 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
24480 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f  ms = 1;.      co
24490 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
244a0 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45    pE = pTerm->pE
244b0 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
244c0 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 69 66   pE!=0 );.    if
244d0 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
244e0 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61 73 50  oin && !ExprHasP
244f0 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
24500 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
24510 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
24520 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
24530 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
24540 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53   pE, addrCont, S
24550 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
24560 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  );.    pTerm->wt
24570 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
24580 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  DED;.  }..  /* I
24590 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65  nsert code to te
245a0 73 74 20 66 6f 72 20 69 6d 70 6c 69 65 64 20 63  st for implied c
245b0 6f 6e 73 74 72 61 69 6e 74 73 20 62 61 73 65 64  onstraints based
245c0 20 6f 6e 20 74 72 61 6e 73 69 74 69 76 69 74 79   on transitivity
245d0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 22 3d 3d  .  ** of the "==
245e0 22 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a  " operator..  **
245f0 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 49  .  ** Example: I
24600 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
24610 73 65 20 63 6f 6e 74 61 69 6e 73 20 22 74 31 2e  se contains "t1.
24620 61 3d 74 32 2e 62 22 20 61 6e 64 20 22 74 32 2e  a=t2.b" and "t2.
24630 62 3d 31 32 33 22 0a 20 20 2a 2a 20 61 6e 64 20  b=123".  ** and 
24640 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 74 68  we are coding th
24650 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 74 68  e t1 loop and th
24660 65 20 74 32 20 6c 6f 6f 70 20 68 61 73 20 6e 6f  e t2 loop has no
24670 74 20 79 65 74 20 63 6f 64 65 64 2c 0a 20 20 2a  t yet coded,.  *
24680 2a 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74  * then we cannot
24690 20 75 73 65 20 74 68 65 20 22 74 31 2e 61 3d 74   use the "t1.a=t
246a0 32 2e 62 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c  2.b" constraint,
246b0 20 62 75 74 20 77 65 20 63 61 6e 20 63 6f 64 65   but we can code
246c0 0a 20 20 2a 2a 20 74 68 65 20 69 6d 70 6c 69 65  .  ** the implie
246d0 64 20 22 74 31 2e 61 3d 31 32 33 22 20 63 6f 6e  d "t1.a=123" con
246e0 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20  straint..  */.  
246f0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
24700 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , j=pWC->nTerm; 
24710 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b  j>0; j--, pTerm+
24720 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
24730 2c 20 2a 70 45 41 6c 74 3b 0a 20 20 20 20 57 68  , *pEAlt;.    Wh
24740 65 72 65 54 65 72 6d 20 2a 70 41 6c 74 3b 0a 20  ereTerm *pAlt;. 
24750 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
24760 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
24770 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
24780 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
24790 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
247a0 65 72 61 74 6f 72 21 3d 28 57 4f 5f 45 51 55 49  erator!=(WO_EQUI
247b0 56 7c 57 4f 5f 45 51 29 20 29 20 63 6f 6e 74 69  V|WO_EQ) ) conti
247c0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
247d0 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rm->leftCursor!=
247e0 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
247f0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
24800 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 20 63 6f 6e  >iLeftJoin ) con
24810 74 69 6e 75 65 3b 0a 20 20 20 20 70 45 20 3d 20  tinue;.    pE = 
24820 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
24830 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
24840 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
24850 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20  P_FromJoin) );. 
24860 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
24870 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
24880 20 6e 65 77 4e 6f 74 52 65 61 64 79 29 21 3d 30   newNotReady)!=0
24890 20 29 3b 0a 20 20 20 20 70 41 6c 74 20 3d 20 66   );.    pAlt = f
248a0 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
248b0 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  r, pTerm->u.left
248c0 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61 64 79  Column, notReady
248d0 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30  , WO_EQ|WO_IN, 0
248e0 29 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74 3d  );.    if( pAlt=
248f0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
24900 20 20 20 69 66 28 20 70 41 6c 74 2d 3e 77 74 46     if( pAlt->wtF
24910 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 44  lags & (TERM_COD
24920 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
24930 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41      testcase( pA
24940 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  lt->eOperator & 
24950 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 74 65 73  WO_EQ );.    tes
24960 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70  tcase( pAlt->eOp
24970 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
24980 3b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  ;.    VdbeNoopCo
24990 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e  mment((v, "begin
249a0 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73   transitive cons
249b0 74 72 61 69 6e 74 22 29 29 3b 0a 20 20 20 20 70  traint"));.    p
249c0 45 41 6c 74 20 3d 20 73 71 6c 69 74 65 33 53 74  EAlt = sqlite3St
249d0 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c 20  ackAllocRaw(db, 
249e0 73 69 7a 65 6f 66 28 2a 70 45 41 6c 74 29 29 3b  sizeof(*pEAlt));
249f0 0a 20 20 20 20 69 66 28 20 70 45 41 6c 74 20 29  .    if( pEAlt )
24a00 7b 0a 20 20 20 20 20 20 2a 70 45 41 6c 74 20 3d  {.      *pEAlt =
24a10 20 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20   *pAlt->pExpr;. 
24a20 20 20 20 20 20 70 45 41 6c 74 2d 3e 70 4c 65 66       pEAlt->pLef
24a30 74 20 3d 20 70 45 2d 3e 70 4c 65 66 74 3b 0a 20  t = pE->pLeft;. 
24a40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
24a50 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
24a60 70 45 41 6c 74 2c 20 61 64 64 72 43 6f 6e 74 2c  pEAlt, addrCont,
24a70 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
24a80 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
24a90 65 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c 20  e3StackFree(db, 
24aa0 70 45 41 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pEAlt);.    }.  
24ab0 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45  }..  /* For a LE
24ac0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67  FT OUTER JOIN, g
24ad0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
24ae0 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68  t will record th
24af0 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a  e fact that.  **
24b00 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f   at least one ro
24b10 77 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  w of the right t
24b20 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64  able has matched
24b30 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e   the left table.
24b40 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c    .  */.  if( pL
24b50 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
24b60 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  ){.    pLevel->a
24b70 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74  ddrFirst = sqlit
24b80 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
24b90 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
24ba0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
24bb0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c  P_Integer, 1, pL
24bc0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
24bd0 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
24be0 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45  t((v, "record LE
24bf0 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a  FT JOIN hit"));.
24c00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
24c10 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
24c20 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  );.    for(pTerm
24c30 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c  =pWC->a, j=0; j<
24c40 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c  pWC->nTerm; j++,
24c50 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
24c60 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
24c70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
24c80 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
24c90 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
24ca0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
24cb0 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20  M_CODED );.     
24cc0 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
24cd0 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
24ce0 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
24cf0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
24d00 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
24d10 65 72 65 71 41 6c 6c 20 26 20 6e 65 77 4e 6f 74  ereqAll & newNot
24d20 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20  Ready)!=0 ){.   
24d30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49       assert( pWI
24d40 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
24d50 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ms );.        co
24d60 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
24d70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
24d80 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  erm->pExpr );.  
24d90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
24da0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
24db0 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64 64  Term->pExpr, add
24dc0 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55  rCont, SQLITE_JU
24dd0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
24de0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
24df0 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
24e00 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
24e10 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
24e20 28 70 50 61 72 73 65 2c 20 69 52 65 6c 65 61 73  (pParse, iReleas
24e30 65 52 65 67 29 3b 0a 0a 20 20 72 65 74 75 72 6e  eReg);..  return
24e40 20 6e 65 77 4e 6f 74 52 65 61 64 79 3b 0a 7d 0a   newNotReady;.}.
24e50 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
24e60 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a  CE_ENABLED./*.**
24e70 20 50 72 69 6e 74 20 61 20 57 68 65 72 65 4c 6f   Print a WhereLo
24e80 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20 64 65  op object for de
24e90 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65 73  bugging purposes
24ea0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
24eb0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 57  whereLoopPrint(W
24ec0 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 53 72 63  hereLoop *p, Src
24ed0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 29 7b  List *pTabList){
24ee0 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70  .  int nb = 1+(p
24ef0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 37 29  TabList->nSrc+7)
24f00 2f 38 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  /8;.  struct Src
24f10 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
24f20 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b   = pTabList->a +
24f30 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c   p->iTab;.  Tabl
24f40 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  e *pTab = pItem-
24f50 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  >pTab;.  sqlite3
24f60 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 63 25  DebugPrintf("%c%
24f70 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78  2d.%0*llx.%0*llx
24f80 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20  ", p->cId,.     
24f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fa0 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e  p->iTab, nb, p->
24fb0 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d  maskSelf, nb, p-
24fc0 3e 70 72 65 72 65 71 29 3b 0a 20 20 73 71 6c 69  >prereq);.  sqli
24fd0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24fe0 20 25 31 32 73 22 2c 0a 20 20 20 20 20 20 20 20   %12s",.        
24ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
25000 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74  em->zAlias ? pIt
25010 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61  em->zAlias : pTa
25020 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b->zName);.  if(
25030 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
25040 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
25050 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  E)==0 ){.    if(
25060 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
25070 65 78 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ex ){.      cons
25080 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
25090 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
250a0 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  x->zName;.      
250b0 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 7a  if( zName==0 ) z
250c0 4e 61 6d 65 20 3d 20 22 69 70 6b 22 3b 0a 20 20  Name = "ipk";.  
250d0 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
250e0 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61  zName, "sqlite_a
250f0 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d  utoindex_", 17)=
25100 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
25110 74 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t i = sqlite3Str
25120 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31  len30(zName) - 1
25130 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
25140 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29   zName[i]!='_' )
25150 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e   i--;.        zN
25160 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20  ame += i;.      
25170 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  }.      sqlite3D
25180 65 62 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31  ebugPrintf(".%-1
25190 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20  6s %2d", zName, 
251a0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b  p->u.btree.nEq);
251b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
251c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
251d0 69 6e 74 66 28 22 25 32 30 73 22 2c 22 22 29 3b  intf("%20s","");
251e0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
251f0 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
25200 20 69 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69   if( p->u.vtab.i
25210 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a  dxStr ){.      z
25220 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
25230 74 66 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25  tf("(%d,\"%s\",%
25240 78 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  x)",.           
25250 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69       p->u.vtab.i
25260 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62  dxNum, p->u.vtab
25270 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74  .idxStr, p->u.vt
25280 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20  ab.omitMask);.  
25290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
252a0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
252b0 74 66 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d  tf("(%d,%x)", p-
252c0 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
252d0 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
252e0 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  sk);.    }.    s
252f0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25300 66 28 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a  f(" %-19s", z);.
25310 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
25320 28 7a 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (z);.  }.  sqlit
25330 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
25340 66 20 25 30 34 78 20 4e 20 25 64 22 2c 20 70 2d  f %04x N %d", p-
25350 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54  >wsFlags, p->nLT
25360 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  erm);.  sqlite3D
25370 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f 73  ebugPrintf(" cos
25380 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70  t %d,%d,%d\n", p
25390 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75  ->rSetup, p->rRu
253a0 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 7d 0a 23  n, p->nOut);.}.#
253b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  endif../*.** Con
253c0 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72 79  vert bulk memory
253d0 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 57 68   into a valid Wh
253e0 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63 61 6e  ereLoop that can
253f0 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f   be passed.** to
25400 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 20   whereLoopClear 
25410 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73  harmlessly..*/.s
25420 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
25430 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65 4c 6f  LoopInit(WhereLo
25440 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c 54  op *p){.  p->aLT
25450 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 53  erm = p->aLTermS
25460 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72  pace;.  p->nLTer
25470 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c  m = 0;.  p->nLSl
25480 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70  ot = ArraySize(p
25490 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3b 0a  ->aLTermSpace);.
254a0 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30    p->wsFlags = 0
254b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
254c0 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 75   the WhereLoop.u
254d0 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20 57   union.  Leave W
254e0 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20  hereLoop.pLTerm 
254f0 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  intact..*/.stati
25500 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
25510 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69 74  ClearUnion(sqlit
25520 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
25530 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  p *p){.  if( p->
25540 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
25550 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c 57 48  _VIRTUALTABLE|WH
25560 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20  ERE_AUTO_INDEX) 
25570 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77  ){.    if( (p->w
25580 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
25590 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
255a0 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  && p->u.vtab.nee
255b0 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 73  dFree ){.      s
255c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 75  qlite3_free(p->u
255d0 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20  .vtab.idxStr);. 
255e0 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 6e       p->u.vtab.n
255f0 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  eedFree = 0;.   
25600 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78     p->u.vtab.idx
25610 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Str = 0;.    }el
25620 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  se if( (p->wsFla
25630 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
25640 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 2d 3e  INDEX)!=0 && p->
25650 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d  u.btree.pIndex!=
25660 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
25670 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
25680 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
25690 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20 20  zColAff);.      
256a0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
256b0 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  , p->u.btree.pIn
256c0 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75  dex);.      p->u
256d0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
256e0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
256f0 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
25700 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72 79   internal memory
25710 20 75 73 65 64 20 62 79 20 61 20 57 68 65 72 65   used by a Where
25720 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  Loop object.*/.s
25730 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
25740 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74 65  LoopClear(sqlite
25750 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
25760 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61   *p){.  if( p->a
25770 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d  LTerm!=p->aLTerm
25780 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33 44  Space ) sqlite3D
25790 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54  bFree(db, p->aLT
257a0 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  erm);.  whereLoo
257b0 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20  pClearUnion(db, 
257c0 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49  p);.  whereLoopI
257d0 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nit(p);.}../*.**
257e0 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6d 65   Increase the me
257f0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
25800 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  for pLoop->aLTer
25810 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c 65 61  m[] to be at lea
25820 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  st n..*/.static 
25830 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  int whereLoopRes
25840 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ize(sqlite3 *db,
25850 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 69   WhereLoop *p, i
25860 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65 54 65  nt n){.  WhereTe
25870 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69 66  rm **paNew;.  if
25880 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29  ( p->nLSlot>=n )
25890 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
258a0 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26 7e  K;.  n = (n+7)&~
258b0 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73 71 6c  7;.  paNew = sql
258c0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
258d0 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  db, sizeof(p->aL
258e0 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69  Term[0])*n);.  i
258f0 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65  f( paNew==0 ) re
25900 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
25910 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65  M;.  memcpy(paNe
25920 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69  w, p->aLTerm, si
25930 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30  zeof(p->aLTerm[0
25940 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20  ])*p->nLSlot);. 
25950 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
25960 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
25970 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
25980 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
25990 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61 4e   p->aLTerm = paN
259a0 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20  ew;.  p->nLSlot 
259b0 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = n;.  return SQ
259c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
259d0 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74 65  * Transfer conte
259e0 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  nt from the seco
259f0 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74 68  nd pLoop into th
25a00 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74  e first..*/.stat
25a10 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
25a20 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62  Xfer(sqlite3 *db
25a30 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f  , WhereLoop *pTo
25a40 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46 72  , WhereLoop *pFr
25a50 6f 6d 29 7b 0a 20 20 69 66 28 20 77 68 65 72 65  om){.  if( where
25a60 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
25a70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72  To, pFrom->nLTer
25a80 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  m) ) return SQLI
25a90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 77 68 65 72  TE_NOMEM;.  wher
25aa0 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28  eLoopClearUnion(
25ab0 64 62 2c 20 70 54 6f 29 3b 0a 20 20 6d 65 6d 63  db, pTo);.  memc
25ac0 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57  py(pTo, pFrom, W
25ad0 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53  HERE_LOOP_XFER_S
25ae0 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f  Z);.  memcpy(pTo
25af0 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d  ->aLTerm, pFrom-
25b00 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c  >aLTerm, pTo->nL
25b10 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d  Term*sizeof(pTo-
25b20 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20  >aLTerm[0]));.  
25b30 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61  if( pFrom->wsFla
25b40 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
25b50 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 70  ALTABLE ){.    p
25b60 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  From->u.vtab.nee
25b70 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  dFree = 0;.  }el
25b80 73 65 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77  se if( (pFrom->w
25b90 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
25ba0 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b  UTO_INDEX)!=0 ){
25bb0 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74  .    pFrom->u.bt
25bc0 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  ree.pIndex = 0;.
25bd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
25be0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
25bf0 20 44 65 6c 65 74 65 20 61 20 57 68 65 72 65 4c   Delete a WhereL
25c00 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  oop object.*/.st
25c10 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
25c20 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c 69 74 65  oopDelete(sqlite
25c30 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
25c40 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f   *p){.  whereLoo
25c50 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a 20  pClear(db, p);. 
25c60 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
25c70 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
25c80 46 72 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f  Free a WhereInfo
25c90 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74   structure.*/.st
25ca0 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 49  atic void whereI
25cb0 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20  nfoFree(sqlite3 
25cc0 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a  *db, WhereInfo *
25cd0 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41  pWInfo){.  if( A
25ce0 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29 7b  LWAYS(pWInfo) ){
25cf0 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65  .    whereClause
25d00 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73  Clear(&pWInfo->s
25d10 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  WC);.    while( 
25d20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29  pWInfo->pLoops )
25d30 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f  {.      WhereLoo
25d40 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  p *p = pWInfo->p
25d50 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70 57 49  Loops;.      pWI
25d60 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d  nfo->pLoops = p-
25d70 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20  >pNextLoop;.    
25d80 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74    whereLoopDelet
25d90 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  e(db, p);.    }.
25da0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
25db0 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
25dc0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65   }.}../*.** Inse
25dd0 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20 61 20  rt or replace a 
25de0 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20  WhereLoop entry 
25df0 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61  using the templa
25e00 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a  te supplied..**.
25e10 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 57  ** An existing W
25e20 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 6d  hereLoop entry m
25e30 69 67 68 74 20 62 65 20 6f 76 65 72 77 72 69 74  ight be overwrit
25e40 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77 20 74  ten if the new t
25e50 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62 65  emplate.** is be
25e60 74 74 65 72 20 61 6e 64 20 68 61 73 20 66 65 77  tter and has few
25e70 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e  er dependencies.
25e80 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c 61 74    Or the templat
25e90 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65  e will be ignore
25ea0 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73 65  d.** and no inse
25eb0 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20 69 66  rt will occur if
25ec0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   an existing Whe
25ed0 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74 65 72  reLoop is faster
25ee0 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77 65   and has.** fewe
25ef0 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74  r dependencies t
25f00 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65  han the template
25f10 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 20 6e  .  Otherwise a n
25f20 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a  ew WhereLoop is.
25f30 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64 20 6f  ** added based o
25f40 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 0a  n the template..
25f50 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64 65  **.** If pBuilde
25f60 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f 74  r->pOrSet is not
25f70 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20 6f 6e   NULL then we on
25f80 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 6f 6e  ly care about on
25f90 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65 71  ly the.** prereq
25fa0 75 69 73 69 74 65 73 20 61 6e 64 20 72 52 75 6e  uisites and rRun
25fb0 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73 20   and nOut costs 
25fc0 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c 6f  of the N best lo
25fd0 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e  ops.  That.** in
25fe0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61 74  formation is gat
25ff0 68 65 72 65 64 20 69 6e 20 74 68 65 20 70 42 75  hered in the pBu
26000 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62  ilder->pOrSet ob
26010 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70 65 63  ject.  This spec
26020 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e  ial.** processin
26030 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20 6f  g mode is used o
26040 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75 73  nly for OR claus
26050 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
26060 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c  .** When accumul
26070 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c  ating multiple l
26080 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c  oops (when pBuil
26090 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e  der->pOrSet is N
260a0 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c  ULL) we.** still
260b0 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74 65   might overwrite
260c0 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77   similar loops w
260d0 69 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70  ith the new temp
260e0 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 74  late if the.** t
260f0 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65  emplate is bette
26100 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65  r.  Loops may be
26110 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20   overwritten if 
26120 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a  the following .*
26130 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65  * conditions are
26140 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28   met:.**.**    (
26150 31 29 20 20 54 68 65 79 20 68 61 76 65 20 74 68  1)  They have th
26160 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20  e same iTab..** 
26170 20 20 20 28 32 29 20 20 54 68 65 79 20 68 61 76     (2)  They hav
26180 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72 74  e the same iSort
26190 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20  Idx..**    (3)  
261a0 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73  The template has
261b0 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20 64   same or fewer d
261c0 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e  ependencies than
261d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
261e0 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68 65  p.**    (4)  The
261f0 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74 68   template has th
26200 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20  e same or lower 
26210 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63 75  cost than the cu
26220 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20  rrent loop.**   
26230 20 28 35 29 20 20 54 68 65 20 74 65 6d 70 6c 61   (5)  The templa
26240 74 65 20 75 73 65 73 20 6d 6f 72 65 20 74 65 72  te uses more ter
26250 6d 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 69  ms of the same i
26260 6e 64 65 78 20 62 75 74 20 68 61 73 20 6e 6f 20  ndex but has no 
26270 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 20 20  additional.**   
26280 20 20 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69        dependenci
26290 65 73 20 20 20 20 20 20 20 20 20 20 0a 2a 2f 0a  es          .*/.
262a0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
262b0 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65  LoopInsert(Where
262c0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
262d0 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70  ilder, WhereLoop
262e0 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20   *pTemplate){.  
262f0 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72  WhereLoop **ppPr
26300 65 76 2c 20 2a 70 2c 20 2a 70 4e 65 78 74 20 3d  ev, *p, *pNext =
26310 20 30 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   0;.  WhereInfo 
26320 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
26330 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73 71  er->pWInfo;.  sq
26340 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e  lite3 *db = pWIn
26350 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
26360 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64 65  .  /* If pBuilde
26370 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 64 65 66  r->pOrSet is def
26380 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  ined, then only 
26390 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  keep track of th
263a0 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61 6e 64  e costs.  ** and
263b0 20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f 0a 20   prereqs..  */. 
263c0 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 70   if( pBuilder->p
263d0 4f 72 53 65 74 21 3d 30 20 29 7b 0a 23 69 66 20  OrSet!=0 ){.#if 
263e0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
263f0 45 44 0a 20 20 20 20 75 31 36 20 6e 20 3d 20 70  ED.    u16 n = p
26400 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2d  Builder->pOrSet-
26410 3e 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 0a  >n;.    int x =.
26420 23 65 6e 64 69 66 0a 20 20 20 20 77 68 65 72 65  #endif.    where
26430 4f 72 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  OrInsert(pBuilde
26440 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65 6d 70  r->pOrSet, pTemp
26450 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c 20 70 54  late->prereq, pT
26460 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a 20  emplate->rRun,. 
26470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26490 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f     pTemplate->nO
264a0 75 74 29 3b 0a 23 69 66 20 57 48 45 52 45 54 52  ut);.#if WHERETR
264b0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
264c0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
264d0 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
264e0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
264f0 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20 6f 72  gPrintf(x?"   or
26500 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58  -%d:  ":"   or-X
26510 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20  :  ", n);.      
26520 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
26530 54 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e 66 6f  Template, pWInfo
26540 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20  ->pTabList);.   
26550 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65   }.#endif.    re
26560 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26570 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
26580 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
26590 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 6f 76   WhereLoop to ov
265a0 65 72 77 72 69 74 65 2c 20 6f 72 20 77 68 69 63  erwrite, or whic
265b0 68 20 74 61 6b 65 73 0a 20 20 2a 2a 20 70 72 69  h takes.  ** pri
265c0 6f 72 69 74 79 20 6f 76 65 72 20 70 54 65 6d 70  ority over pTemp
265d0 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  late..  */.  for
265e0 28 70 70 50 72 65 76 3d 26 70 57 49 6e 66 6f 2d  (ppPrev=&pWInfo-
265f0 3e 70 4c 6f 6f 70 73 2c 20 70 3d 2a 70 70 50 72  >pLoops, p=*ppPr
26600 65 76 3b 20 70 3b 20 70 70 50 72 65 76 3d 26 70  ev; p; ppPrev=&p
26610 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a  ->pNextLoop, p=*
26620 70 70 50 72 65 76 29 7b 0a 20 20 20 20 69 66 28  ppPrev){.    if(
26630 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c   p->iTab!=pTempl
26640 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e  ate->iTab || p->
26650 69 53 6f 72 74 49 64 78 21 3d 70 54 65 6d 70 6c  iSortIdx!=pTempl
26660 61 74 65 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b  ate->iSortIdx ){
26670 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 65 69 74  .      /* If eit
26680 68 65 72 20 74 68 65 20 69 54 61 62 20 6f 72 20  her the iTab or 
26690 69 53 6f 72 74 49 64 78 20 76 61 6c 75 65 73 20  iSortIdx values 
266a0 66 6f 72 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f  for two WhereLoo
266b0 70 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 0a  p are different.
266c0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
266d0 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e  ose WhereLoops n
266e0 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64  eed to be consid
266f0 65 72 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  ered separately.
26700 20 20 4e 65 69 74 68 65 72 20 69 73 0a 20 20 20    Neither is.   
26710 20 20 20 2a 2a 20 61 20 63 61 6e 64 69 64 61 74     ** a candidat
26720 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65  e to replace the
26730 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20   other. */.     
26740 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
26750 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 63  .    /* In the c
26760 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
26770 61 74 69 6f 6e 2c 20 74 68 65 20 72 53 65 74 75  ation, the rSetu
26780 70 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65  p value is eithe
26790 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72  r zero.    ** or
267a0 20 74 68 65 20 63 6f 73 74 20 6f 66 20 62 75 69   the cost of bui
267b0 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74  lding an automat
267c0 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29  ic index (NlogN)
267d0 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20   and the NlogN. 
267e0 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d     ** is the sam
267f0 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65  e for compatible
26800 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a   WhereLoops. */.
26810 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
26820 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d  Setup==0 || pTem
26830 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30  plate->rSetup==0
26840 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
26850 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d     || p->rSetup=
26860 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
26870 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68  up );..    /* wh
26880 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
26890 29 20 61 6c 77 61 79 73 20 67 65 6e 65 72 61 74  ) always generat
268a0 65 73 20 61 6e 64 20 69 6e 73 65 72 74 73 20 74  es and inserts t
268b0 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
268c0 65 78 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 66  ex.    ** case f
268d0 69 72 73 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d  irst.  Hence com
268e0 70 61 74 69 62 6c 65 20 63 61 6e 64 69 64 61 74  patible candidat
268f0 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76  e WhereLoops nev
26900 65 72 20 68 61 76 65 20 61 20 6c 61 72 67 65 72  er have a larger
26910 0a 20 20 20 20 2a 2a 20 72 53 65 74 75 70 2e 20  .    ** rSetup. 
26920 43 61 6c 6c 20 74 68 69 73 20 53 45 54 55 50 2d  Call this SETUP-
26930 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20  INVARIANT */.   
26940 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74   assert( p->rSet
26950 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up>=pTemplate->r
26960 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 69 66  Setup );..    if
26970 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
26980 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
26990 29 3d 3d 70 2d 3e 70 72 65 72 65 71 0a 20 20 20  )==p->prereq.   
269a0 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d    && p->rSetup<=
269b0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
269c0 70 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  p.     && p->rRu
269d0 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n<=pTemplate->rR
269e0 75 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  un.    ){.      
269f0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 74  /* This branch t
26a00 61 6b 65 6e 20 77 68 65 6e 20 70 20 69 73 20 65  aken when p is e
26a10 71 75 61 6c 20 6f 72 20 62 65 74 74 65 72 20 74  qual or better t
26a20 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 20 69 6e  han pTemplate in
26a30 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 6f   .      ** all o
26a40 66 20 28 31 29 20 64 65 70 65 6e 64 65 6e 63 65  f (1) dependence
26a50 73 20 28 32 29 20 73 65 74 75 70 2d 63 6f 73 74  s (2) setup-cost
26a60 2c 20 61 6e 64 20 28 33 29 20 72 75 6e 2d 63 6f  , and (3) run-co
26a70 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  st. */.      ass
26a80 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d  ert( p->rSetup==
26a90 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
26aa0 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  p );.      if( p
26ab0 2d 3e 6e 4c 54 65 72 6d 3c 70 54 65 6d 70 6c 61  ->nLTerm<pTempla
26ac0 74 65 2d 3e 6e 4c 54 65 72 6d 0a 20 20 20 20 20  te->nLTerm.     
26ad0 20 20 26 26 20 28 70 2d 3e 77 73 46 6c 61 67 73    && (p->wsFlags
26ae0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
26af0 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28  )!=0.       && (
26b00 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61  pTemplate->wsFla
26b10 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
26b20 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26  ED)!=0.       &&
26b30 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
26b40 65 78 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 75  ex==pTemplate->u
26b50 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 0a 20 20  .btree.pIndex.  
26b60 20 20 20 20 20 26 26 20 70 2d 3e 70 72 65 72 65       && p->prere
26b70 71 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  q==pTemplate->pr
26b80 65 72 65 71 0a 20 20 20 20 20 20 29 7b 0a 20 20  ereq.      ){.  
26b90 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69        /* Overwri
26ba0 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57  te an existing W
26bb0 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e  hereLoop with an
26bc0 20 73 69 6d 69 6c 61 72 20 6f 6e 65 20 74 68 61   similar one tha
26bd0 74 20 75 73 65 73 0a 20 20 20 20 20 20 20 20 2a  t uses.        *
26be0 2a 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20  * more terms of 
26bf0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
26c00 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e       pNext = p->
26c10 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20  pNextLoop;.     
26c20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
26c30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
26c40 2a 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 6e  * pTemplate is n
26c50 6f 74 20 68 65 6c 70 66 75 6c 2e 0a 20 20 20 20  ot helpful..    
26c60 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 77 69      ** Return wi
26c70 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 6f  thout changing o
26c80 72 20 61 64 64 69 6e 67 20 61 6e 79 74 68 69 6e  r adding anythin
26c90 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  g */.        got
26ca0 6f 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  o whereLoopInser
26cb0 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a  t_noop;.      }.
26cc0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
26cd0 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70  ->prereq & pTemp
26ce0 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70  late->prereq)==p
26cf0 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
26d00 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e  .     && p->rRun
26d10 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  >=pTemplate->rRu
26d20 6e 0a 20 20 20 20 20 26 26 20 41 4c 57 41 59 53  n.     && ALWAYS
26d30 28 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d  (p->rSetup>=pTem
26d40 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 29 20 2f  plate->rSetup) /
26d50 2a 20 53 65 65 20 53 45 54 55 50 2d 49 4e 56 41  * See SETUP-INVA
26d60 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20  RIANT above */. 
26d70 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f     ){.      /* O
26d80 76 65 72 77 72 69 74 65 20 61 6e 20 65 78 69 73  verwrite an exis
26d90 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 77  ting WhereLoop w
26da0 69 74 68 20 61 20 62 65 74 74 65 72 20 6f 6e 65  ith a better one
26db0 3a 20 6f 6e 65 20 74 68 61 74 20 69 73 0a 20 20  : one that is.  
26dc0 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 61 74      ** better at
26dd0 20 6f 6e 65 20 6f 66 20 28 31 29 20 64 65 70 65   one of (1) depe
26de0 6e 64 65 6e 63 65 73 2c 20 28 32 29 20 73 65 74  ndences, (2) set
26df0 75 70 2d 63 6f 73 74 2c 20 6f 72 20 28 33 29 20  up-cost, or (3) 
26e00 72 75 6e 2d 63 6f 73 74 0a 20 20 20 20 20 20 2a  run-cost.      *
26e10 2a 20 61 6e 64 20 69 73 20 6e 6f 20 77 6f 72 73  * and is no wors
26e20 65 20 69 6e 20 61 6e 79 20 6f 66 20 74 68 6f 73  e in any of thos
26e30 65 20 63 61 74 65 67 6f 72 69 65 73 2e 20 2a 2f  e categories. */
26e40 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70  .      pNext = p
26e50 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
26e60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
26e70 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
26e80 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
26e90 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65   it means that e
26ea0 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c 64  ither p[] should
26eb0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a   be overwritten.
26ec0 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c    ** with pTempl
26ed0 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78 69  ate[] if p[] exi
26ee0 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e 55  sts, or if p==NU
26ef0 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  LL then allocate
26f00 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65 72   a new.  ** Wher
26f10 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72 74  eLoop and insert
26f20 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57 48   it..  */.#if WH
26f30 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
26f40 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
26f50 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
26f60 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20 29  {.    if( p!=0 )
26f70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
26f80 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d  ebugPrintf("ins-
26f90 64 65 6c 3a 20 20 22 29 3b 0a 20 20 20 20 20 20  del:  ");.      
26fa0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
26fb0 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  , pWInfo->pTabLi
26fc0 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  st);.    }.    s
26fd0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
26fe0 66 28 22 69 6e 73 2d 6e 65 77 3a 20 20 22 29 3b  f("ins-new:  ");
26ff0 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72  .    whereLoopPr
27000 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  int(pTemplate, p
27010 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29  WInfo->pTabList)
27020 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
27030 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 70  f( p==0 ){.    p
27040 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
27050 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
27060 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20  (WhereLoop));.  
27070 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
27080 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
27090 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49  ;.    whereLoopI
270a0 6e 69 74 28 70 29 3b 0a 20 20 7d 0a 20 20 77 68  nit(p);.  }.  wh
270b0 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20  ereLoopXfer(db, 
270c0 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20  p, pTemplate);. 
270d0 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20   p->pNextLoop = 
270e0 70 4e 65 78 74 3b 0a 20 20 2a 70 70 50 72 65 76  pNext;.  *ppPrev
270f0 20 3d 20 70 3b 0a 20 20 69 66 28 20 28 70 2d 3e   = p;.  if( (p->
27100 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
27110 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
27120 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
27130 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74 72  Index = p->u.btr
27140 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  ee.pIndex;.    i
27150 66 28 20 70 49 6e 64 65 78 20 26 26 20 70 49 6e  f( pIndex && pIn
27160 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a  dex->tnum==0 ){.
27170 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65        p->u.btree
27180 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  .pIndex = 0;.   
27190 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
271a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
271b0 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68   Jump here if th
271c0 65 20 69 6e 73 65 72 74 20 69 73 20 61 20 6e 6f  e insert is a no
271d0 2d 6f 70 20 2a 2f 0a 77 68 65 72 65 4c 6f 6f 70  -op */.whereLoop
271e0 49 6e 73 65 72 74 5f 6e 6f 6f 70 3a 0a 23 69 66  Insert_noop:.#if
271f0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
27200 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
27210 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
27220 38 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  8 ){.    sqlite3
27230 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73  DebugPrintf("ins
27240 2d 6e 6f 6f 70 3a 20 22 29 3b 0a 20 20 20 20 77  -noop: ");.    w
27250 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
27260 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e 66 6f 2d  emplate, pWInfo-
27270 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 7d 0a  >pTabList);.  }.
27280 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
27290 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 7d 0a 0a  SQLITE_OK;  .}..
272a0 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f  /*.** We have so
272b0 20 66 61 72 20 6d 61 74 63 68 65 64 20 70 42 75   far matched pBu
272c0 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
272d0 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f  tree.nEq terms o
272e0 66 20 74 68 65 20 69 6e 64 65 78 20 70 49 6e 64  f the index pInd
272f0 65 78 2e 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 61  ex..** Try to ma
27300 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a  tch one more..**
27310 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74  .** If pProbe->t
27320 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61  num==0, that mea
27330 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66  ns pIndex is a f
27340 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66  ake index used f
27350 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  or the.** INTEGE
27360 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
27370 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
27380 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
27390 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  dex(.  WhereLoop
273a0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
273b0 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  r,     /* The Wh
273c0 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20  ereLoop factory 
273d0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
273e0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
273f0 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
27400 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61  use term being a
27410 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64  nalyzed */.  Ind
27420 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20  ex *pProbe,     
27430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27440 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63  An index on pSrc
27450 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
27460 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20 20  nInMul          
27470 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d        /* log(Num
27480 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
27490 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a  s due to IN) */.
274a0 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
274b0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
274c0 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57  r->pWInfo;  /* W
274d0 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e  HERE analyse con
274e0 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
274f0 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
27500 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20  ->pParse;       
27510 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
27520 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
27530 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
27540 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b;       /* Data
27550 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
27560 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a  malloc context *
27570 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
27580 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
27590 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
275a0 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20  WhereLoop under 
275b0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
275c0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
275d0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
275e0 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d    /* A WhereTerm
275f0 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61   under considera
27600 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
27610 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
27620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
27630 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72  id operators for
27640 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
27650 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
27660 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27670 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
27680 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f  r WHERE terms */
27690 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64  .  Bitmask saved
276a0 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 20  _prereq;        
276b0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
276c0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72  alue of pNew->pr
276d0 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61  ereq */.  u16 sa
276e0 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20  ved_nLTerm;     
276f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
27700 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
27710 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20  New->nLTerm */. 
27720 20 69 6e 74 20 73 61 76 65 64 5f 6e 45 71 3b 20   int saved_nEq; 
27730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27740 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
27750 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74  ue of pNew->u.bt
27760 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 33 32  ree.nEq */.  u32
27770 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 20   saved_wsFlags; 
27780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27790 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
277a0 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  f pNew->wsFlags 
277b0 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 73  */.  WhereCost s
277c0 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20  aved_nOut;      
277d0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
277e0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
277f0 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43  nOut */.  int iC
27800 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
27810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
27820 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
27830 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
27840 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
27850 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
27860 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
27870 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  e */.  WhereCost
27880 20 6e 52 6f 77 45 73 74 3b 20 20 20 20 20 20 20   nRowEst;       
27890 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61         /* Estima
278a0 74 65 64 20 69 6e 64 65 78 20 73 65 6c 65 63 74  ted index select
278b0 69 76 69 74 79 20 2a 2f 0a 20 20 57 68 65 72 65  ivity */.  Where
278c0 43 6f 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20  Cost rLogSize;  
278d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
278e0 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65  garithm of table
278f0 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65   size */.  Where
27900 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20  Term *pTop = 0, 
27910 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f  *pBtm = 0; /* To
27920 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e  p and bottom ran
27930 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ge constraints *
27940 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  /..  pNew = pBui
27950 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66  lder->pNew;.  if
27960 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
27970 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ed ) return SQLI
27980 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73  TE_NOMEM;..  ass
27990 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c  ert( (pNew->wsFl
279a0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
279b0 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a  UALTABLE)==0 );.
279c0 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d    assert( (pNew-
279d0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
279e0 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29  _TOP_LIMIT)==0 )
279f0 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73  ;.  if( pNew->ws
27a00 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
27a10 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f  M_LIMIT ){.    o
27a20 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f  pMask = WO_LT|WO
27a30 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _LE;.  }else if(
27a40 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30   pProbe->tnum<=0
27a50 20 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74   || (pSrc->joint
27a60 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
27a70 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  0 ){.    opMask 
27a80 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  = WO_EQ|WO_IN|WO
27a90 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c  _GT|WO_GE|WO_LT|
27aa0 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  WO_LE;.  }else{.
27ab0 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
27ac0 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55  EQ|WO_IN|WO_ISNU
27ad0 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57  LL|WO_GT|WO_GE|W
27ae0 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 0a  O_LT|WO_LE;.  }.
27af0 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55    if( pProbe->bU
27b00 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73  nordered ) opMas
27b10 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f  k &= ~(WO_GT|WO_
27b20 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b  GE|WO_LT|WO_LE);
27b30 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
27b40 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70  ->u.btree.nEq<=p
27b50 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Probe->nColumn )
27b60 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e  ;.  if( pNew->u.
27b70 62 74 72 65 65 2e 6e 45 71 20 3c 20 70 50 72 6f  btree.nEq < pPro
27b80 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  be->nColumn ){. 
27b90 20 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65     iCol = pProbe
27ba0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77 2d  ->aiColumn[pNew-
27bb0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b 0a 20  >u.btree.nEq];. 
27bc0 20 20 20 6e 52 6f 77 45 73 74 20 3d 20 77 68 65     nRowEst = whe
27bd0 72 65 43 6f 73 74 28 70 50 72 6f 62 65 2d 3e 61  reCost(pProbe->a
27be0 69 52 6f 77 45 73 74 5b 70 4e 65 77 2d 3e 75 2e  iRowEst[pNew->u.
27bf0 62 74 72 65 65 2e 6e 45 71 2b 31 5d 29 3b 0a 20  btree.nEq+1]);. 
27c00 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74 3d 3d     if( nRowEst==
27c10 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e 45  0 && pProbe->onE
27c20 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20  rror==OE_None ) 
27c30 6e 52 6f 77 45 73 74 20 3d 20 31 3b 0a 20 20 7d  nRowEst = 1;.  }
27c40 65 6c 73 65 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  else{.    iCol =
27c50 20 2d 31 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74   -1;.    nRowEst
27c60 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 54 65 72   = 0;.  }.  pTer
27c70 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69  m = whereScanIni
27c80 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65  t(&scan, pBuilde
27c90 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43  r->pWC, pSrc->iC
27ca0 75 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20 20  ursor, iCol,.   
27cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cc0 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72       opMask, pPr
27cd0 6f 62 65 29 3b 0a 20 20 73 61 76 65 64 5f 6e 45  obe);.  saved_nE
27ce0 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  q = pNew->u.btre
27cf0 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e  e.nEq;.  saved_n
27d00 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c  LTerm = pNew->nL
27d10 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73  Term;.  saved_ws
27d20 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73  Flags = pNew->ws
27d30 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64 5f 70  Flags;.  saved_p
27d40 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72  rereq = pNew->pr
27d50 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f  ereq;.  saved_nO
27d60 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b  ut = pNew->nOut;
27d70 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20  .  pNew->rSetup 
27d80 3d 20 30 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20  = 0;.  rLogSize 
27d90 3d 20 65 73 74 4c 6f 67 28 77 68 65 72 65 43 6f  = estLog(whereCo
27da0 73 74 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77  st(pProbe->aiRow
27db0 45 73 74 5b 30 5d 29 29 3b 0a 20 20 66 6f 72 28  Est[0]));.  for(
27dc0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
27dd0 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65  && pTerm!=0; pTe
27de0 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65  rm = whereScanNe
27df0 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20  xt(&scan)){.    
27e00 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 20 20 20  int nIn = 0;.   
27e10 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
27e20 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e  eqRight & pNew->
27e30 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69  maskSelf ) conti
27e40 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54  nue;.    if( (pT
27e50 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
27e60 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28 70 54  WO_ISNULL || (pT
27e70 65 72 6d 2d 3e 77 74 46 6c 61 67 73 26 54 45 52  erm->wtFlags&TER
27e80 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29 0a 20 20 20  M_VNULL)!=0).   
27e90 20 20 26 26 20 28 69 43 6f 6c 3c 30 20 7c 7c 20    && (iCol<0 || 
27ea0 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  pSrc->pTab->aCol
27eb0 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 29 0a  [iCol].notNull).
27ec0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e      ){.      con
27ed0 74 69 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f 72 65  tinue; /* ignore
27ee0 20 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63   IS [NOT] NULL c
27ef0 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 4e 4f  onstraints on NO
27f00 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a  T NULL columns *
27f10 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  /.    }.    pNew
27f20 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
27f30 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70  d_wsFlags;.    p
27f40 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
27f50 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
27f60 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
27f70 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20   saved_nLTerm;. 
27f80 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
27f90 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
27fa0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29   pNew->nLTerm+1)
27fb0 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d   ) break; /* OOM
27fc0 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c   */.    pNew->aL
27fd0 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
27fe0 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m++] = pTerm;.  
27ff0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
28000 20 28 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c   (saved_prereq |
28010 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
28020 67 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61  ght) & ~pNew->ma
28030 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4e 65 77  skSelf;.    pNew
28040 2d 3e 72 52 75 6e 20 3d 20 72 4c 6f 67 53 69 7a  ->rRun = rLogSiz
28050 65 3b 20 2f 2a 20 42 61 73 65 6c 69 6e 65 20 63  e; /* Baseline c
28060 6f 73 74 20 69 73 20 6c 6f 67 32 28 4e 29 2e 20  ost is log2(N). 
28070 20 41 64 6a 75 73 74 6d 65 6e 74 73 20 62 65 6c   Adjustments bel
28080 6f 77 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54  ow */.    if( pT
28090 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
280a0 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20   WO_IN ){.      
280b0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
280c0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
280d0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
280e0 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
280f0 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78  IN;.      if( Ex
28100 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
28110 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
28120 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  t) ){.        /*
28130 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e   "x IN (SELECT .
28140 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74  ..)":  TUNING: t
28150 68 65 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e  he SELECT return
28160 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20  s 25 rows */.   
28170 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20       nIn = 46;  
28180 61 73 73 65 72 74 28 20 34 36 3d 3d 77 68 65 72  assert( 46==wher
28190 65 43 6f 73 74 28 32 35 29 20 29 3b 0a 20 20 20  eCost(25) );.   
281a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57     }else if( ALW
281b0 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  AYS(pExpr->x.pLi
281c0 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70  st && pExpr->x.p
281d0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
281e0 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e          /* "x IN
281f0 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20   (value, value, 
28200 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20  ...)" */.       
28210 20 6e 49 6e 20 3d 20 77 68 65 72 65 43 6f 73 74   nIn = whereCost
28220 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
28230 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >nExpr);.      }
28240 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
28250 6e 20 2b 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20  n += nIn;.      
28260 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
28270 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  q++;.      pNew-
28280 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20  >nOut = nRowEst 
28290 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a  + nInMul + nIn;.
282a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
282b0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
282c0 20 28 57 4f 5f 45 51 29 20 29 7b 0a 20 20 20 20   (WO_EQ) ){.    
282d0 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d    assert( (pNew-
282e0 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
282f0 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57 48  E_COLUMN_NULL|WH
28300 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21  ERE_COLUMN_IN))!
28310 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
28320 20 20 20 20 20 7c 7c 20 6e 49 6e 4d 75 6c 3d 3d       || nInMul==
28330 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  0 );.      pNew-
28340 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
28350 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20  E_COLUMN_EQ;.   
28360 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 20 0a     if( iCol<0  .
28370 20 20 20 20 20 20 20 7c 7c 20 28 70 50 72 6f 62         || (pProb
28380 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  e->onError!=OE_N
28390 6f 6e 65 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30  one && nInMul==0
283a0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
283b0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
283c0 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  ==pProbe->nColum
283d0 6e 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  n-1).      ){.  
283e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
283f0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
28400 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d  HERE_COLUMN_IN)=
28410 3d 30 20 7c 7c 20 69 43 6f 6c 3c 30 20 29 3b 0a  =0 || iCol<0 );.
28420 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
28430 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f  Flags |= WHERE_O
28440 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 7d 0a 20  NEROW;.      }. 
28450 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
28460 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20  ee.nEq++;.      
28470 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f  pNew->nOut = nRo
28480 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 3b 0a 20  wEst + nInMul;. 
28490 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65     }else if( pTe
284a0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
284b0 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20  (WO_ISNULL) ){. 
284c0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
284d0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
284e0 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70  MN_NULL;.      p
284f0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
28500 2b 2b 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e  ++;.      /* TUN
28510 49 4e 47 3a 20 49 53 20 4e 55 4c 4c 20 73 65 6c  ING: IS NULL sel
28520 65 63 74 73 20 32 20 72 6f 77 73 20 2a 2f 0a 20  ects 2 rows */. 
28530 20 20 20 20 20 6e 49 6e 20 3d 20 31 30 3b 20 20       nIn = 10;  
28540 61 73 73 65 72 74 28 20 31 30 3d 3d 77 68 65 72  assert( 10==wher
28550 65 43 6f 73 74 28 32 29 20 29 3b 0a 20 20 20 20  eCost(2) );.    
28560 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e    pNew->nOut = n
28570 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 20  RowEst + nInMul 
28580 2b 20 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65  + nIn;.    }else
28590 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
285a0 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57  rator & (WO_GT|W
285b0 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74  O_GE) ){.      t
285c0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
285d0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
285e0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
285f0 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
28600 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b  rator & WO_GE );
28610 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
28620 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
28630 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45  LUMN_RANGE|WHERE
28640 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _BTM_LIMIT;.    
28650 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a    pBtm = pTerm;.
28660 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a        pTop = 0;.
28670 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28680 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
28690 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
286a0 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20  LT|WO_LE) );.   
286b0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
286c0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
286d0 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74  WO_LT );.      t
286e0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
286f0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
28700 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E );.      pNew-
28710 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
28720 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
28730 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a  HERE_TOP_LIMIT;.
28740 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65        pTop = pTe
28750 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d  rm;.      pBtm =
28760 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
28770 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
28780 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20  T)!=0 ?.        
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
287a0 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e  w->aLTerm[pNew->
287b0 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20  nLTerm-2] : 0;. 
287c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4e 65     }.    if( pNe
287d0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
287e0 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
287f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  ){.      /* Adju
28800 73 74 20 6e 4f 75 74 20 61 6e 64 20 72 52 75 6e  st nOut and rRun
28810 20 66 6f 72 20 53 54 41 54 33 20 72 61 6e 67 65   for STAT3 range
28820 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 20   values */.     
28830 20 57 68 65 72 65 43 6f 73 74 20 72 44 69 76 3b   WhereCost rDiv;
28840 0a 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67  .      whereRang
28850 65 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  eScanEst(pParse,
28860 20 70 50 72 6f 62 65 2c 20 70 4e 65 77 2d 3e 75   pProbe, pNew->u
28870 2e 62 74 72 65 65 2e 6e 45 71 2c 0a 20 20 20 20  .btree.nEq,.    
28880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28890 20 20 20 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20      pBtm, pTop, 
288a0 26 72 44 69 76 29 3b 0a 20 20 20 20 20 20 70 4e  &rDiv);.      pN
288b0 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
288c0 5f 6e 4f 75 74 3e 72 44 69 76 2b 31 30 20 3f 20  _nOut>rDiv+10 ? 
288d0 73 61 76 65 64 5f 6e 4f 75 74 20 2d 20 72 44 69  saved_nOut - rDi
288e0 76 20 3a 20 31 30 3b 0a 20 20 20 20 7d 0a 23 69  v : 10;.    }.#i
288f0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
28900 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 69 66 28  LE_STAT3.    if(
28910 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
28920 45 71 3d 3d 31 20 26 26 20 70 50 72 6f 62 65 2d  Eq==1 && pProbe-
28930 3e 6e 53 61 6d 70 6c 65 0a 20 20 20 20 20 26 26  >nSample.     &&
28940 20 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e    OptimizationEn
28950 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
28960 5f 53 74 61 74 33 29 20 29 7b 0a 20 20 20 20 20  _Stat3) ){.     
28970 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20   tRowcnt nOut = 
28980 30 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  0;.      if( (pT
28990 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
289a0 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c   (WO_EQ|WO_ISNUL
289b0 4c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  L))!=0 ){.      
289c0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
289d0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
289e0 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
289f0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
28a00 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
28a10 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
28a20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
28a30 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
28a40 20 70 50 72 6f 62 65 2c 20 70 54 65 72 6d 2d 3e   pProbe, pTerm->
28a50 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
28a60 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  nOut);.      }el
28a70 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  se if( (pTerm->e
28a80 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
28a90 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ).             &
28aa0 26 20 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  &  !ExprHasPrope
28ab0 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
28ac0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
28ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
28ae0 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28   whereInScanEst(
28af0 70 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20  pParse, pProbe, 
28b00 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 78 2e  pTerm->pExpr->x.
28b10 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20  pList, &nOut);. 
28b20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
28b30 65 72 74 28 20 6e 4f 75 74 3d 3d 30 20 7c 7c 20  ert( nOut==0 || 
28b40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
28b50 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 20  .      if( nOut 
28b60 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 77  ) pNew->nOut = w
28b70 68 65 72 65 43 6f 73 74 28 6e 4f 75 74 29 3b 0a  hereCost(nOut);.
28b80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
28b90 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c   if( (pNew->wsFl
28ba0 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 44 58  ags & (WHERE_IDX
28bb0 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29  _ONLY|WHERE_IPK)
28bc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
28bd0 20 45 61 63 68 20 72 6f 77 20 69 6e 76 6f 6c 76   Each row involv
28be0 65 73 20 61 20 73 74 65 70 20 6f 66 20 74 68 65  es a step of the
28bf0 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 61 20 62   index, then a b
28c00 69 6e 61 72 79 20 73 65 61 72 63 68 20 6f 66 0a  inary search of.
28c10 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 69        ** the mai
28c20 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  n table */.     
28c30 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 20 77   pNew->rRun =  w
28c40 68 65 72 65 43 6f 73 74 41 64 64 28 70 4e 65 77  hereCostAdd(pNew
28c50 2d 3e 72 52 75 6e 2c 20 72 4c 6f 67 53 69 7a 65  ->rRun, rLogSize
28c60 3e 32 37 20 3f 20 72 4c 6f 67 53 69 7a 65 2d 31  >27 ? rLogSize-1
28c70 37 20 3a 20 31 30 29 3b 0a 20 20 20 20 7d 0a 20  7 : 10);.    }. 
28c80 20 20 20 2f 2a 20 53 74 65 70 20 63 6f 73 74 20     /* Step cost 
28c90 66 6f 72 20 65 61 63 68 20 6f 75 74 70 75 74 20  for each output 
28ca0 72 6f 77 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  row */.    pNew-
28cb0 3e 72 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73  >rRun = whereCos
28cc0 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  tAdd(pNew->rRun,
28cd0 20 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20   pNew->nOut);.  
28ce0 20 20 2f 2a 20 54 42 44 3a 20 41 64 6a 75 73 74    /* TBD: Adjust
28cf0 20 6e 4f 75 74 20 66 6f 72 20 61 64 64 69 74 69   nOut for additi
28d00 6f 6e 61 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73  onal constraints
28d10 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 68 65   */.    rc = whe
28d20 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
28d30 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
28d40 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46    if( (pNew->wsF
28d50 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
28d60 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20  _LIMIT)==0.     
28d70 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  && pNew->u.btree
28d80 2e 6e 45 71 3c 28 70 50 72 6f 62 65 2d 3e 6e 43  .nEq<(pProbe->nC
28d90 6f 6c 75 6d 6e 20 2b 20 28 70 50 72 6f 62 65 2d  olumn + (pProbe-
28da0 3e 7a 4e 61 6d 65 21 3d 30 29 29 0a 20 20 20 20  >zName!=0)).    
28db0 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  ){.      whereLo
28dc0 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
28dd0 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
28de0 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e  pProbe, nInMul+n
28df0 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  In);.    }.  }. 
28e00 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
28e10 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20  saved_prereq;.  
28e20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
28e30 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20  q = saved_nEq;. 
28e40 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
28e50 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
28e60 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
28e70 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65  aved_nOut;.  pNe
28e80 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
28e90 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 72 65 74 75  d_nLTerm;.  retu
28ea0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
28eb0 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 69  Return True if i
28ec0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
28ed0 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20  at pIndex might 
28ee0 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20  be useful in.** 
28ef0 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65  implementing the
28f00 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
28f10 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a   in pBuilder..**
28f20 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65  .** Return False
28f30 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65   if pBuilder doe
28f40 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
28f50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
28f60 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20   or.** if there 
28f70 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49  is no way for pI
28f80 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66 75  ndex to be usefu
28f90 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  l in implementin
28fa0 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20  g that.** ORDER 
28fb0 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  BY clause..*/.st
28fc0 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69  atic int indexMi
28fd0 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72  ghtHelpWithOrder
28fe0 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  By(.  WhereLoopB
28ff0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
29000 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ,.  Index *pInde
29010 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72  x,.  int iCursor
29020 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
29030 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a  pOB;.  int ii, j
29040 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  j;..  if( pIndex
29050 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72  ->bUnordered ) r
29060 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
29070 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pOB = pBuilder->
29080 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
29090 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
290a0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
290b0 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  pOB->nExpr; ii++
290c0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
290d0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
290e0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d  SkipCollate(pOB-
290f0 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20  >a[ii].pExpr);. 
29100 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
29110 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
29120 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
29130 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
29140 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
29150 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e  for(jj=0; jj<pIn
29160 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 6a  dex->nColumn; jj
29170 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
29180 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d   pExpr->iColumn=
29190 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  =pIndex->aiColum
291a0 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31  n[jj] ) return 1
291b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
291c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
291d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
291e0 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20  a bitmask where 
291f0 31 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  1s indicate that
29200 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
29210 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20  ng column of.** 
29220 74 68 65 20 74 61 62 6c 65 20 69 73 20 75 73 65  the table is use
29230 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20  d by an index.  
29240 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 36  Only the first 6
29250 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f  3 columns are co
29260 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61  nsidered..*/.sta
29270 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75  tic Bitmask colu
29280 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78  mnsInIndex(Index
29290 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61   *pIdx){.  Bitma
292a0 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20  sk m = 0;.  int 
292b0 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d  j;.  for(j=pIdx-
292c0 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30  >nColumn-1; j>=0
292d0 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; j--){.    int 
292e0 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  x = pIdx->aiColu
292f0 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 61 73 73 65 72  mn[j];.    asser
29300 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 74  t( x>=0 );.    t
29310 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d  estcase( x==BMS-
29320 31 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  1 );.    testcas
29330 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20  e( x==BMS-2 );. 
29340 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29     if( x<BMS-1 )
29350 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29   m |= MASKBIT(x)
29360 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  ;.  }.  return m
29370 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f  ;.}../* Check to
29380 20 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61   see if a partia
29390 6c 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61  l index with pPa
293a0 72 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e  rtIndexWhere can
293b0 20 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74   be used.** in t
293c0 68 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79  he current query
293d0 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
293e0 66 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20  f it can be and 
293f0 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f  false if not..*/
29400 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
29410 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e  eUsablePartialIn
29420 64 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68  dex(int iTab, Wh
29430 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
29440 45 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20  Expr *pWhere){. 
29450 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54   int i;.  WhereT
29460 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 66 6f  erm *pTerm;.  fo
29470 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  r(i=0, pTerm=pWC
29480 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
29490 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
294a0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
294b0 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
294c0 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 70  (pTerm->pExpr, p
294d0 57 68 65 72 65 2c 20 69 54 61 62 29 20 29 20 72  Where, iTab) ) r
294e0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
294f0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
29500 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
29510 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
29520 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f  a single table o
29530 66 20 74 68 65 20 6a 6f 69 6e 20 77 68 65 72 65  f the join where
29540 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73   the table.** is
29550 20 69 64 65 6e 66 69 65 64 20 62 79 20 70 42 75   idenfied by pBu
29560 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61  ilder->pNew->iTa
29570 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69  b.  That table i
29580 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
29590 62 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74  be.** a b-tree t
295a0 61 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74  able, not a virt
295b0 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ual table..*/.st
295c0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
295d0 6f 70 41 64 64 42 74 72 65 65 28 0a 20 20 57 68  opAddBtree(.  Wh
295e0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
295f0 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45  pBuilder, /* WHE
29600 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d  RE clause inform
29610 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  ation */.  Bitma
29620 73 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20 20  sk mExtra       
29630 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
29640 70 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f  prerequesites fo
29650 72 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62  r using this tab
29660 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  le */.){.  Where
29670 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
29680 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
29690 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74  analysis context
296a0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72   */.  Index *pPr
296b0 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  obe;            
296c0 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65    /* An index we
296d0 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20   are evaluating 
296e0 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20  */.  Index sPk; 
296f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29700 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78   /* A fake index
29710 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20   object for the 
29720 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20  primary key */. 
29730 20 74 52 6f 77 63 6e 74 20 61 69 52 6f 77 45 73   tRowcnt aiRowEs
29740 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20 2f 2a 20  tPk[2];      /* 
29750 54 68 65 20 61 69 52 6f 77 45 73 74 5b 5d 20 76  The aiRowEst[] v
29760 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
29770 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
29780 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b  aiColumnPk = -1;
29790 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
297a0 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66  Column[] value f
297b0 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
297c0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
297d0 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20  TabList;        
297e0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
297f0 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
29800 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
29810 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src;  /* The FRO
29820 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65 20 74  M clause btree t
29830 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  erm to add */.  
29840 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
29850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29860 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f  emplate WhereLoo
29870 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  p object */.  in
29880 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
29890 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ;         /* Ret
298a0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
298b0 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20  t iSortIdx = 1; 
298c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
298d0 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ex number */.  i
298e0 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20 20 20  nt b;           
298f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
29900 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f  boolean value */
29910 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72 53 69  .  WhereCost rSi
29920 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
29930 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
29940 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
29950 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72 4c 6f  .  WhereCost rLo
29960 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f  gSize;         /
29970 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  * Logarithm of t
29980 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
29990 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
299a0 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
299b0 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20  *pWC;           
299c0 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20 57 48  /* The parsed WH
299d0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
299e0 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
299f0 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e  er->pNew;.  pWIn
29a00 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
29a10 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73  WInfo;.  pTabLis
29a20 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
29a30 4c 69 73 74 3b 0a 20 20 70 53 72 63 20 3d 20 70  List;.  pSrc = p
29a40 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65  TabList->a + pNe
29a50 77 2d 3e 69 54 61 62 3b 0a 20 20 70 57 43 20 3d  w->iTab;.  pWC =
29a60 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
29a70 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72    assert( !IsVir
29a80 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29  tual(pSrc->pTab)
29a90 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d   );..  if( pSrc-
29aa0 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f  >pIndex ){.    /
29ab0 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20  * An INDEXED BY 
29ac0 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73  clause specifies
29ad0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e   a particular in
29ae0 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  dex to use */.  
29af0 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d    pProbe = pSrc-
29b00 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65  >pIndex;.  }else
29b10 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69  {.    /* There i
29b20 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20  s no INDEXED BY 
29b30 63 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65 20  clause.  Create 
29b40 61 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a  a fake Index obj
29b50 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20  ect in local.   
29b60 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b   ** variable sPk
29b70 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68   to represent th
29b80 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20  e rowid primary 
29b90 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65  key index.  Make
29ba0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b   this.    ** fak
29bb0 65 20 69 6e 64 65 78 20 74 68 65 20 66 69 72 73  e index the firs
29bc0 74 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20  t in a chain of 
29bd0 49 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69  Index objects wi
29be0 74 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65  th all of the re
29bf0 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  al.    ** indice
29c00 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20  s to follow */. 
29c10 20 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74     Index *pFirst
29c20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29c30 20 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72     /* First of r
29c40 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74  eal indices on t
29c50 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  he table */.    
29c60 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20  memset(&sPk, 0, 
29c70 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a  sizeof(Index));.
29c80 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20      sPk.nColumn 
29c90 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43  = 1;.    sPk.aiC
29ca0 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d  olumn = &aiColum
29cb0 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52  nPk;.    sPk.aiR
29cc0 6f 77 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74  owEst = aiRowEst
29cd0 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72  Pk;.    sPk.onEr
29ce0 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65  ror = OE_Replace
29cf0 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65  ;.    sPk.pTable
29d00 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
29d10 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d     aiRowEstPk[0]
29d20 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 6e   = pSrc->pTab->n
29d30 52 6f 77 45 73 74 3b 0a 20 20 20 20 61 69 52 6f  RowEst;.    aiRo
29d40 77 45 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20  wEstPk[1] = 1;. 
29d50 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72 63     pFirst = pSrc
29d60 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  ->pTab->pIndex;.
29d70 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f      if( pSrc->no
29d80 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20  tIndexed==0 ){. 
29d90 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c       /* The real
29da0 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20   indices of the 
29db0 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63  table are only c
29dc0 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68 65  onsidered if the
29dd0 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e  .      ** NOT IN
29de0 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72 20  DEXED qualifier 
29df0 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  is omitted from 
29e00 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
29e10 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65  */.      sPk.pNe
29e20 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20  xt = pFirst;.   
29e30 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20   }.    pProbe = 
29e40 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a  &sPk;.  }.  rSiz
29e50 65 20 3d 20 77 68 65 72 65 43 6f 73 74 28 70 53  e = whereCost(pS
29e60 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73  rc->pTab->nRowEs
29e70 74 29 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d  t);.  rLogSize =
29e80 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a   estLog(rSize);.
29e90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29ea0 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
29eb0 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61  NDEX.  /* Automa
29ec0 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20  tic indexes */. 
29ed0 20 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e   if( !pBuilder->
29ee0 70 4f 72 53 65 74 0a 20 20 20 26 26 20 28 70 57  pOrSet.   && (pW
29ef0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
29f00 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
29f10 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20  _AutoIndex)!=0. 
29f20 20 20 26 26 20 70 53 72 63 2d 3e 70 49 6e 64 65    && pSrc->pInde
29f30 78 3d 3d 30 0a 20 20 20 26 26 20 21 70 53 72 63  x==0.   && !pSrc
29f40 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 0a 20  ->viaCoroutine. 
29f50 20 20 26 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49    && !pSrc->notI
29f60 6e 64 65 78 65 64 0a 20 20 20 26 26 20 21 70 53  ndexed.   && !pS
29f70 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64  rc->isCorrelated
29f80 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e  .  ){.    /* Gen
29f90 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78  erate auto-index
29fa0 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20   WhereLoops */. 
29fb0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
29fc0 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65  erm;.    WhereTe
29fd0 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43  rm *pWCEnd = pWC
29fe0 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d  ->a + pWC->nTerm
29ff0 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
2a000 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49  pWC->a; rc==SQLI
2a010 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70  TE_OK && pTerm<p
2a020 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
2a030 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
2a040 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
2a050 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29  pNew->maskSelf )
2a060 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2a070 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
2a080 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
2a090 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  rc, 0) ){.      
2a0a0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
2a0b0 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nEq = 1;.       
2a0c0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70   pNew->u.btree.p
2a0d0 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
2a0e0 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
2a0f0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 1;.        pNe
2a100 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70  w->aLTerm[0] = p
2a110 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a  Term;.        /*
2a120 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d   TUNING: One-tim
2a130 65 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75  e cost for compu
2a140 74 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74  ting the automat
2a150 69 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20  ic index is.    
2a160 20 20 20 20 2a 2a 20 61 70 70 72 6f 78 69 6d 61      ** approxima
2a170 74 65 6c 79 20 37 2a 4e 2a 6c 6f 67 32 28 4e 29  tely 7*N*log2(N)
2a180 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
2a190 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
2a1a0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
2a1b0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64   table being ind
2a1c0 65 78 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  exed. */.       
2a1d0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
2a1e0 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a 65  rLogSize + rSize
2a1f0 20 2b 20 32 38 3b 20 20 61 73 73 65 72 74 28 20   + 28;  assert( 
2a200 32 38 3d 3d 77 68 65 72 65 43 6f 73 74 28 37 29  28==whereCost(7)
2a210 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   );.        /* T
2a220 55 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65  UNING: Each inde
2a230 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20  x lookup yields 
2a240 32 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  20 rows in the t
2a250 61 62 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20  able.  This.    
2a260 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74      ** is more t
2a270 68 61 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75  han the usual gu
2a280 65 73 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20  ess of 10 rows, 
2a290 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f  since we have no
2a2a0 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20   way.        ** 
2a2b0 6f 66 20 6b 6e 6f 77 6e 69 6e 67 20 68 6f 77 20  of knowning how 
2a2c0 73 65 6c 65 63 74 69 76 65 20 74 68 65 20 69 6e  selective the in
2a2d0 64 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74  dex will ultimat
2a2e0 65 6c 79 20 62 65 2e 20 20 49 74 20 77 6f 75 6c  ely be.  It woul
2a2f0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74  d.        ** not
2a300 20 62 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65   be unreasonable
2a310 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 76 61   to make this va
2a320 6c 75 65 20 6d 75 63 68 20 6c 61 72 67 65 72 2e  lue much larger.
2a330 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
2a340 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61 73  ->nOut = 43;  as
2a350 73 65 72 74 28 20 34 33 3d 3d 77 68 65 72 65 43  sert( 43==whereC
2a360 6f 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20  ost(20) );.     
2a370 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
2a380 77 68 65 72 65 43 6f 73 74 41 64 64 28 72 4c 6f  whereCostAdd(rLo
2a390 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74  gSize,pNew->nOut
2a3a0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
2a3b0 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
2a3c0 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20  _AUTO_INDEX;.   
2a3d0 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
2a3e0 71 20 3d 20 6d 45 78 74 72 61 20 7c 20 70 54 65  q = mExtra | pTe
2a3f0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  rm->prereqRight;
2a400 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
2a410 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
2a420 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
2a430 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2a440 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2a450 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
2a460 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20  _INDEX */..  /* 
2a470 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e  Loop over all in
2a480 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72  dices.  */.  for
2a490 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  (; rc==SQLITE_OK
2a4a0 20 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f   && pProbe; pPro
2a4b0 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74  be=pProbe->pNext
2a4c0 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20  , iSortIdx++){. 
2a4d0 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70     if( pProbe->p
2a4e0 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a  PartIdxWhere!=0.
2a4f0 20 20 20 20 20 26 26 20 21 77 68 65 72 65 55 73       && !whereUs
2a500 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78  ablePartialIndex
2a510 28 70 4e 65 77 2d 3e 69 54 61 62 2c 20 70 57 43  (pNew->iTab, pWC
2a520 2c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49  , pProbe->pPartI
2a530 64 78 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20  dxWhere) ){.    
2a540 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
2a550 50 61 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e  Partial index in
2a560 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
2a570 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20  this query */.  
2a580 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e    }.    pNew->u.
2a590 62 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20  btree.nEq = 0;. 
2a5a0 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
2a5b0 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  = 0;.    pNew->i
2a5c0 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20  SortIdx = 0;.   
2a5d0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
2a5e0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  0;.    pNew->pre
2a5f0 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20  req = mExtra;.  
2a600 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
2a610 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Size;.    pNew->
2a620 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
2a630 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d   pProbe;.    b =
2a640 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57   indexMightHelpW
2a650 69 74 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c  ithOrderBy(pBuil
2a660 64 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72  der, pProbe, pSr
2a670 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  c->iCursor);.   
2a680 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f   /* The ONEPASS_
2a690 44 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65  DESIRED flags ne
2a6a0 76 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74  ver occurs toget
2a6b0 68 65 72 20 77 69 74 68 20 4f 52 44 45 52 20 42  her with ORDER B
2a6c0 59 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  Y */.    assert(
2a6d0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
2a6e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2a6f0 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
2a700 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20   || b==0 );.    
2a710 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d  if( pProbe->tnum
2a720 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  <=0 ){.      /* 
2a730 49 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20  Integer primary 
2a740 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  key index */.   
2a750 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2a760 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20   = WHERE_IPK;.. 
2a770 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62       /* Full tab
2a780 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20  le scan */.     
2a790 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
2a7a0 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a  = b ? iSortIdx :
2a7b0 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e   0;.      /* TUN
2a7c0 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c  ING: Cost of ful
2a7d0 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20  l table scan is 
2a7e0 33 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e  3*(N + log2(N)).
2a7f0 0a 20 20 20 20 20 20 2a 2a 20 20 2b 20 20 54 68  .      **  +  Th
2a800 65 20 65 78 74 72 61 20 33 20 66 61 63 74 6f 72  e extra 3 factor
2a810 20 69 73 20 74 6f 20 65 6e 63 6f 75 72 61 67 65   is to encourage
2a820 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64 65   the use of inde
2a830 78 65 64 20 6c 6f 6f 6b 75 70 73 0a 20 20 20 20  xed lookups.    
2a840 20 20 2a 2a 20 20 20 20 20 6f 76 65 72 20 66 75    **     over fu
2a850 6c 6c 20 73 63 61 6e 73 2e 20 20 41 20 73 6d 61  ll scans.  A sma
2a860 6c 6c 65 72 20 63 6f 6e 73 74 61 6e 74 20 32 20  ller constant 2 
2a870 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65  is used for cove
2a880 72 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 20 20  ring.      **   
2a890 20 20 69 6e 64 65 78 20 73 63 61 6e 73 20 73 6f    index scans so
2a8a0 20 74 68 61 74 20 61 20 63 6f 76 65 72 69 6e 67   that a covering
2a8b0 20 69 6e 64 65 78 20 73 63 61 6e 20 77 69 6c 6c   index scan will
2a8c0 20 62 65 20 66 61 76 6f 72 65 64 20 6f 76 65 72   be favored over
2a8d0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 61 20  .      **     a 
2a8e0 74 61 62 6c 65 20 73 63 61 6e 2e 20 2a 2f 0a 20  table scan. */. 
2a8f0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2a900 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 72  = whereCostAdd(r
2a910 53 69 7a 65 2c 72 4c 6f 67 53 69 7a 65 29 20 2b  Size,rLogSize) +
2a920 20 31 36 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   16;.      rc = 
2a930 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
2a940 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
2a950 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2a960 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
2a970 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
2a980 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  m = pSrc->colUse
2a990 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e  d & ~columnsInIn
2a9a0 64 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20  dex(pProbe);.   
2a9b0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2a9c0 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45   = (m==0) ? (WHE
2a9d0 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52  RE_IDX_ONLY|WHER
2a9e0 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45  E_INDEXED) : WHE
2a9f0 52 45 5f 49 4e 44 45 58 45 44 3b 0a 0a 20 20 20  RE_INDEXED;..   
2aa00 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20     /* Full scan 
2aa10 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  via index */.   
2aa20 20 20 20 69 66 28 20 62 0a 20 20 20 20 20 20 20     if( b.       
2aa30 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20  || ( m==0.      
2aa40 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55     && pProbe->bU
2aa50 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20  nordered==0.    
2aa60 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
2aa70 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
2aa80 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
2aa90 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  RED)==0.        
2aaa0 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
2aab0 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a  lConfig.bUseCis.
2aac0 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69           && Opti
2aad0 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
2aae0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
2aaf0 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72  db, SQLITE_Cover
2ab00 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20  IdxScan).       
2ab10 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20     ).      ){.  
2ab20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
2ab30 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74  tIdx = b ? iSort
2ab40 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  Idx : 0;.       
2ab50 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20   if( m==0 ){.   
2ab60 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
2ab70 3a 20 43 6f 73 74 20 6f 66 20 61 20 63 6f 76 65  : Cost of a cove
2ab80 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20  ring index scan 
2ab90 69 73 20 32 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e  is 2*(N + log2(N
2aba0 29 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ))..          **
2abb0 20 20 2b 20 20 54 68 65 20 65 78 74 72 61 20 32    +  The extra 2
2abc0 20 66 61 63 74 6f 72 20 69 73 20 74 6f 20 65 6e   factor is to en
2abd0 63 6f 75 72 61 67 65 20 74 68 65 20 75 73 65 20  courage the use 
2abe0 6f 66 20 69 6e 64 65 78 65 64 20 6c 6f 6f 6b 75  of indexed looku
2abf0 70 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ps.          ** 
2ac00 20 20 20 20 6f 76 65 72 20 69 6e 64 65 78 20 73      over index s
2ac10 63 61 6e 73 2e 20 20 41 20 74 61 62 6c 65 20 73  cans.  A table s
2ac20 63 61 6e 20 75 73 65 73 20 61 20 66 61 63 74 6f  can uses a facto
2ac30 72 20 6f 66 20 33 20 73 6f 20 74 68 61 74 0a 20  r of 3 so that. 
2ac40 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20           **     
2ac50 69 6e 64 65 78 20 73 63 61 6e 73 20 61 72 65 20  index scans are 
2ac60 66 61 76 6f 72 65 64 20 6f 76 65 72 20 74 61 62  favored over tab
2ac70 6c 65 20 73 63 61 6e 73 2e 0a 20 20 20 20 20 20  le scans..      
2ac80 20 20 20 20 2a 2a 20 20 2b 20 20 49 66 20 74 68      **  +  If th
2ac90 69 73 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  is covering inde
2aca0 78 20 6d 69 67 68 74 20 61 6c 73 6f 20 68 65 6c  x might also hel
2acb0 70 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  p satisfy the OR
2acc0 44 45 52 20 42 59 0a 20 20 20 20 20 20 20 20 20  DER BY.         
2acd0 20 2a 2a 20 20 20 20 20 63 6c 61 75 73 65 2c 20   **     clause, 
2ace0 74 68 65 6e 20 74 68 65 20 63 6f 73 74 20 69 73  then the cost is
2acf0 20 66 75 64 67 65 64 20 64 6f 77 6e 20 73 6c 69   fudged down sli
2ad00 67 68 74 6c 79 20 73 6f 20 74 68 61 74 20 74 68  ghtly so that th
2ad10 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
2ad20 20 20 20 20 69 6e 64 65 78 20 69 73 20 66 61 76      index is fav
2ad30 6f 72 65 64 20 61 62 6f 76 65 20 6f 74 68 65 72  ored above other
2ad40 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 68 61   indices that ha
2ad50 76 65 20 6e 6f 20 68 6f 70 65 20 6f 66 0a 20 20  ve no hope of.  
2ad60 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 68          **     h
2ad70 65 6c 70 69 6e 67 20 77 69 74 68 20 74 68 65 20  elping with the 
2ad80 4f 52 44 45 52 20 42 59 2e 20 2a 2f 0a 20 20 20  ORDER BY. */.   
2ad90 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
2ada0 6e 20 3d 20 31 30 20 2b 20 77 68 65 72 65 43 6f  n = 10 + whereCo
2adb0 73 74 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67  stAdd(rSize,rLog
2adc0 53 69 7a 65 29 20 2d 20 62 3b 0a 20 20 20 20 20  Size) - b;.     
2add0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ade0 20 20 20 20 61 73 73 65 72 74 28 20 62 21 3d 30      assert( b!=0
2adf0 20 29 3b 20 0a 20 20 20 20 20 20 20 20 20 20 2f   ); .          /
2ae00 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
2ae10 66 20 73 63 61 6e 6e 69 6e 67 20 61 20 6e 6f 6e  f scanning a non
2ae20 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20  -covering index 
2ae30 69 73 20 28 4e 2b 31 29 2a 6c 6f 67 32 28 4e 29  is (N+1)*log2(N)
2ae40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 68  .          ** wh
2ae50 69 63 68 20 77 65 20 77 69 6c 6c 20 73 69 6d 70  ich we will simp
2ae60 6c 69 66 79 20 74 6f 20 6a 75 73 74 20 4e 2a 6c  lify to just N*l
2ae70 6f 67 32 28 4e 29 20 2a 2f 0a 20 20 20 20 20 20  og2(N) */.      
2ae80 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
2ae90 20 72 53 69 7a 65 20 2b 20 72 4c 6f 67 53 69 7a   rSize + rLogSiz
2aea0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2aeb0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2aec0 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
2aed0 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
2aee0 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
2aef0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
2af00 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
2af10 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78  oopAddBtreeIndex
2af20 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c  (pBuilder, pSrc,
2af30 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a 0a 20 20   pProbe, 0);..  
2af40 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
2af50 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  s an INDEXED BY 
2af60 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c  clause, then onl
2af70 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78  y that one index
2af80 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69   is.    ** consi
2af90 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  dered. */.    if
2afa0 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29  ( pSrc->pIndex )
2afb0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2afc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
2afd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2afe0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
2aff0 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65  ** Add all Where
2b000 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72  Loop objects for
2b010 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20   a table of the 
2b020 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64 20  join identified 
2b030 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e  by.** pBuilder->
2b040 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61  pNew->iTab.  Tha
2b050 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61  t table is guara
2b060 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 76 69  nteed to be a vi
2b070 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a  rtual table..*/.
2b080 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
2b090 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 0a  LoopAddVirtual(.
2b0a0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
2b0b0 65 72 20 2a 70 42 75 69 6c 64 65 72 20 20 20 2f  er *pBuilder   /
2b0c0 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  * WHERE clause i
2b0d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 29 7b  nformation */.){
2b0e0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
2b0f0 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
2b100 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69  /* WHERE analysi
2b110 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  s context */.  P
2b120 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
2b130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2b140 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
2b150 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
2b160 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20  use *pWC;       
2b170 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
2b180 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
2b190 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2b1a0 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68  m *pSrc;   /* Th
2b1b0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
2b1c0 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  rm to search */.
2b1d0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
2b1e0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2b1f0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
2b200 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20  fo *pIdxInfo;.  
2b210 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
2b220 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
2b230 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72  *pIdxCons;.  str
2b240 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
2b250 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
2b260 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68  ge *pUsage;.  Wh
2b270 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
2b280 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
2b290 74 20 69 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b  t iTerm, mxTerm;
2b2a0 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69  .  int nConstrai
2b2b0 6e 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49 6e  nt;.  int seenIn
2b2c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2b2d0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
2b2e0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
2b2f0 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65  seen */.  int se
2b300 65 6e 56 61 72 20 3d 20 30 3b 20 20 20 20 20 20  enVar = 0;      
2b310 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2b320 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74  f a non-constant
2b330 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73   constraint is s
2b340 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 68  een */.  int iPh
2b350 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
2b360 20 20 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e 73        /* 0: cons
2b370 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f 6e  t w/o IN, 1: con
2b380 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20 32  st, 2: no IN,  2
2b390 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65 4c  : IN */.  WhereL
2b3a0 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  oop *pNew;.  int
2b3b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2b3c0 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75  ..  pWInfo = pBu
2b3d0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
2b3e0 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
2b3f0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d  ->pParse;.  db =
2b400 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
2b410 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  WC = pBuilder->p
2b420 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  WC;.  pNew = pBu
2b430 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
2b440 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70  Src = &pWInfo->p
2b450 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d  TabList->a[pNew-
2b460 3e 69 54 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d  >iTab];.  pTab =
2b470 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61   pSrc->pTab;.  a
2b480 73 73 65 72 74 28 20 49 73 56 69 72 74 75 61 6c  ssert( IsVirtual
2b490 28 70 54 61 62 29 20 29 3b 0a 20 20 70 49 64 78  (pTab) );.  pIdx
2b4a0 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49  Info = allocateI
2b4b0 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c  ndexInfo(pParse,
2b4c0 20 70 57 43 2c 20 70 53 72 63 2c 20 70 42 75 69   pWC, pSrc, pBui
2b4d0 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b  lder->pOrderBy);
2b4e0 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
2b4f0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2b500 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77  TE_NOMEM;.  pNew
2b510 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20 20  ->prereq = 0;.  
2b520 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
2b530 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  ;.  pNew->wsFlag
2b540 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41  s = WHERE_VIRTUA
2b550 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e  LTABLE;.  pNew->
2b560 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e  nLTerm = 0;.  pN
2b570 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
2b580 72 65 65 20 3d 20 30 3b 0a 20 20 70 55 73 61 67  ree = 0;.  pUsag
2b590 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  e = pIdxInfo->aC
2b5a0 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a  onstraintUsage;.
2b5b0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
2b5c0 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
2b5d0 72 61 69 6e 74 3b 0a 20 20 69 66 28 20 77 68 65  raint;.  if( whe
2b5e0 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
2b5f0 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69   pNew, nConstrai
2b600 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nt) ){.    sqlit
2b610 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64  e3DbFree(db, pId
2b620 78 49 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74 75  xInfo);.    retu
2b630 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2b640 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68 61  .  }..  for(iPha
2b650 73 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b  se=0; iPhase<=3;
2b660 20 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20   iPhase++){.    
2b670 69 66 28 20 21 73 65 65 6e 49 6e 20 26 26 20 28  if( !seenIn && (
2b680 69 50 68 61 73 65 26 31 29 21 3d 30 20 29 7b 0a  iPhase&1)!=0 ){.
2b690 20 20 20 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a        iPhase++;.
2b6a0 20 20 20 20 20 20 69 66 28 20 69 50 68 61 73 65        if( iPhase
2b6b0 3e 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  >3 ) break;.    
2b6c0 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 56  }.    if( !seenV
2b6d0 61 72 20 26 26 20 69 50 68 61 73 65 3e 31 20 29  ar && iPhase>1 )
2b6e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 64 78   break;.    pIdx
2b6f0 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
2b700 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
2b710 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
2b720 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
2b730 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
2b740 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  i<pIdxInfo->nCon
2b750 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
2b760 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20  dxCons++){.     
2b770 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69   j = pIdxCons->i
2b780 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
2b790 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
2b7a0 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69 74  a[j];.      swit
2b7b0 63 68 28 20 69 50 68 61 73 65 20 29 7b 0a 20 20  ch( iPhase ){.  
2b7c0 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 20 20        case 0:   
2b7d0 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69   /* Constants wi
2b7e0 74 68 6f 75 74 20 49 4e 20 6f 70 65 72 61 74 6f  thout IN operato
2b7f0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  r */.          p
2b800 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
2b810 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
2b820 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
2b830 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30  ator & WO_IN)!=0
2b840 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b850 73 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20  seenIn = 1;.    
2b860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b870 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
2b880 72 65 71 52 69 67 68 74 21 3d 30 20 29 7b 0a 20  reqRight!=0 ){. 
2b890 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 56             seenV
2b8a0 61 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ar = 1;.        
2b8b0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65    }else if( (pTe
2b8c0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
2b8d0 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20 20 20  WO_IN)==0 ){.   
2b8e0 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
2b8f0 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20  s->usable = 1;. 
2b900 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b910 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2b920 20 20 20 20 63 61 73 65 20 31 3a 20 20 20 20 2f      case 1:    /
2b930 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68  * Constants with
2b940 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f   IN operators */
2b950 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2b960 74 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20  t( seenIn );.   
2b970 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
2b980 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d  >usable = (pTerm
2b990 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30  ->prereqRight==0
2b9a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
2b9b0 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
2b9c0 20 32 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62   2:    /* Variab
2b9d0 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a  les without IN *
2b9e0 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
2b9f0 72 74 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20  rt( seenVar );. 
2ba00 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
2ba10 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65  s->usable = (pTe
2ba20 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
2ba30 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20  WO_IN)==0;.     
2ba40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2ba50 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f      default:   /
2ba60 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68  * Variables with
2ba70 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   IN */.         
2ba80 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72   assert( seenVar
2ba90 20 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20   && seenIn );.  
2baa0 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
2bab0 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20  ->usable = 1;.  
2bac0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2bad0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2bae0 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20   memset(pUsage, 
2baf0 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65  0, sizeof(pUsage
2bb00 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e  [0])*pIdxInfo->n
2bb10 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20  Constraint);.   
2bb20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e   if( pIdxInfo->n
2bb30 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
2bb40 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  ) sqlite3_free(p
2bb50 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29  IdxInfo->idxStr)
2bb60 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
2bb70 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  idxStr = 0;.    
2bb80 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
2bb90 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 0;.    pIdxIn
2bba0 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
2bbb0 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49  xStr = 0;.    pI
2bbc0 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
2bbd0 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20  onsumed = 0;.   
2bbe0 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
2bbf0 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54  atedCost = SQLIT
2bc00 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75  E_BIG_DBL / (dou
2bc10 62 6c 65 29 32 3b 0a 20 20 20 20 72 63 20 3d 20  ble)2;.    rc = 
2bc20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50  vtabBestIndex(pP
2bc30 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78  arse, pTab, pIdx
2bc40 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  Info);.    if( r
2bc50 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f  c ) goto whereLo
2bc60 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a  opAddVtab_exit;.
2bc70 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a      pIdxCons = *
2bc80 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
2bc90 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
2bca0 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
2bcb0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70  onstraint;.    p
2bcc0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b  New->prereq = 0;
2bcd0 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31  .    mxTerm = -1
2bce0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
2bcf0 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e  ew->nLSlot>=nCon
2bd00 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 20 20 66  straint );.    f
2bd10 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74  or(i=0; i<nConst
2bd20 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77  raint; i++) pNew
2bd30 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b  ->aLTerm[i] = 0;
2bd40 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  .    pNew->u.vta
2bd50 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a  b.omitMask = 0;.
2bd60 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2bd70 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
2bd80 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20   pIdxCons++){.  
2bd90 20 20 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d      if( (iTerm =
2bda0 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49   pUsage[i].argvI
2bdb0 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a  ndex - 1)>=0 ){.
2bdc0 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78          j = pIdx
2bdd0 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65  Cons->iTermOffse
2bde0 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  t;.        if( i
2bdf0 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e  Term>=nConstrain
2be00 74 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c  t.         || j<
2be10 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e  0.         || j>
2be20 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20  =pWC->nTerm.    
2be30 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c       || pNew->aL
2be40 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20  Term[iTerm]!=0. 
2be50 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2be60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2be70 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
2be80 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2be90 28 70 50 61 72 73 65 2c 20 22 25 73 2e 78 42 65  (pParse, "%s.xBe
2bea0 73 74 49 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e  stIndex() malfun
2beb0 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e  ction", pTab->zN
2bec0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2bed0 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64  goto whereLoopAd
2bee0 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20  dVtab_exit;.    
2bef0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65      }.        te
2bf00 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e  stcase( iTerm==n
2bf10 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a  Constraint-1 );.
2bf20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2bf30 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( j==0 );.      
2bf40 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70    testcase( j==p
2bf50 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20  WC->nTerm-1 );. 
2bf60 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
2bf70 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20  pWC->a[j];.     
2bf80 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
2bf90 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  |= pTerm->prereq
2bfa0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61  Right;.        a
2bfb0 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65  ssert( iTerm<pNe
2bfc0 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20  w->nLSlot );.   
2bfd0 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
2bfe0 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d  m[iTerm] = pTerm
2bff0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54  ;.        if( iT
2c000 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54  erm>mxTerm ) mxT
2c010 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20  erm = iTerm;.   
2c020 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2c030 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20  Term==15 );.    
2c040 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
2c050 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20  erm==16 );.     
2c060 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20     if( iTerm<16 
2c070 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  && pUsage[i].omi
2c080 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  t ) pNew->u.vtab
2c090 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c  .omitMask |= 1<<
2c0a0 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  iTerm;.        i
2c0b0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
2c0c0 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30  ator & WO_IN)!=0
2c0d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2c0e0 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74  ( pUsage[i].omit
2c0f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2c100 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74     /* Do not att
2c110 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e 20 49  empt to use an I
2c120 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 66 20  N constraint if 
2c130 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
2c140 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
2c150 20 73 61 79 73 20 74 68 61 74 20 74 68 65 20 65   says that the e
2c160 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e  quivalent EQ con
2c170 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
2c180 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74 65 64  e safely omitted
2c190 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
2c1a0 20 49 66 20 77 65 20 64 6f 20 61 74 74 65 6d 70   If we do attemp
2c1b0 74 20 74 6f 20 75 73 65 20 73 75 63 68 20 61 20  t to use such a 
2c1c0 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65  constraint, some
2c1d0 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65 0a 20   rows might be. 
2c1e0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65             ** re
2c1f0 70 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75  peated in the ou
2c200 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  tput. */.       
2c210 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2c220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c230 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74    /* A virtual t
2c240 61 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e  able that is con
2c250 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49  strained by an I
2c260 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74  N clause may not
2c270 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
2c280 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20  nsume the ORDER 
2c290 42 59 20 63 6c 61 75 73 65 20 62 65 63 61 75 73  BY clause becaus
2c2a0 65 20 28 31 29 20 74 68 65 20 6f 72 64 65 72 20  e (1) the order 
2c2b0 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20  of IN terms.    
2c2c0 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
2c2d0 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c 61  necessarily rela
2c2e0 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65 72  ted to the order
2c2f0 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d 73   of output terms
2c300 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
2c310 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f  * (2) Multiple o
2c320 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69  utputs from a si
2c330 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69  ngle IN value wi
2c340 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20  ll not merge.   
2c350 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68         ** togeth
2c360 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  er.  */.        
2c370 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
2c380 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
2c390 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c3a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2c3b0 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20   i>=nConstraint 
2c3c0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  ){.      pNew->n
2c3d0 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31  LTerm = mxTerm+1
2c3e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2c3f0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e  pNew->nLTerm<=pN
2c400 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
2c410 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
2c420 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e  .idxNum = pIdxIn
2c430 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20  fo->idxNum;.    
2c440 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
2c450 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e  eedFree = pIdxIn
2c460 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
2c470 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78  xStr;.      pIdx
2c480 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
2c490 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
2c4a0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
2c4b0 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f  dxStr = pIdxInfo
2c4c0 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20  ->idxStr;.      
2c4d0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  pNew->u.vtab.isO
2c4e0 72 64 65 72 65 64 20 3d 20 28 75 38 29 28 28 70  rdered = (u8)((p
2c4f0 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
2c500 79 21 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20  y!=0).          
2c510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c520 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49             && pI
2c530 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
2c540 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 20 20 20 20  onsumed);.      
2c550 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
2c560 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52  ;.      pNew->rR
2c570 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 46 72  un = whereCostFr
2c580 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66  omDouble(pIdxInf
2c590 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
2c5a0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  );.      /* TUNI
2c5b0 4e 47 3a 20 45 76 65 72 79 20 76 69 72 74 75 61  NG: Every virtua
2c5c0 6c 20 74 61 62 6c 65 20 71 75 65 72 79 20 72 65  l table query re
2c5d0 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f  turns 25 rows */
2c5e0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
2c5f0 74 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28  t = 46;  assert(
2c600 20 34 36 3d 3d 77 68 65 72 65 43 6f 73 74 28 32   46==whereCost(2
2c610 35 29 20 29 3b 0a 20 20 20 20 20 20 77 68 65 72  5) );.      wher
2c620 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
2c630 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
2c640 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76     if( pNew->u.v
2c650 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a  tab.needFree ){.
2c660 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2c670 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61  free(pNew->u.vta
2c680 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  b.idxStr);.     
2c690 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2c6a0 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
2c6b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
2c6c0 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   ..whereLoopAddV
2c6d0 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28 20  tab_exit:.  if( 
2c6e0 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
2c6f0 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c  FreeIdxStr ) sql
2c700 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
2c710 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73  fo->idxStr);.  s
2c720 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2c730 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65   pIdxInfo);.  re
2c740 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
2c750 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2c760 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
2c770 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72  ../*.** Add Wher
2c780 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74 6f  eLoop entries to
2c790 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73   handle OR terms
2c7a0 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66 6f  .  This works fo
2c7b0 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72 65  r either.** btre
2c7c0 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61  es or virtual ta
2c7d0 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bles..*/.static 
2c7e0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
2c7f0 4f 72 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  Or(WhereLoopBuil
2c800 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 42  der *pBuilder, B
2c810 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 29 7b 0a  itmask mExtra){.
2c820 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2c830 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
2c840 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43  pWInfo;.  WhereC
2c850 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68  lause *pWC;.  Wh
2c860 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20  ereLoop *pNew;. 
2c870 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
2c880 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e  m, *pWCEnd;.  in
2c890 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2c8a0 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20  ;.  int iCur;.  
2c8b0 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70  WhereClause temp
2c8c0 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  WC;.  WhereLoopB
2c8d0 75 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64  uilder sSubBuild
2c8e0 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20 73  ;.  WhereOrSet s
2c8f0 53 75 6d 2c 20 73 43 75 72 2c 20 73 50 72 65 76  Sum, sCur, sPrev
2c900 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
2c910 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
2c920 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c    .  pWC = pBuil
2c930 64 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66 28 20  der->pWC;.  if( 
2c940 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2c950 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44 5f 4f  gs & WHERE_AND_O
2c960 4e 4c 59 20 29 20 72 65 74 75 72 6e 20 53 51 4c  NLY ) return SQL
2c970 49 54 45 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e 64  ITE_OK;.  pWCEnd
2c980 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d   = pWC->a + pWC-
2c990 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d  >nTerm;.  pNew =
2c9a0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
2c9b0 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 75 6d 2c  .  memset(&sSum,
2c9c0 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d 29   0, sizeof(sSum)
2c9d0 29 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d  );..  for(pTerm=
2c9e0 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
2c9f0 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  CEnd && rc==SQLI
2ca00 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b  TE_OK; pTerm++){
2ca10 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
2ca20 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2ca30 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  OR)!=0.     && (
2ca40 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
2ca50 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e  ->indexable & pN
2ca60 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  ew->maskSelf)!=0
2ca70 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57   .    ){.      W
2ca80 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e  hereClause * con
2ca90 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72  st pOrWC = &pTer
2caa0 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
2cab0 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
2cac0 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45  m * const pOrWCE
2cad0 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70  nd = &pOrWC->a[p
2cae0 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  OrWC->nTerm];.  
2caf0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
2cb00 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e  OrTerm;.      in
2cb10 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20  t once = 1;.    
2cb20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
2cb30 0a 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 70  .      pItem = p
2cb40 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
2cb50 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b  >a + pNew->iTab;
2cb60 0a 20 20 20 20 20 20 69 43 75 72 20 3d 20 70 49  .      iCur = pI
2cb70 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
2cb80 20 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20      sSubBuild = 
2cb90 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20  *pBuilder;.     
2cba0 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65   sSubBuild.pOrde
2cbb0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  rBy = 0;.      s
2cbc0 53 75 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20  SubBuild.pOrSet 
2cbd0 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20  = &sCur;..      
2cbe0 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57  for(pOrTerm=pOrW
2cbf0 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f  C->a; pOrTerm<pO
2cc00 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b  rWCEnd; pOrTerm+
2cc10 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2cc20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61  (pOrTerm->eOpera
2cc30 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30  tor & WO_AND)!=0
2cc40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53   ){.          sS
2cc50 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70  ubBuild.pWC = &p
2cc60 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e  OrTerm->u.pAndIn
2cc70 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20  fo->wc;.        
2cc80 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72  }else if( pOrTer
2cc90 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
2cca0 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Cur ){.         
2ccb0 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d   tempWC.pWInfo =
2ccc0 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20   pWC->pWInfo;.  
2ccd0 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
2cce0 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20  Outer = pWC;.   
2ccf0 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70         tempWC.op
2cd00 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20   = TK_AND;.     
2cd10 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72       tempWC.nTer
2cd20 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  m = 1;.         
2cd30 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54   tempWC.a = pOrT
2cd40 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73  erm;.          s
2cd50 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26  SubBuild.pWC = &
2cd60 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20  tempWC;.        
2cd70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2cd80 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2cd90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75     }.        sCu
2cda0 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  r.n = 0;.#ifndef
2cdb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2cdc0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
2cdd0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
2cde0 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a  pItem->pTab) ){.
2cdf0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
2ce00 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
2ce10 61 6c 28 26 73 53 75 62 42 75 69 6c 64 29 3b 0a  al(&sSubBuild);.
2ce20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
2ce30 30 3b 20 69 3c 73 43 75 72 2e 6e 3b 20 69 2b 2b  0; i<sCur.n; i++
2ce40 29 20 73 43 75 72 2e 61 5b 69 5d 2e 70 72 65 72  ) sCur.a[i].prer
2ce50 65 71 20 7c 3d 20 6d 45 78 74 72 61 3b 0a 20 20  eq |= mExtra;.  
2ce60 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
2ce70 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  if.        {.   
2ce80 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
2ce90 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73  eLoopAddBtree(&s
2cea0 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61  SubBuild, mExtra
2ceb0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2cec0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
2ced0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43  =SQLITE_OK || sC
2cee0 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ur.n==0 );.     
2cef0 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30     if( sCur.n==0
2cf00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53   ){.          sS
2cf10 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  um.n = 0;.      
2cf20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2cf30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63     }else if( onc
2cf40 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  e ){.          w
2cf50 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d  hereOrMove(&sSum
2cf60 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20  , &sCur);.      
2cf70 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20      once = 0;.  
2cf80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2cf90 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f         whereOrMo
2cfa0 76 65 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d  ve(&sPrev, &sSum
2cfb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  );.          sSu
2cfc0 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  m.n = 0;.       
2cfd0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50     for(i=0; i<sP
2cfe0 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  rev.n; i++){.   
2cff0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
2d000 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29  ; j<sCur.n; j++)
2d010 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2d020 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73  whereOrInsert(&s
2d030 53 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e  Sum, sPrev.a[i].
2d040 70 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b  prereq | sCur.a[
2d050 6a 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20  j].prereq,.     
2d060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d070 20 20 20 20 20 20 20 77 68 65 72 65 43 6f 73 74         whereCost
2d080 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72  Add(sPrev.a[i].r
2d090 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72  Run, sCur.a[j].r
2d0a0 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20  Run),.          
2d0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0c0 20 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 73    whereCostAdd(s
2d0d0 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20  Prev.a[i].nOut, 
2d0e0 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29  sCur.a[j].nOut))
2d0f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2d100 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d110 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2d120 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
2d130 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 1;.      pNew
2d140 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
2d150 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  erm;.      pNew-
2d160 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
2d170 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20  _MULTI_OR;.     
2d180 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
2d190 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  0;.      pNew->i
2d1a0 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20  SortIdx = 0;.   
2d1b0 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d     memset(&pNew-
2d1c0 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e  >u, 0, sizeof(pN
2d1d0 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20 66  ew->u));.      f
2d1e0 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
2d1f0 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e  TE_OK && i<sSum.
2d200 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
2d210 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 75 6c 74   /* TUNING: Mult
2d220 69 70 6c 65 20 62 79 20 33 2e 35 20 66 6f 72 20  iple by 3.5 for 
2d230 74 68 65 20 73 65 63 6f 6e 64 61 72 79 20 74 61  the secondary ta
2d240 62 6c 65 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20  ble lookup */.  
2d250 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
2d260 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75   = sSum.a[i].rRu
2d270 6e 20 2b 20 31 38 3b 0a 20 20 20 20 20 20 20 20  n + 18;.        
2d280 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75  pNew->nOut = sSu
2d290 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20  m.a[i].nOut;.   
2d2a0 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
2d2b0 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72  q = sSum.a[i].pr
2d2c0 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63  ereq;.        rc
2d2d0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
2d2e0 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
2d2f0 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
2d300 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
2d310 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
2d320 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
2d330 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74 61  jects for all ta
2d340 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20  bles .*/.static 
2d350 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
2d360 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  All(WhereLoopBui
2d370 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b  lder *pBuilder){
2d380 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
2d390 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
2d3a0 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61  >pWInfo;.  Bitma
2d3b0 73 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20  sk mExtra = 0;. 
2d3c0 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20   Bitmask mPrior 
2d3d0 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  = 0;.  int iTab;
2d3e0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
2d3f0 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
2d400 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  TabList;.  struc
2d410 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2d420 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
2d430 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   *db = pWInfo->p
2d440 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
2d450 20 6e 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e   nTabList = pWIn
2d460 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e  fo->nLevel;.  in
2d470 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2d480 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e  ;.  u8 priorJoin
2d490 54 79 70 65 20 3d 20 30 3b 0a 20 20 57 68 65 72  Type = 0;.  Wher
2d4a0 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20  eLoop *pNew;..  
2d4b0 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65  /* Loop over the
2d4c0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a   tables in the j
2d4d0 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74  oin, from left t
2d4e0 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65  o right */.  pNe
2d4f0 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
2d500 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49  ew;.  whereLoopI
2d510 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72  nit(pNew);.  for
2d520 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70  (iTab=0, pItem=p
2d530 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 54 61 62  TabList->a; iTab
2d540 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54 61 62 2b  <nTabList; iTab+
2d550 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2d560 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54   pNew->iTab = iT
2d570 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61  ab;.    pNew->ma
2d580 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b  skSelf = getMask
2d590 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
2d5a0 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  et, pItem->iCurs
2d5b0 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  or);.    if( ((p
2d5c0 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c 70  Item->jointype|p
2d5d0 72 69 6f 72 4a 6f 69 6e 54 79 70 65 29 20 26 20  riorJoinType) & 
2d5e0 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
2d5f0 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  S))!=0 ){.      
2d600 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b  mExtra = mPrior;
2d610 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72  .    }.    prior
2d620 4a 6f 69 6e 54 79 70 65 20 3d 20 70 49 74 65 6d  JoinType = pItem
2d630 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  ->jointype;.    
2d640 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49  if( IsVirtual(pI
2d650 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  tem->pTab) ){.  
2d660 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2d670 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70 42 75  opAddVirtual(pBu
2d680 69 6c 64 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73  ilder);.    }els
2d690 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  e{.      rc = wh
2d6a0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
2d6b0 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61  pBuilder, mExtra
2d6c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2d6d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2d6e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
2d6f0 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69  reLoopAddOr(pBui
2d700 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20  lder, mExtra);. 
2d710 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20     }.    mPrior 
2d720 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c  |= pNew->maskSel
2d730 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c  f;.    if( rc ||
2d740 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2d750 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  d ) break;.  }. 
2d760 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28   whereLoopClear(
2d770 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74  db, pNew);.  ret
2d780 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2d790 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72 65   Examine a Where
2d7a0 50 61 74 68 20 28 77 69 74 68 20 74 68 65 20 61  Path (with the a
2d7b0 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65  ddition of the e
2d7c0 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  xtra WhereLoop o
2d7d0 66 20 74 68 65 20 35 74 68 0a 2a 2a 20 70 61 72  f the 5th.** par
2d7e0 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65 20  ameters) to see 
2d7f0 69 66 20 69 74 20 6f 75 74 70 75 74 73 20 72 6f  if it outputs ro
2d800 77 73 20 69 6e 20 74 68 65 20 72 65 71 75 65 73  ws in the reques
2d810 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  ted ORDER BY.** 
2d820 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77 69  (or GROUP BY) wi
2d830 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67 20  thout requiring 
2d840 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 20  a separate sort 
2d850 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74 75  operation.  Retu
2d860 72 6e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 30 3a  rn:.** .**    0:
2d870 20 20 4f 52 44 45 52 20 42 59 20 69 73 20 6e 6f    ORDER BY is no
2d880 74 20 73 61 74 69 73 66 69 65 64 2e 20 20 53 6f  t satisfied.  So
2d890 72 74 69 6e 67 20 72 65 71 75 69 72 65 64 0a 2a  rting required.*
2d8a0 2a 20 20 20 20 31 3a 20 20 4f 52 44 45 52 20 42  *    1:  ORDER B
2d8b0 59 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 20  Y is satisfied. 
2d8c0 20 20 20 20 20 4f 6d 69 74 20 73 6f 72 74 69 6e       Omit sortin
2d8d0 67 0a 2a 2a 20 20 20 2d 31 3a 20 20 55 6e 6b 6e  g.**   -1:  Unkn
2d8e0 6f 77 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65  own at this time
2d8f0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
2d900 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
2d910 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e  WHERE_GROUPBY an
2d920 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  d WHERE_DISTINCT
2d930 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20  BY is not as.** 
2d940 73 74 72 69 63 74 2e 20 20 57 69 74 68 20 47 52  strict.  With GR
2d950 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49  OUP BY and DISTI
2d960 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71  NCT the only req
2d970 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74  uirement is that
2d980 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72  .** equivalent r
2d990 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64  ows appear immed
2d9a0 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20  iately adjacent 
2d9b0 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20  to one another. 
2d9c0 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64   GROUP BY.** and
2d9d0 20 44 49 53 54 49 4e 54 20 64 6f 20 6e 6f 74 20   DISTINT do not 
2d9e0 72 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20  require rows to 
2d9f0 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61  appear in any pa
2da00 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61  rticular order a
2da10 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75  s long.** as equ
2da20 69 76 65 6c 65 6e 74 20 72 6f 77 73 20 61 72 65  ivelent rows are
2da30 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
2da40 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f  r.  Thus for GRO
2da50 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
2da60 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72  CT.** the pOrder
2da70 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20  By terms can be 
2da80 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f  matched in any o
2da90 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45  rder.  With ORDE
2daa0 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f  R BY, the .** pO
2dab0 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73  rderBy terms mus
2dac0 74 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20  t be matched in 
2dad0 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72  strict left-to-r
2dae0 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ight order..*/.s
2daf0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50  tatic int whereP
2db00 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
2db10 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  rBy(.  WhereInfo
2db20 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20   *pWInfo,    /* 
2db30 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
2db40 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
2db50 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f  pOrderBy,   /* O
2db60 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
2db70 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20   BY or DISTINCT 
2db80 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20  clause to check 
2db90 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
2dba0 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68  pPath,     /* Th
2dbb0 65 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 63  e WherePath to c
2dbc0 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63  heck */.  u16 wc
2dbd0 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  trlFlags,       
2dbe0 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e  /* Might contain
2dbf0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f   WHERE_GROUPBY o
2dc00 72 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  r WHERE_DISTINCT
2dc10 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f  BY */.  u16 nLoo
2dc20 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
2dc30 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
2dc40 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f  es in pPath->aLo
2dc50 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  op[] */.  WhereL
2dc60 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20  oop *pLast,     
2dc70 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72  /* Add this Wher
2dc80 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64  eLoop to the end
2dc90 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70   of pPath->aLoop
2dca0 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  [] */.  Bitmask 
2dcb0 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a  *pRevMask     /*
2dcc0 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68   OUT: Mask of Wh
2dcd0 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20  ereLoops to run 
2dce0 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
2dcf0 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53   */.){.  u8 revS
2dd00 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
2dd10 2a 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73  * True if rev is
2dd20 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72   known */.  u8 r
2dd30 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
2dd40 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73    /* Composite s
2dd50 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75  ort order */.  u
2dd60 38 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20  8 revIdx;       
2dd70 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f       /* Index so
2dd80 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
2dd90 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2dda0 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72  ;   /* All prior
2ddb0 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20   WhereLoops are 
2ddc0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a  order-distinct *
2ddd0 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74 43  /.  u8 distinctC
2dde0 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75  olumns;   /* Tru
2ddf0 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61  e if the loop ha
2de00 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c  s UNIQUE NOT NUL
2de10 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75  L columns */.  u
2de20 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20  8 isMatch;      
2de30 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20       /* iColumn 
2de40 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f  matches a term o
2de50 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
2de60 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e  lause */.  u16 n
2de70 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
2de80 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
2de90 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78 20  lumns in pIndex 
2dea0 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42  */.  u16 nOrderB
2deb0 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
2dec0 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68  mber terms in th
2ded0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2dee0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70  e */.  int iLoop
2def0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2df00 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f  Index of WhereLo
2df10 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e  op in pPath bein
2df20 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  g processed */. 
2df30 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
2df40 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2df50 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
2df60 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
2df70 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
2df80 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20  ber for current 
2df90 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69  WhereLoop */.  i
2dfa0 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  nt iColumn;     
2dfb0 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e       /* A column
2dfc0 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74   number within t
2dfd0 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57  able iCur */.  W
2dfe0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
2dff0 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  = 0; /* Current 
2e000 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20  WhereLoop being 
2e010 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20  processed. */.  
2e020 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
2e030 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c  ;     /* A singl
2e040 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
2e050 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
2e060 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20  Expr *pOBExpr;  
2e070 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72        /* An expr
2e080 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  ession from the 
2e090 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2e0a0 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  */.  CollSeq *pC
2e0b0 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f  oll;       /* CO
2e0c0 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66  LLATE function f
2e0d0 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20  rom an ORDER BY 
2e0e0 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20  clause term */. 
2e0f0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
2e100 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
2e110 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
2e120 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73  ith pLoop */.  s
2e130 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
2e140 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
2e150 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
2e160 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  nnection */.  Bi
2e170 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b  tmask obSat = 0;
2e180 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f      /* Mask of O
2e190 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73 61  RDER BY terms sa
2e1a0 74 69 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a  tisfied so far *
2e1b0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f  /.  Bitmask obDo
2e1c0 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  ne;       /* Mas
2e1d0 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42  k of all ORDER B
2e1e0 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74  Y terms */.  Bit
2e1f0 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e  mask orderDistin
2e200 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b  ctMask;  /* Mask
2e210 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64   of all well-ord
2e220 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20  ered loops */.  
2e230 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20  Bitmask ready;  
2e240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2e250 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f  ask of inner loo
2e260 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ps */..  /*.  **
2e270 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72   We say the Wher
2e280 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f  eLoop is "one-ro
2e290 77 22 20 69 66 20 69 74 20 67 65 6e 65 72 61 74  w" if it generat
2e2a0 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  es no more than 
2e2b0 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  one.  ** row of 
2e2c0 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65 72 65  output.  A Where
2e2d0 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20  Loop is one-row 
2e2e0 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
2e2f0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
2e300 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20  :.  **  (a) All 
2e310 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61  index columns ma
2e320 74 63 68 20 77 69 74 68 20 57 48 45 52 45 5f 43  tch with WHERE_C
2e330 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20  OLUMN_EQ..  **  
2e340 28 62 29 20 54 68 65 20 69 6e 64 65 78 20 69 73  (b) The index is
2e350 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79   unique.  ** Any
2e360 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20   WhereLoop with 
2e370 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  an WHERE_COLUMN_
2e380 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  EQ constraint on
2e390 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e   the rowid is on
2e3a0 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72  e-row..  ** Ever
2e3b0 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c  y one-row WhereL
2e3c0 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68  oop will have th
2e3d0 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62  e WHERE_ONEROW b
2e3e0 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67  it set in wsFlag
2e3f0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  s..  **.  ** We 
2e400 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  say the WhereLoo
2e410 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74  p is "order-dist
2e420 69 6e 63 74 22 20 69 66 20 74 68 65 20 73 65 74  inct" if the set
2e430 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d   of columns from
2e440 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65  .  ** that Where
2e450 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e  Loop that are in
2e460 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2e470 61 75 73 65 20 61 72 65 20 64 69 66 66 65 72 65  ause are differe
2e480 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a  nt for every.  *
2e490 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65  * row of the Whe
2e4a0 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f  reLoop.  Every o
2e4b0 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70  ne-row WhereLoop
2e4c0 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
2e4d0 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73  y.  ** order-dis
2e4e0 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65  tinct.   A Where
2e4f0 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f  Loop that has no
2e500 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
2e510 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
2e520 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65    ** is not orde
2e530 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62  r-distinct. To b
2e540 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
2e550 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68   is not quite th
2e560 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a  e same as being.
2e570 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63    ** UNIQUE sinc
2e580 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d  e a UNIQUE colum
2e590 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68  n or index can h
2e5a0 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  ave multiple row
2e5b0 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65  s that .  ** are
2e5c0 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76   NULL and NULL v
2e5d0 61 6c 75 65 73 20 61 72 65 20 65 71 75 69 76 61  alues are equiva
2e5e0 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72  lent for the pur
2e5f0 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69  pose of order-di
2e600 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20  stinct..  ** To 
2e610 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  be order-distinc
2e620 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d  t, the columns m
2e630 75 73 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e  ust be UNIQUE an
2e640 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a  d NOT NULL..  **
2e650 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20  .  ** The rowid 
2e660 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20 61  for a table is a
2e670 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64  lways UNIQUE and
2e680 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65   NOT NULL so whe
2e690 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72  never the.  ** r
2e6a0 6f 77 69 64 20 61 70 70 65 61 72 73 20 69 6e 20  owid appears in 
2e6b0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2e6c0 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  use, the corresp
2e6d0 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  onding WhereLoop
2e6e0 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74   is.  ** automat
2e6f0 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73  ically order-dis
2e700 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61  tinct..  */..  a
2e710 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21  ssert( pOrderBy!
2e720 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 6f 72 74  =0 );..  /* Sort
2e730 61 62 69 6c 69 74 79 20 6f 66 20 76 69 72 74 75  ability of virtu
2e740 61 6c 20 74 61 62 6c 65 73 20 69 73 20 64 65 74  al tables is det
2e750 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 78  ermined by the x
2e760 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
2e770 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 76 69 72  .  ** of the vir
2e780 74 75 61 6c 20 74 61 62 6c 65 20 69 74 73 65 6c  tual table itsel
2e790 66 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74  f */.  if( pLast
2e7a0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2e7b0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29  E_VIRTUALTABLE )
2e7c0 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
2e7d0 6e 4c 6f 6f 70 3e 30 20 29 3b 20 20 2f 2a 20 54  nLoop>0 );  /* T
2e7e0 72 75 65 20 77 68 65 6e 20 6f 75 74 65 72 20 6c  rue when outer l
2e7f0 6f 6f 70 73 20 61 72 65 20 6f 6e 65 2d 72 6f 77  oops are one-row
2e800 20 61 6e 64 20 6d 61 74 63 68 20 0a 20 20 20 20   and match .    
2e810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e820 20 20 20 20 20 20 2a 2a 20 6e 6f 20 4f 52 44 45        ** no ORDE
2e830 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20  R BY terms */.  
2e840 20 20 72 65 74 75 72 6e 20 70 4c 61 73 74 2d 3e    return pLast->
2e850 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64  u.vtab.isOrdered
2e860 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 6f  ;.  }.  if( nLoo
2e870 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f  p && Optimizatio
2e880 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
2e890 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a  LITE_OrderByIdxJ
2e8a0 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b  oin) ) return 0;
2e8b0 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ..  nOrderBy = p
2e8c0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
2e8d0 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64    testcase( nOrd
2e8e0 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  erBy==BMS-1 );. 
2e8f0 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d   if( nOrderBy>BM
2e900 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  S-1 ) return 0; 
2e910 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d   /* Cannot optim
2e920 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65  ize overly large
2e930 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20   ORDER BYs */.  
2e940 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2e950 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20  = 1;.  obDone = 
2e960 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79  MASKBIT(nOrderBy
2e970 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74  )-1;.  orderDist
2e980 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  inctMask = 0;.  
2e990 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72  ready = 0;.  for
2e9a0 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65  (iLoop=0; isOrde
2e9b0 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53  rDistinct && obS
2e9c0 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f  at<obDone && iLo
2e9d0 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70  op<=nLoop; iLoop
2e9e0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f  ++){.    if( iLo
2e9f0 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20  op>0 ) ready |= 
2ea00 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  pLoop->maskSelf;
2ea10 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f  .    pLoop = iLo
2ea20 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68  op<nLoop ? pPath
2ea30 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a  ->aLoop[iLoop] :
2ea40 20 70 4c 61 73 74 3b 0a 20 20 20 20 61 73 73 65   pLast;.    asse
2ea50 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
2ea60 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
2ea70 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a  UALTABLE)==0 );.
2ea80 20 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66      iCur = pWInf
2ea90 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
2eaa0 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72  Loop->iTab].iCur
2eab0 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72  sor;..    /* Mar
2eac0 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20  k off any ORDER 
2ead0 42 59 20 74 65 72 6d 20 58 20 74 68 61 74 20 69  BY term X that i
2eae0 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  s a column in th
2eaf0 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a  e table of.    *
2eb00 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  * the current lo
2eb10 6f 70 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  op for which the
2eb20 72 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68  re is term in th
2eb30 65 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63  e WHERE.    ** c
2eb40 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72  lause of the for
2eb50 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58  m X IS NULL or X
2eb60 3d 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  =? that referenc
2eb70 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20  e only outer.   
2eb80 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a   ** loops..    *
2eb90 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
2eba0 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
2ebb0 0a 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42  .      if( MASKB
2ebc0 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20  IT(i) & obSat ) 
2ebd0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2ebe0 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65  pOBExpr = sqlite
2ebf0 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
2ec00 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  (pOrderBy->a[i].
2ec10 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
2ec20 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54  ( pOBExpr->op!=T
2ec30 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69  K_COLUMN ) conti
2ec40 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nue;.      if( p
2ec50 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d  OBExpr->iTable!=
2ec60 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
2ec70 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66  .      pTerm = f
2ec80 69 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d  indTerm(&pWInfo-
2ec90 3e 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42 45  >sWC, iCur, pOBE
2eca0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  xpr->iColumn,.  
2ecb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ecc0 20 20 20 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f       ~ready, WO_
2ecd0 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29  EQ|WO_ISNULL, 0)
2ece0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
2ecf0 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  m==0 ) continue;
2ed00 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72  .      if( (pTer
2ed10 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f  m->eOperator&WO_
2ed20 45 51 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70  EQ)!=0 && pOBExp
2ed30 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  r->iColumn>=0 ){
2ed40 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
2ed50 68 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20  har *z1, *z2;.  
2ed60 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2ed70 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2ed80 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
2ed90 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
2eda0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
2edb0 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
2edc0 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
2edd0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d  ll;.        z1 =
2ede0 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20   pColl->zName;. 
2edf0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
2ee00 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
2ee10 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  q(pWInfo->pParse
2ee20 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b  , pTerm->pExpr);
2ee30 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
2ee40 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
2ee50 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
2ee60 20 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d       z2 = pColl-
2ee70 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
2ee80 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
2ee90 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20  mp(z1, z2)!=0 ) 
2eea0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2eeb0 7d 0a 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d  }.      obSat |=
2eec0 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
2eed0 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f   }..    if( (pLo
2eee0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2eef0 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29  ERE_ONEROW)==0 )
2ef00 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f  {.      if( pLoo
2ef10 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2ef20 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20  RE_IPK ){.      
2ef30 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
2ef40 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20        nColumn = 
2ef50 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
2ef60 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f  f( (pIndex = pLo
2ef70 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
2ef80 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78  ex)==0 || pIndex
2ef90 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a  ->bUnordered ){.
2efa0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
2efb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2efc0 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d         nColumn =
2efd0 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
2efe0 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65  ;.        isOrde
2eff0 72 44 69 73 74 69 6e 63 74 20 3d 20 70 49 6e 64  rDistinct = pInd
2f000 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
2f010 4e 6f 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  None;.      }.. 
2f020 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
2f030 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  ough all columns
2f040 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e   of the index an
2f050 64 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20  d deal with the 
2f060 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68  ones.      ** th
2f070 61 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74  at are not const
2f080 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20  rained by == or 
2f090 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  IN..      */.   
2f0a0 20 20 20 72 65 76 20 3d 20 72 65 76 53 65 74 20     rev = revSet 
2f0b0 3d 20 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69  = 0;.      disti
2f0c0 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a  nctColumns = 0;.
2f0d0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2f0e0 3c 3d 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  <=nColumn; j++){
2f0f0 0a 20 20 20 20 20 20 20 20 75 38 20 62 4f 6e 63  .        u8 bOnc
2f100 65 3b 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  e;   /* True to 
2f110 72 75 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59  run the ORDER BY
2f120 20 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a   search loop */.
2f130 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70  .        /* Skip
2f140 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20   over == and IS 
2f150 4e 55 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a 20 20  NULL terms */.  
2f160 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f        if( j<pLoo
2f170 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20  p->u.btree.nEq. 
2f180 20 20 20 20 20 20 20 20 26 26 20 28 28 69 20 3d          && ((i =
2f190 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
2f1a0 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20 26 20  ]->eOperator) & 
2f1b0 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_EQ|WO_ISNULL
2f1c0 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  ))!=0.        ){
2f1d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2f1e0 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a   & WO_ISNULL ){.
2f1f0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2f200 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
2f210 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20  tinct );.       
2f220 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
2f230 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
2f240 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2f250 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20  continue;  .    
2f260 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
2f270 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e  * Get the column
2f280 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74   number in the t
2f290 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61  able (iColumn) a
2f2a0 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20  nd sort order.  
2f2b0 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78        ** (revIdx
2f2c0 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63  ) for the j-th c
2f2d0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
2f2e0 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ex..        */. 
2f2f0 20 20 20 20 20 20 20 69 66 28 20 6a 3c 6e 43 6f         if( j<nCo
2f300 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
2f310 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 69 6e 64 65    /* Normal inde
2f320 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  x columns */.   
2f330 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
2f340 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
2f350 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  n[j];.          
2f360 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d  revIdx = pIndex-
2f370 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a  >aSortOrder[j];.
2f380 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
2f390 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70  olumn==pIndex->p
2f3a0 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69  Table->iPKey ) i
2f3b0 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
2f3c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f3d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 52 4f 57        /* The ROW
2f3e0 49 44 20 63 6f 6c 75 6d 6e 20 61 74 20 74 68 65  ID column at the
2f3f0 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20   end */.        
2f400 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 6f    assert( j==nCo
2f410 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
2f420 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a    iColumn = -1;.
2f430 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78            revIdx
2f440 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
2f450 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75  .        /* An u
2f460 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c  nconstrained col
2f470 75 6d 6e 20 74 68 61 74 20 6d 69 67 68 74 20 62  umn that might b
2f480 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61  e NULL means tha
2f490 74 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  t this.        *
2f4a0 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e  * WhereLoop is n
2f4b0 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20  ot well-ordered 
2f4c0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2f4d0 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44      if( isOrderD
2f4e0 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20 20 20  istinct.        
2f4f0 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20   && iColumn>=0. 
2f500 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c          && j>=pL
2f510 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
2f520 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49 6e  .         && pIn
2f530 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  dex->pTable->aCo
2f540 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75  l[iColumn].notNu
2f550 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  ll==0.        ){
2f560 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64  .          isOrd
2f570 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
2f580 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2f590 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f     /* Find the O
2f5a0 52 44 45 52 20 42 59 20 74 65 72 6d 20 74 68 61  RDER BY term tha
2f5b0 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
2f5c0 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
2f5d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
2f5e0 68 65 20 69 6e 64 65 78 20 61 6e 64 20 61 6e 64  he index and and
2f5f0 20 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52   mark that ORDER
2f600 20 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20   BY term off .  
2f610 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2f620 20 62 4f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20   bOnce = 1;.    
2f630 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b      isMatch = 0;
2f640 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2f650 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72  ; bOnce && i<nOr
2f660 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
2f670 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42         if( MASKB
2f680 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20  IT(i) & obSat ) 
2f690 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2f6a0 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71      pOBExpr = sq
2f6b0 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
2f6c0 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61  late(pOrderBy->a
2f6d0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
2f6e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2f6f0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2f700 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20  RE_GROUPBY );.  
2f710 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2f720 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
2f730 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
2f740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2f750 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 28   (wctrlFlags & (
2f760 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57 48  WHERE_GROUPBY|WH
2f770 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 29  ERE_DISTINCTBY))
2f780 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b  ==0 ) bOnce = 0;
2f790 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2f7a0 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  OBExpr->op!=TK_C
2f7b0 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65  OLUMN ) continue
2f7c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2f7d0 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  pOBExpr->iTable!
2f7e0 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
2f7f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2f800 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
2f810 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  !=iColumn ) cont
2f820 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2f830 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29  if( iColumn>=0 )
2f840 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
2f850 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2f860 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d  rCollSeq(pWInfo-
2f870 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  >pParse, pOrderB
2f880 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
2f890 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2f8a0 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
2f8b0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
2f8c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2f8d0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
2f8e0 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e  Coll->zName, pIn
2f8f0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21  dex->azColl[j])!
2f900 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2f910 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f920 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 31       isMatch = 1
2f930 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2f940 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
2f950 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68       if( isMatch
2f960 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2f970 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ( iColumn<0 ){. 
2f980 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
2f990 61 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f 6c  ase( distinctCol
2f9a0 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20  umns==0 );.     
2f9b0 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43         distinctC
2f9c0 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20  olumns = 1;.    
2f9d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f9e0 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42    obSat |= MASKB
2f9f0 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 20  IT(i);.         
2fa00 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
2fa10 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2fa20 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a  _GROUPBY)==0 ){.
2fa30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2fa40 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f 72  ake sure the sor
2fa50 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61  t order is compa
2fa60 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45  tible in an ORDE
2fa70 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20  R BY clause..   
2fa80 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72 74           ** Sort
2fa90 20 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c 65   order is irrele
2faa0 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55 50  vant for a GROUP
2fab0 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20   BY clause. */. 
2fac0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2fad0 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20  evSet ){.       
2fae0 20 20 20 20 20 20 20 69 66 28 20 28 72 65 76 20         if( (rev 
2faf0 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65  ^ revIdx)!=pOrde
2fb00 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
2fb10 64 65 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  der ) return 0;.
2fb20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
2fb30 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
2fb40 20 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20   rev = revIdx ^ 
2fb50 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
2fb60 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20  ortOrder;.      
2fb70 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76 20          if( rev 
2fb80 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d  ) *pRevMask |= M
2fb90 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20  ASKBIT(iLoop);. 
2fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76               rev
2fbb0 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Set = 1;.       
2fbc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2fbd0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2fbe0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  {.          /* N
2fbf0 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f  o match found */
2fc00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a  .          if( j
2fc10 3d 3d 30 20 7c 7c 20 6a 3c 6e 43 6f 6c 75 6d 6e  ==0 || j<nColumn
2fc20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2fc30 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65  testcase( isOrde
2fc40 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a  rDistinct!=0 );.
2fc50 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
2fc60 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  derDistinct = 0;
2fc70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2fc80 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2fc90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
2fca0 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72  /* end Loop over
2fcb0 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d   all index colum
2fcc0 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ns */.      if( 
2fcd0 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20  distinctColumns 
2fce0 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
2fcf0 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74  ase( isOrderDist
2fd00 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  inct==0 );.     
2fd10 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
2fd20 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ct = 1;.      }.
2fd30 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20      } /* end-if 
2fd40 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a  not one-row */..
2fd50 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20      /* Mark off 
2fd60 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20  any other ORDER 
2fd70 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 72 65  BY terms that re
2fd80 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f  ference pLoop */
2fd90 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72  .    if( isOrder
2fda0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
2fdb0 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d    orderDistinctM
2fdc0 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61  ask |= pLoop->ma
2fdd0 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f  skSelf;.      fo
2fde0 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
2fdf0 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
2fe00 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20   Expr *p;.      
2fe10 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29    if( MASKBIT(i)
2fe20 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69   & obSat ) conti
2fe30 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20 3d  nue;.        p =
2fe40 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
2fe50 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
2fe60 66 28 20 28 65 78 70 72 54 61 62 6c 65 55 73 61  f( (exprTableUsa
2fe70 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  ge(&pWInfo->sMas
2fe80 6b 53 65 74 2c 20 70 29 26 7e 6f 72 64 65 72 44  kSet, p)&~orderD
2fe90 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20  istinctMask)==0 
2fea0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53  ){.          obS
2feb0 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
2fec0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2fed0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a    }.    }.  } /*
2fee0 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76   End the loop ov
2fef0 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  er all WhereLoop
2ff00 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73  s from outer-mos
2ff10 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d  t down to inner-
2ff20 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62  most */.  if( ob
2ff30 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65  Sat==obDone ) re
2ff40 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 21 69  turn 1;.  if( !i
2ff50 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29  sOrderDistinct )
2ff60 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
2ff70 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65  urn -1;.}..#ifde
2ff80 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
2ff90 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75  BLED./* For debu
2ffa0 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20  gging use only: 
2ffb0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
2ffc0 63 68 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e  char *wherePathN
2ffd0 61 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a 70  ame(WherePath *p
2ffe0 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c  Path, int nLoop,
2fff0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73   WhereLoop *pLas
30000 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  t){.  static cha
30010 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69  r zName[65];.  i
30020 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
30030 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20   i<nLoop; i++){ 
30040 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68  zName[i] = pPath
30050 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b  ->aLoop[i]->cId;
30060 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29   }.  if( pLast )
30070 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c   zName[i++] = pL
30080 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d  ast->cId;.  zNam
30090 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  e[i] = 0;.  retu
300a0 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64  rn zName;.}.#end
300b0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  if.../*.** Given
300c0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65   the list of Whe
300d0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61  reLoop objects a
300e0 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  t pWInfo->pLoops
300f0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
30100 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69  * attempts to fi
30110 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  nd the lowest co
30120 73 74 20 70 61 74 68 20 74 68 61 74 20 76 69 73  st path that vis
30130 69 74 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f  its each WhereLo
30140 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69  op.** once.  Thi
30150 73 20 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c  s path is then l
30160 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70  oaded into the p
30170 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f  WInfo->a[].pWLoo
30180 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20  p fields..**.** 
30190 41 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  Assume that the 
301a0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
301b0 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68 61 74  output rows that
301c0 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65   will need to be
301d0 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20   sorted.** will 
301e0 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e 20 74  be nRowEst (in t
301f0 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70 72 65  he 10*log2 repre
30200 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c  sentation).  Or,
30210 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a   ignore sorting.
30220 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52 6f 77  ** costs if nRow
30230 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65  Est==0..**.** Re
30240 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
30250 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53 51 4c  n success or SQL
30260 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d  ITE_NOMEM of a m
30270 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
30280 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
30290 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
302a0 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28  wherePathSolver(
302b0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
302c0 6f 2c 20 57 68 65 72 65 43 6f 73 74 20 6e 52 6f  o, WhereCost nRo
302d0 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43  wEst){.  int mxC
302e0 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20 20  hoice;          
302f0 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
30300 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e  mber of simultan
30310 65 6f 75 73 20 70 61 74 68 73 20 74 72 61 63 6b  eous paths track
30320 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  ed */.  int nLoo
30330 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
30340 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
30350 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  erms in the join
30360 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
30370 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
30380 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
30390 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
303a0 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
303b0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
303c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
303d0 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20    int iLoop;    
303e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
303f0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72  oop counter over
30400 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68   the terms of th
30410 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  e join */.  int 
30420 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20  ii, jj;         
30430 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
30440 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
30450 65 43 6f 73 74 20 72 43 6f 73 74 3b 20 20 20 20  eCost rCost;    
30460 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74           /* Cost
30470 20 6f 66 20 61 20 70 61 74 68 20 2a 2f 0a 20 20   of a path */.  
30480 57 68 65 72 65 43 6f 73 74 20 6d 78 43 6f 73 74  WhereCost mxCost
30490 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
304a0 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20  Maximum cost of 
304b0 61 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a  a set of paths *
304c0 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72 53  /.  WhereCost rS
304d0 6f 72 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20  ortCost;        
304e0 20 2f 2a 20 43 6f 73 74 20 74 6f 20 64 6f 20 61   /* Cost to do a
304f0 20 73 6f 72 74 20 2a 2f 0a 20 20 69 6e 74 20 6e   sort */.  int n
30500 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20  To, nFrom;      
30510 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
30520 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20  f valid entries 
30530 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72  in aTo[] and aFr
30540 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50  om[] */.  WhereP
30550 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20  ath *aFrom;     
30560 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d      /* All nFrom
30570 20 70 61 74 68 73 20 61 74 20 74 68 65 20 70 72   paths at the pr
30580 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a  evious level */.
30590 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f    WherePath *aTo
305a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
305b0 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68  he nTo best path
305c0 73 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  s at the current
305d0 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72   level */.  Wher
305e0 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20  ePath *pFrom;   
305f0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d        /* An elem
30600 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74  ent of aFrom[] t
30610 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69  hat we are worki
30620 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ng on */.  Where
30630 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20  Path *pTo;      
30640 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65       /* An eleme
30650 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74  nt of aTo[] that
30660 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
30670 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  on */.  WhereLoo
30680 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20  p *pWLoop;      
30690 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
306a0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
306b0 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  s */.  WhereLoop
306c0 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20   **pX;          
306d0 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79   /* Used to divy
306e0 20 75 70 20 74 68 65 20 70 53 70 61 63 65 20 6d   up the pSpace m
306f0 65 6d 6f 72 79 20 2a 2f 0a 20 20 63 68 61 72 20  emory */.  char 
30700 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  *pSpace;        
30710 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
30720 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  y memory used by
30730 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f   this routine */
30740 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ..  pParse = pWI
30750 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  nfo->pParse;.  d
30760 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
30770 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f    nLoop = pWInfo
30780 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54  ->nLevel;.  /* T
30790 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c  UNING: For simpl
307a0 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20  e queries, only 
307b0 74 68 65 20 62 65 73 74 20 70 61 74 68 20 69 73  the best path is
307c0 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46   tracked..  ** F
307d0 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20  or 2-way joins, 
307e0 74 68 65 20 35 20 62 65 73 74 20 70 61 74 68 73  the 5 best paths
307f0 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20   are followed.. 
30800 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66   ** For joins of
30810 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65   3 or more table
30820 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31 30 20  s, track the 10 
30830 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20  best paths */.  
30840 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f  mxChoice = (nLoo
30850 70 3d 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f  p==1) ? 1 : (nLo
30860 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b  op==2 ? 5 : 10);
30870 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70  .  assert( nLoop
30880 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  <=pWInfo->pTabLi
30890 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48  st->nSrc );.  WH
308a0 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 20  ERETRACE(0x002, 
308b0 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c  ("---- begin sol
308c0 76 65 72 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20  ver\n"));..  /* 
308d0 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
308e0 74 69 61 6c 69 7a 65 20 73 70 61 63 65 20 66 6f  tialize space fo
308f0 72 20 61 54 6f 20 61 6e 64 20 61 46 72 6f 6d 20  r aTo and aFrom 
30900 2a 2f 0a 20 20 69 69 20 3d 20 28 73 69 7a 65 6f  */.  ii = (sizeo
30910 66 28 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a  f(WherePath)+siz
30920 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a  eof(WhereLoop*)*
30930 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a  nLoop)*mxChoice*
30940 32 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71  2;.  pSpace = sq
30950 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
30960 28 64 62 2c 20 69 69 29 3b 0a 20 20 69 66 28 20  (db, ii);.  if( 
30970 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75  pSpace==0 ) retu
30980 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
30990 0a 20 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50  .  aTo = (WhereP
309a0 61 74 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61  ath*)pSpace;.  a
309b0 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f  From = aTo+mxCho
309c0 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46  ice;.  memset(aF
309d0 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  rom, 0, sizeof(a
309e0 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20  From[0]));.  pX 
309f0 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28  = (WhereLoop**)(
30a00 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b  aFrom+mxChoice);
30a10 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69  .  for(ii=mxChoi
30a20 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b  ce*2, pFrom=aTo;
30a30 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72   ii>0; ii--, pFr
30a40 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f  om++, pX += nLoo
30a50 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61  p){.    pFrom->a
30a60 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 0a  Loop = pX;.  }..
30a70 20 20 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65    /* Seed the se
30a80 61 72 63 68 20 77 69 74 68 20 61 20 73 69 6e 67  arch with a sing
30a90 6c 65 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e  le WherePath con
30aa0 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65  taining zero Whe
30ab0 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20  reLoops..  **.  
30ac0 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f  ** TUNING: Do no
30ad0 74 20 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72  t let the number
30ae0 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67   of iterations g
30af0 6f 20 61 62 6f 76 65 20 32 35 2e 20 20 49 66 20  o above 25.  If 
30b00 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66  the cost.  ** of
30b10 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75   computing an au
30b20 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73  tomatic index is
30b30 20 6e 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77   not paid back w
30b40 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20  ithin the first 
30b50 32 35 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68  25.  ** rows, th
30b60 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68  en do not use th
30b70 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
30b80 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d  x. */.  aFrom[0]
30b90 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72  .nRow = MIN(pPar
30ba0 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20  se->nQueryLoop, 
30bb0 34 36 29 3b 20 20 61 73 73 65 72 74 28 20 34 36  46);  assert( 46
30bc0 3d 3d 77 68 65 72 65 43 6f 73 74 28 32 35 29 20  ==whereCost(25) 
30bd0 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a  );.  nFrom = 1;.
30be0 0a 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74 65  .  /* Precompute
30bf0 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72   the cost of sor
30c00 74 69 6e 67 20 74 68 65 20 66 69 6e 61 6c 20 72  ting the final r
30c10 65 73 75 6c 74 20 73 65 74 2c 20 69 66 20 74 68  esult set, if th
30c20 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 74 6f  e caller.  ** to
30c30 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
30c40 69 6e 28 29 20 77 61 73 20 63 6f 6e 63 65 72 6e  in() was concern
30c50 65 64 20 61 62 6f 75 74 20 73 6f 72 74 69 6e 67  ed about sorting
30c60 20 2a 2f 0a 20 20 72 53 6f 72 74 43 6f 73 74 20   */.  rSortCost 
30c70 3d 20 30 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  = 0;.  if( pWInf
30c80 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  o->pOrderBy==0 |
30c90 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a  | nRowEst==0 ){.
30ca0 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f      aFrom[0].isO
30cb0 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b  rderedValid = 1;
30cc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
30cd0 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74   TUNING: Estimat
30ce0 65 64 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69  ed cost of sorti
30cf0 6e 67 20 69 73 20 4e 2a 6c 6f 67 32 28 4e 29 20  ng is N*log2(N) 
30d00 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 0a 20  where N is the. 
30d10 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
30d20 6f 75 74 70 75 74 20 72 6f 77 73 2e 20 2a 2f 0a  output rows. */.
30d30 20 20 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20      rSortCost = 
30d40 6e 52 6f 77 45 73 74 20 2b 20 65 73 74 4c 6f 67  nRowEst + estLog
30d50 28 6e 52 6f 77 45 73 74 29 3b 0a 20 20 20 20 57  (nRowEst);.    W
30d60 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c  HERETRACE(0x002,
30d70 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74  ("---- sort cost
30d80 3d 25 2d 33 64 5c 6e 22 2c 20 72 53 6f 72 74 43  =%-3d\n", rSortC
30d90 6f 73 74 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ost));.  }..  /*
30da0 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73   Compute success
30db0 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65  ively longer Whe
30dc0 72 65 50 61 74 68 73 20 75 73 69 6e 67 20 74 68  rePaths using th
30dd0 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72  e previous gener
30de0 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68  ation.  ** of Wh
30df0 65 72 65 50 61 74 68 73 20 61 73 20 74 68 65 20  erePaths as the 
30e00 62 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65  basis for the ne
30e10 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20  xt.  Keep track 
30e20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a  of the mxChoice.
30e30 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20    ** best paths 
30e40 61 74 20 65 61 63 68 20 67 65 6e 65 72 61 74 69  at each generati
30e50 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f  on */.  for(iLoo
30e60 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70  p=0; iLoop<nLoop
30e70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20  ; iLoop++){.    
30e80 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  nTo = 0;.    for
30e90 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72  (ii=0, pFrom=aFr
30ea0 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69  om; ii<nFrom; ii
30eb0 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
30ec0 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70      for(pWLoop=p
30ed0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70  WInfo->pLoops; p
30ee0 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57  WLoop; pWLoop=pW
30ef0 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29  Loop->pNextLoop)
30f00 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  {.        Bitmas
30f10 6b 20 6d 61 73 6b 4e 65 77 3b 0a 20 20 20 20 20  k maskNew;.     
30f20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61     Bitmask revMa
30f30 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sk = 0;.        
30f40 75 38 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69  u8 isOrderedVali
30f50 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64  d = pFrom->isOrd
30f60 65 72 65 64 56 61 6c 69 64 3b 0a 20 20 20 20 20  eredValid;.     
30f70 20 20 20 75 38 20 69 73 4f 72 64 65 72 65 64 20     u8 isOrdered 
30f80 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72  = pFrom->isOrder
30f90 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ed;.        if( 
30fa0 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20  (pWLoop->prereq 
30fb0 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f  & ~pFrom->maskLo
30fc0 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  op)!=0 ) continu
30fd0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
30fe0 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
30ff0 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   & pFrom->maskLo
31000 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  op)!=0 ) continu
31010 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  e;.        /* At
31020 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c   this point, pWL
31030 6f 6f 70 20 69 73 20 61 20 63 61 6e 64 69 64 61  oop is a candida
31040 74 65 20 74 6f 20 62 65 20 74 68 65 20 6e 65 78  te to be the nex
31050 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20  t loop. .       
31060 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74 73 20   ** Compute its 
31070 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  cost */.        
31080 72 43 6f 73 74 20 3d 20 77 68 65 72 65 43 6f 73  rCost = whereCos
31090 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65  tAdd(pWLoop->rSe
310a0 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e  tup,pWLoop->rRun
310b0 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b   + pFrom->nRow);
310c0 0a 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d  .        rCost =
310d0 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 72 43   whereCostAdd(rC
310e0 6f 73 74 2c 20 70 46 72 6f 6d 2d 3e 72 43 6f 73  ost, pFrom->rCos
310f0 74 29 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  t);.        mask
31100 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73  New = pFrom->mas
31110 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e  kLoop | pWLoop->
31120 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
31130 20 20 69 66 28 20 21 69 73 4f 72 64 65 72 65 64    if( !isOrdered
31140 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Valid ){.       
31150 20 20 20 73 77 69 74 63 68 28 20 77 68 65 72 65     switch( where
31160 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
31170 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20  erBy(pWInfo,.   
31180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31190 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64      pWInfo->pOrd
311a0 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49  erBy, pFrom, pWI
311b0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c  nfo->wctrlFlags,
311c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
311d0 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70          iLoop, p
311e0 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29  WLoop, &revMask)
311f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31200 63 61 73 65 20 31 3a 20 20 2f 2a 20 59 65 73 2e  case 1:  /* Yes.
31210 20 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 64    pFrom+pWLoop d
31220 6f 65 73 20 73 61 74 69 73 66 79 20 74 68 65 20  oes satisfy the 
31230 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
31240 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
31250 20 69 73 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a   isOrdered = 1;.
31260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
31270 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31  OrderedValid = 1
31280 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
31290 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
312a0 20 20 20 63 61 73 65 20 30 3a 20 20 2f 2a 20 4e     case 0:  /* N
312b0 6f 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70  o.  pFrom+pWLoop
312c0 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
312d0 73 65 70 61 72 61 74 65 20 73 6f 72 74 20 2a 2f  separate sort */
312e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
312f0 73 4f 72 64 65 72 65 64 20 3d 20 30 3b 0a 20 20  sOrdered = 0;.  
31300 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
31310 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a  deredValid = 1;.
31320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 43                rC
31330 6f 73 74 20 3d 20 77 68 65 72 65 43 6f 73 74 41  ost = whereCostA
31340 64 64 28 72 43 6f 73 74 2c 20 72 53 6f 72 74 43  dd(rCost, rSortC
31350 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ost);.          
31360 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
31370 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
31380 2f 2a 20 43 61 6e 6e 6f 74 20 74 65 6c 6c 20 79  /* Cannot tell y
31390 65 74 2e 20 20 54 72 79 20 61 67 61 69 6e 20 6f  et.  Try again o
313a0 6e 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  n the next itera
313b0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
313c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
313d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
313e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
313f0 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f    revMask = pFro
31400 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20  m->revLoop;.    
31410 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
31420 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
31430 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62   pWLoop should b
31440 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6d  e added to the m
31450 78 43 68 6f 69 63 65 20 62 65 73 74 20 73 6f 20  xChoice best so 
31460 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  far */.        f
31470 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f  or(jj=0, pTo=aTo
31480 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20  ; jj<nTo; jj++, 
31490 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pTo++){.        
314a0 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c    if( pTo->maskL
314b0 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 20 26 26 20  oop==maskNew && 
314c0 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61  pTo->isOrderedVa
314d0 6c 69 64 3d 3d 69 73 4f 72 64 65 72 65 64 56 61  lid==isOrderedVa
314e0 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lid ){.         
314f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d     testcase( jj=
31500 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20  =nTo-1 );.      
31510 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
31520 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31530 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
31540 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20  j>=nTo ){.      
31550 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43      if( nTo>=mxC
31560 68 6f 69 63 65 20 26 26 20 72 43 6f 73 74 3e 3d  hoice && rCost>=
31570 6d 78 43 6f 73 74 20 29 7b 0a 23 69 66 64 65 66  mxCost ){.#ifdef
31580 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
31590 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20 20 20  LED.            
315a0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
315b0 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
315c0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
315d0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53  e3DebugPrintf("S
315e0 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 33  kip   %s cost=%3
315f0 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
31600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31610 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
31620 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
31630 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20  oop), rCost,.   
31640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
31650 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20  sOrderedValid ? 
31660 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27  (isOrdered ? 'Y'
31670 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a   : 'N') : '?');.
31680 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65              }.#e
31690 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
316a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
316b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
316c0 20 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 50 61   /* Add a new Pa
316d0 74 68 20 74 6f 20 74 68 65 20 61 54 6f 5b 5d 20  th to the aTo[] 
316e0 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  set */.         
316f0 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63   if( nTo<mxChoic
31700 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
31710 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65   /* Increase the
31720 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f   size of the aTo
31730 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20   set by one */. 
31740 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20             jj = 
31750 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  nTo++;.         
31760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31770 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20      /* New path 
31780 72 65 70 6c 61 63 65 73 20 74 68 65 20 70 72 69  replaces the pri
31790 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70  or worst to keep
317a0 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43   count below mxC
317b0 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20  hoice */.       
317c0 20 20 20 20 20 66 6f 72 28 6a 6a 3d 6e 54 6f 2d       for(jj=nTo-
317d0 31 3b 20 61 54 6f 5b 6a 6a 5d 2e 72 43 6f 73 74  1; aTo[jj].rCost
317e0 3c 6d 78 43 6f 73 74 3b 20 6a 6a 2d 2d 29 7b 20  <mxCost; jj--){ 
317f0 61 73 73 65 72 74 28 6a 6a 3e 30 29 3b 20 7d 0a  assert(jj>0); }.
31800 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31810 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54 6f        pTo = &aTo
31820 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48 45  [jj];.#ifdef WHE
31830 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
31840 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
31850 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
31860 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
31870 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
31880 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73  rintf("New    %s
31890 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65 72   cost=%-3d order
318a0 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
318b0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
318c0 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
318d0 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
318e0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
318f0 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c      isOrderedVal
31900 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20  id ? (isOrdered 
31910 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27  ? 'Y' : 'N') : '
31920 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ?');.          }
31930 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
31940 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
31950 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c   if( pTo->rCost<
31960 3d 72 43 6f 73 74 20 29 7b 0a 23 69 66 64 65 66  =rCost ){.#ifdef
31970 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
31980 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20 20 20  LED.            
31990 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
319a0 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
319b0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
319c0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
319d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319e0 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74   "Skip   %s cost
319f0 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c  =%-3d order=%c",
31a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31a10 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
31a20 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
31a30 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20  WLoop), rCost,. 
31a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a50 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20   isOrderedValid 
31a60 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27  ? (isOrdered ? '
31a70 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29  Y' : 'N') : '?')
31a80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
31a90 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
31aa0 74 66 28 22 20 20 20 76 73 20 25 73 20 63 6f 73  tf("   vs %s cos
31ab0 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 5c  t=%-3d order=%c\
31ac0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
31ad0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
31ae0 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
31af0 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
31b00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31b10 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
31b20 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e  edValid ? (pTo->
31b30 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20  isOrdered ? 'Y' 
31b40 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20  : 'N') : '?');. 
31b50 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e             }.#en
31b60 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
31b70 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72  testcase( pTo->r
31b80 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20  Cost==rCost );. 
31b90 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
31ba0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
31bb0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
31bc0 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d  ase( pTo->rCost=
31bd0 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20  =rCost+1 );.    
31be0 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 61        /* A new a
31bf0 6e 64 20 62 65 74 74 65 72 20 73 63 6f 72 65 20  nd better score 
31c00 66 6f 72 20 61 20 70 72 65 76 69 6f 75 73 6c 79  for a previously
31c10 20 63 72 65 61 74 65 64 20 65 71 75 69 76 61 6c   created equival
31c20 65 6e 74 20 70 61 74 68 20 2a 2f 0a 23 69 66 64  ent path */.#ifd
31c30 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
31c40 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20  ABLED.          
31c50 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
31c60 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
31c70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31c80 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
31c90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55 70               "Up
31ca0 64 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33  date %s cost=%-3
31cb0 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
31cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
31cd0 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
31ce0 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
31cf0 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20  , rCost,.       
31d00 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
31d10 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64  edValid ? (isOrd
31d20 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
31d30 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
31d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
31d50 75 67 50 72 69 6e 74 66 28 22 20 20 77 61 73 20  ugPrintf("  was 
31d60 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64  %s cost=%-3d ord
31d70 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
31d80 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
31d90 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
31da0 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
31db0 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Cost,.          
31dc0 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
31dd0 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f  eredValid ? (pTo
31de0 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59  ->isOrdered ? 'Y
31df0 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b  ' : 'N') : '?');
31e00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
31e10 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  dif.        }.  
31e20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20        /* pWLoop 
31e30 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64  is a winner.  Ad
31e40 64 20 69 74 20 74 6f 20 74 68 65 20 73 65 74 20  d it to the set 
31e50 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a  of best so far *
31e60 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d  /.        pTo->m
31e70 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d  askLoop = pFrom-
31e80 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f  >maskLoop | pWLo
31e90 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
31ea0 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f        pTo->revLo
31eb0 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20  op = revMask;.  
31ec0 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20        pTo->nRow 
31ed0 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20  = pFrom->nRow + 
31ee0 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20  pWLoop->nOut;.  
31ef0 20 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74        pTo->rCost
31f00 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20   = rCost;.      
31f10 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
31f20 56 61 6c 69 64 20 3d 20 69 73 4f 72 64 65 72 65  Valid = isOrdere
31f30 64 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20  dValid;.        
31f40 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d  pTo->isOrdered =
31f50 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20   isOrdered;.    
31f60 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e      memcpy(pTo->
31f70 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c  aLoop, pFrom->aL
31f80 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72  oop, sizeof(Wher
31f90 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a  eLoop*)*iLoop);.
31fa0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f          pTo->aLo
31fb0 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f  op[iLoop] = pWLo
31fc0 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  op;.        if( 
31fd0 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b  nTo>=mxChoice ){
31fe0 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73  .          mxCos
31ff0 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74  t = aTo[0].rCost
32000 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
32010 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31  jj=1, pTo=&aTo[1
32020 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20  ]; jj<mxChoice; 
32030 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  jj++, pTo++){.  
32040 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
32050 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20  o->rCost>mxCost 
32060 29 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e  ) mxCost = pTo->
32070 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20  rCost;.         
32080 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
32090 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64     }.    }..#ifd
320a0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
320b0 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71  ABLED.    if( sq
320c0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3e  lite3WhereTrace>
320d0 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =2 ){.      sqli
320e0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
320f0 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64  ---- after round
32100 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f   %d ----\n", iLo
32110 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  op);.      for(i
32120 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69  i=0, pTo=aTo; ii
32130 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b  <nTo; ii++, pTo+
32140 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
32150 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
32160 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72   %s cost=%-3d nr
32170 6f 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63  ow=%-3d order=%c
32180 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 77 68  ",.           wh
32190 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c  erePathName(pTo,
321a0 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54   iLoop+1, 0), pT
321b0 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e  o->rCost, pTo->n
321c0 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Row,.           
321d0 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61  pTo->isOrderedVa
321e0 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72  lid ? (pTo->isOr
321f0 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e  dered ? 'Y' : 'N
32200 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
32210 20 20 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72     if( pTo->isOr
32220 64 65 72 65 64 56 61 6c 69 64 20 26 26 20 70 54  deredValid && pT
32230 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a  o->isOrdered ){.
32240 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
32250 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 72  3DebugPrintf(" r
32260 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54  ev=0x%llx\n", pT
32270 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20  o->revLoop);.   
32280 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
32290 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
322a0 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
322b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
322c0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
322d0 20 20 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20      /* Swap the 
322e0 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61  roles of aFrom a
322f0 6e 64 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e  nd aTo for the n
32300 65 78 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  ext generation *
32310 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54  /.    pFrom = aT
32320 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72  o;.    aTo = aFr
32330 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20  om;.    aFrom = 
32340 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d  pFrom;.    nFrom
32350 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69   = nTo;.  }..  i
32360 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20  f( nFrom==0 ){. 
32370 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
32380 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71  sg(pParse, "no q
32390 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b  uery solution");
323a0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
323b0 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a  ee(db, pSpace);.
323c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
323d0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a  E_ERROR;.  }.  .
323e0 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f    /* Find the lo
323f0 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20  west cost path. 
32400 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c   pFrom will be l
32410 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
32420 74 68 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70  that path */.  p
32430 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20  From = aFrom;.  
32440 61 73 73 65 72 74 28 20 6e 46 72 6f 6d 3d 3d 31  assert( nFrom==1
32450 20 29 3b 0a 23 69 66 20 30 20 2f 2a 20 54 68 65   );.#if 0 /* The
32460 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6e 65   following is ne
32470 65 64 65 64 20 69 66 20 6e 46 72 6f 6d 20 69 73  eded if nFrom is
32480 20 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20   ever more than 
32490 31 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 31 3b  1 */.  for(ii=1;
324a0 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29   ii<nFrom; ii++)
324b0 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  {.    if( pFrom-
324c0 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d  >rCost>aFrom[ii]
324d0 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d  .rCost ) pFrom =
324e0 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d   &aFrom[ii];.  }
324f0 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
32500 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
32510 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20  ==nLoop );.  /* 
32520 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20  Load the lowest 
32530 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70  cost path into p
32540 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69  WInfo */.  for(i
32550 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c  Loop=0; iLoop<nL
32560 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20  oop; iLoop++){. 
32570 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70     WhereLevel *p
32580 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e  Level = pWInfo->
32590 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70  a + iLoop;.    p
325a0 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20  Level->pWLoop = 
325b0 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e  pWLoop = pFrom->
325c0 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20  aLoop[iLoop];.  
325d0 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20    pLevel->iFrom 
325e0 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a  = pWLoop->iTab;.
325f0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62      pLevel->iTab
32600 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Cur = pWInfo->pT
32610 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
32620 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72  ->iFrom].iCursor
32630 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57 49  ;.  }.  if( (pWI
32640 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
32650 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
32660 54 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26 20  TINCT)!=0.   && 
32670 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
32680 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
32690 49 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26 26  INCTBY)==0.   &&
326a0 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
326b0 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e  ct==WHERE_DISTIN
326c0 43 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52  CT_NOOP.   && nR
326d0 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42  owEst.  ){.    B
326e0 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a  itmask notUsed;.
326f0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65      int rc = whe
32700 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
32710 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70  rderBy(pWInfo, p
32720 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65  WInfo->pResultSe
32730 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20  t, pFrom,.      
32740 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
32750 5f 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f  _DISTINCTBY, nLo
32760 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  op-1, pFrom->aLo
32770 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f  op[nLoop-1], &no
32780 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20  tUsed);.    if( 
32790 72 63 3d 3d 31 20 29 20 70 57 49 6e 66 6f 2d 3e  rc==1 ) pWInfo->
327a0 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
327b0 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
327c0 45 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46  ED;.  }.  if( pF
327d0 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 20 29  rom->isOrdered )
327e0 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  {.    if( pWInfo
327f0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
32800 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
32810 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
32820 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
32830 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
32840 52 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  RED;.    }else{.
32850 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f        pWInfo->bO
32860 42 53 61 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  BSat = 1;.      
32870 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20  pWInfo->revMask 
32880 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70  = pFrom->revLoop
32890 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57  ;.    }.  }.  pW
328a0 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20  Info->nRowOut = 
328b0 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20  pFrom->nRow;..  
328c0 2f 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72  /* Free temporar
328d0 79 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74  y memory and ret
328e0 75 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20  urn success */. 
328f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
32900 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65  b, pSpace);.  re
32910 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
32920 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75  }../*.** Most qu
32930 65 72 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61  eries use only a
32940 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74   single table (t
32950 68 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e  hey are not join
32960 73 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73  s) and have.** s
32970 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61  imple == constra
32980 69 6e 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64  ints against ind
32990 65 78 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68  exed fields.  Th
329a0 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
329b0 70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74  pts.** to plan t
329c0 68 6f 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65  hose simple case
329d0 73 20 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73  s using much les
329e0 73 20 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20  s ceremony than 
329f0 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70  the.** general-p
32a00 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61  urpose query pla
32a10 6e 6e 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62  nner, and thereb
32a20 79 20 79 69 65 6c 64 20 66 61 73 74 65 72 20 73  y yield faster s
32a30 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29  qlite3_prepare()
32a40 0a 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68  .** times for th
32a50 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a  e common case..*
32a60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  *.** Return non-
32a70 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c  zero on success,
32a80 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20 63   if this query c
32a90 61 6e 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79  an be handled by
32aa0 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c   this.** no-fril
32ab0 6c 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  ls query planner
32ac0 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69  .  Return zero i
32ad0 66 20 74 68 69 73 20 71 75 65 72 79 20 6e 65 65  f this query nee
32ae0 64 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72  ds the .** gener
32af0 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79  al-purpose query
32b00 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61   planner..*/.sta
32b10 74 69 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f  tic int whereSho
32b20 72 74 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42  rtCut(WhereLoopB
32b30 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
32b40 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
32b50 70 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  pWInfo;.  struct
32b60 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
32b70 49 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61  Item;.  WhereCla
32b80 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72  use *pWC;.  Wher
32b90 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
32ba0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
32bb0 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20  ;.  int iCur;.  
32bc0 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a  int j;.  Table *
32bd0 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70  pTab;.  Index *p
32be0 49 64 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f  Idx;.  .  pWInfo
32bf0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
32c00 6e 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  nfo;.  if( pWInf
32c10 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
32c20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c  WHERE_FORCE_TABL
32c30 45 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  E ) return 0;.  
32c40 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
32c50 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d  pTabList->nSrc>=
32c60 31 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70  1 );.  pItem = p
32c70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
32c80 3e 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74  >a;.  pTab = pIt
32c90 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20  em->pTab;.  if( 
32ca0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
32cb0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
32cc0 28 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20  ( pItem->zIndex 
32cd0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43  ) return 0;.  iC
32ce0 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  ur = pItem->iCur
32cf0 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57  sor;.  pWC = &pW
32d00 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f  Info->sWC;.  pLo
32d10 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  op = pBuilder->p
32d20 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  New;.  pLoop->ws
32d30 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 54 65  Flags = 0;.  pTe
32d40 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
32d50 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20  C, iCur, -1, 0, 
32d60 57 4f 5f 45 51 2c 20 30 29 3b 0a 20 20 69 66 28  WO_EQ, 0);.  if(
32d70 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 70 4c   pTerm ){.    pL
32d80 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
32d90 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
32da0 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f  HERE_IPK|WHERE_O
32db0 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70  NEROW;.    pLoop
32dc0 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
32dd0 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  erm;.    pLoop->
32de0 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
32df0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
32e00 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54  Eq = 1;.    /* T
32e10 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61  UNING: Cost of a
32e20 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73   rowid lookup is
32e30 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70   10 */.    pLoop
32e40 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a  ->rRun = 33;  /*
32e50 20 33 33 3d 3d 77 68 65 72 65 43 6f 73 74 28 31   33==whereCost(1
32e60 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  0) */.  }else{. 
32e70 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
32e80 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
32e90 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
32ea0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
32eb0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70   pLoop->aLTermSp
32ec0 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65  ace==pLoop->aLTe
32ed0 72 6d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  rm );.      asse
32ee0 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70 4c  rt( ArraySize(pL
32ef0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  oop->aLTermSpace
32f00 29 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 69 66  )==4 );.      if
32f10 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
32f20 3d 4f 45 5f 4e 6f 6e 65 20 0a 20 20 20 20 20 20  =OE_None .      
32f30 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49   || pIdx->pPartI
32f40 64 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20 20  dxWhere!=0 .    
32f50 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 43 6f 6c     || pIdx->nCol
32f60 75 6d 6e 3e 41 72 72 61 79 53 69 7a 65 28 70 4c  umn>ArraySize(pL
32f70 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  oop->aLTermSpace
32f80 29 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74 69  ) .      ) conti
32f90 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  nue;.      for(j
32fa0 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; j<pIdx->nCol
32fb0 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
32fc0 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
32fd0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70  erm(pWC, iCur, p
32fe0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
32ff0 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78  , 0, WO_EQ, pIdx
33000 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
33010 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Term==0 ) break;
33020 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
33030 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72  aLTerm[j] = pTer
33040 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
33050 20 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 43   if( j!=pIdx->nC
33060 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65  olumn ) continue
33070 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77  ;.      pLoop->w
33080 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
33090 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f  OLUMN_EQ|WHERE_O
330a0 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45  NEROW|WHERE_INDE
330b0 58 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20 28  XED;.      if( (
330c0 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26  pItem->colUsed &
330d0 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78   ~columnsInIndex
330e0 28 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20  (pIdx))==0 ){.  
330f0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46        pLoop->wsF
33100 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44  lags |= WHERE_ID
33110 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a  X_ONLY;.      }.
33120 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54        pLoop->nLT
33130 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70  erm = j;.      p
33140 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
33150 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f  q = j;.      pLo
33160 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
33170 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  ex = pIdx;.     
33180 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
33190 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64   of a unique ind
331a0 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20  ex lookup is 15 
331b0 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  */.      pLoop->
331c0 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33  rRun = 39;  /* 3
331d0 39 3d 3d 77 68 65 72 65 43 6f 73 74 28 31 35 29  9==whereCost(15)
331e0 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
331f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
33200 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
33210 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  ){.    pLoop->nO
33220 75 74 20 3d 20 28 57 68 65 72 65 43 6f 73 74 29  ut = (WhereCost)
33230 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  1;.    pWInfo->a
33240 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f  [0].pWLoop = pLo
33250 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d  op;.    pLoop->m
33260 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73  askSelf = getMas
33270 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
33280 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  Set, iCur);.    
33290 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61  pWInfo->a[0].iTa
332a0 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20  bCur = iCur;.   
332b0 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
332c0 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57   = 1;.    if( pW
332d0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
332e0 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20   pWInfo->bOBSat 
332f0 3d 20 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57  =  1;.    if( pW
33300 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
33310 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
33320 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20  STINCT ){.      
33330 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
33340 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
33350 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  CT_UNIQUE;.    }
33360 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
33370 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  EBUG.    pLoop->
33380 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69  cId = '0';.#endi
33390 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  f.    return 1;.
333a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
333b0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
333c0 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  e the beginning 
333d0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64  of the loop used
333e0 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73   for WHERE claus
333f0 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
33400 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
33410 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
33420 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75  o an opaque stru
33430 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
33440 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  ins.** informati
33450 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72  on needed to ter
33460 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
33470 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c    Later, the cal
33480 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  ling routine.** 
33490 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71  should invoke sq
334a0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
334b0 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
334c0 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
334d0 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64  nction.** in ord
334e0 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  er to complete t
334f0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
33500 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
33510 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
33520 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69  curs, this routi
33530 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e  ne returns NULL.
33540 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63  .**.** The basic
33550 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61   idea is to do a
33560 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e   nested loop, on
33570 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20  e loop for each 
33580 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20  table in.** the 
33590 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
335a0 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52   select.  (INSER
335b0 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61  T and UPDATE sta
335c0 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a  tements are the.
335d0 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c  ** same as a SEL
335e0 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20  ECT with only a 
335f0 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
33600 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
33610 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  )  For.** exampl
33620 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73  e, if the SQL is
33630 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
33640 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
33650 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52   t1, t2, t3 WHER
33660 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  E ...;.**.** The
33670 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  n the code gener
33680 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75  ated is conceptu
33690 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f  ally like the fo
336a0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
336b0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
336c0 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20   in t1 do       
336d0 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
336e0 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f  ted.**        fo
336f0 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
33700 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20   do      |-- by 
33710 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
33720 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  n().**          
33730 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20  foreach row3 in 
33740 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20  t3 do   /.**    
33750 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
33760 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
33770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33780 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
33790 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e  ted.**        en
337a0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
337b0 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20           |-- by 
337c0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
337d0 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20  ).**      end   
337e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
337f0 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f        /.**.** No
33800 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70  te that the loop
33810 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e  s might not be n
33820 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ested in the ord
33830 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79  er in which they
33840 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68  .** appear in th
33850 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66  e FROM clause if
33860 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64   a different ord
33870 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62 6c  er is better abl
33880 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65  e to make.** use
33890 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f   of indices.  No
338a0 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65  te also that whe
338b0 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  n the IN operato
338c0 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20  r appears in.** 
338d0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
338e0 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c  , it might resul
338f0 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  t in additional 
33900 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72  nested loops for
33910 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  .** scanning thr
33920 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20  ough all values 
33930 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
33940 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  d side of the IN
33950 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
33960 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20  e Btree cursors 
33970 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
33980 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20  each table.  t1 
33990 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e  uses cursor.** n
339a0 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e  umber pTabList->
339b0 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74  a[0].iCursor.  t
339c0 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f  2 uses the curso
339d0 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d  r pTabList->a[1]
339e0 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64  .iCursor..** And
339f0 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73   so forth.  This
33a00 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
33a10 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20  es code to open 
33a20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f  those VDBE curso
33a30 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  rs.** and sqlite
33a40 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65  3WhereEnd() gene
33a50 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  rates the code t
33a60 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a  o close them..**
33a70 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61  .** The code tha
33a80 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  t sqlite3WhereBe
33a90 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20  gin() generates 
33aa0 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f  leaves the curso
33ab0 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70  rs named.** in p
33ac0 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67  TabList pointing
33ad0 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70   at their approp
33ae0 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20  riate entries.  
33af0 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a  The [...] code.*
33b00 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c  * can use OP_Col
33b10 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64  umn and OP_Rowid
33b20 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73   opcodes on thes
33b30 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74  e cursors to ext
33b40 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f  ract.** data fro
33b50 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61  m the various ta
33b60 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  bles of the loop
33b70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57  ..**.** If the W
33b80 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65  HERE clause is e
33b90 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63  mpty, the foreac
33ba0 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63  h loops must eac
33bb0 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20  h scan their.** 
33bc0 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20  entire tables.  
33bd0 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79  Thus a three-way
33be0 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e   join is an O(N^
33bf0 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  3) operation.  B
33c00 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  ut if.** the tab
33c10 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73  les have indices
33c20 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74   and there are t
33c30 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
33c40 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a  E clause that.**
33c50 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20   refer to those 
33c60 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c  indices, a compl
33c70 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63  ete table scan c
33c80 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e  an be avoided an
33c90 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69  d the.** code wi
33ca0 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74  ll run much fast
33cb0 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65  er.  Most of the
33cc0 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f   work of this ro
33cd0 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e  utine is checkin
33ce0 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74  g.** to see if t
33cf0 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73  here are indices
33d00 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
33d10 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68  d to speed up th
33d20 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65  e loop..**.** Te
33d30 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
33d40 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f   clause are also
33d50 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77   used to limit w
33d60 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c  hich rows actual
33d70 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f  ly.** make it to
33d80 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68   the "..." in th
33d90 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20  e middle of the 
33da0 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63  loop.  After eac
33db0 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20  h "foreach",.** 
33dc0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
33dd0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75  RE clause that u
33de0 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e  se only terms in
33df0 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f   that loop and o
33e00 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72  uter.** loops ar
33e10 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  e evaluated and 
33e20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20  if false a jump 
33e30 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61  is made around a
33e40 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  ll subsequent.**
33e50 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72   inner loops (or
33e60 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e   around the "...
33e70 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63  " if the test oc
33e80 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
33e90 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c  inner-.** most l
33ea0 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52  oop).**.** OUTER
33eb0 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20   JOINS.**.** An 
33ec0 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61  outer join of ta
33ed0 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69  bles t1 and t2 i
33ee0 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f  s conceptally co
33ef0 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ded as follows:.
33f00 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68  **.**    foreach
33f10 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a   row1 in t1 do.*
33f20 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a  *      flag = 0.
33f30 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
33f40 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a  row2 in t2 do.**
33f50 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a          start:.*
33f60 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a  *          ....*
33f70 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  *          flag 
33f80 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a  = 1.**      end.
33f90 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d  **      if flag=
33fa0 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  =0 then.**      
33fb0 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20    move the row2 
33fc0 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c  cursor to a null
33fd0 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67   row.**        g
33fe0 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20  oto start.**    
33ff0 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a    fi.**    end.*
34000 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c  *.** ORDER BY CL
34010 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a  AUSE PROCESSING.
34020 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69  **.** pOrderBy i
34030 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
34040 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
34050 73 65 20 28 6f 72 20 74 68 65 20 47 52 4f 55 50  se (or the GROUP
34060 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66   BY clause.** if
34070 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50   the WHERE_GROUP
34080 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  BY flag is set i
34090 6e 20 77 63 74 72 6c 46 6c 61 67 73 29 20 6f 66  n wctrlFlags) of
340a0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
340b0 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ent.** if there 
340c0 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72  is one.  If ther
340d0 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
340e0 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68   clause or if th
340f0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
34100 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20   called from an 
34110 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
34120 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
34130 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c   pOrderBy is NUL
34140 4c 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20  L..*/.WhereInfo 
34150 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67  *sqlite3WhereBeg
34160 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  in(.  Parse *pPa
34170 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  rse,        /* T
34180 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
34190 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
341a0 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20  pTabList,    /* 
341b0 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c  FROM clause: A l
341c0 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ist of all table
341d0 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  s to be scanned 
341e0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
341f0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
34200 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
34210 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
34220 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20  rderBy,   /* An 
34230 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
34240 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   or NULL */.  Ex
34250 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53  prList *pResultS
34260 65 74 2c 20 2f 2a 20 52 65 73 75 6c 74 20 73 65  et, /* Result se
34270 74 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  t of the query *
34280 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
34290 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  gs,       /* One
342a0 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20   of the WHERE_* 
342b0 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e  flags defined in
342c0 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a   sqliteInt.h */.
342d0 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 20 20    int iIdxCur   
342e0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48          /* If WH
342f0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
34300 59 20 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20  Y is set, index 
34310 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f  cursor number */
34320 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57  .){.  int nByteW
34330 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
34340 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61   /* Num. bytes a
34350 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65  llocated for Whe
34360 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f  reInfo struct */
34370 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b  .  int nTabList;
34380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34390 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
343a0 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20  nts in pTabList 
343b0 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
343c0 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
343d0 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74  /* Will become t
343e0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
343f0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
34400 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
34410 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
34420 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
34430 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20  database engine 
34440 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
34450 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
34460 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20  /* Cursors that 
34470 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69  are not yet posi
34480 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72  tioned */.  Wher
34490 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c  eLoopBuilder sWL
344a0 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  B;     /* The Wh
344b0 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20  ereLoop builder 
344c0 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
344d0 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
344e0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
344f0 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20  n mask set */.  
34500 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
34510 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20  el;        /* A 
34520 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
34530 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20  pWInfo->a[] */. 
34540 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
34550 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  p;          /* P
34560 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67  ointer to a sing
34570 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  le WhereLoop obj
34580 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b  ect */.  int ii;
34590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345a0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
345b0 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ter */.  sqlite3
345c0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
345d0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
345e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
345f0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
34600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
34610 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 0a 20  turn code */... 
34620 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 6e 69   /* Variable ini
34630 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  tialization */. 
34640 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
34650 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42  ;.  memset(&sWLB
34660 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42  , 0, sizeof(sWLB
34670 29 29 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65  ));.  sWLB.pOrde
34680 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
34690 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68  .  /* Disable th
346a0 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d  e DISTINCT optim
346b0 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54  ization if SQLIT
346c0 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73  E_DistinctOpt is
346d0 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71   set via.  ** sq
346e0 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28  lite3_test_ctrl(
346f0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
34700 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e  OPTIMIZATIONS,..
34710 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  .) */.  if( Opti
34720 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
34730 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74  (db, SQLITE_Dist
34740 69 6e 63 74 4f 70 74 29 20 29 7b 0a 20 20 20 20  inctOpt) ){.    
34750 77 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57  wctrlFlags &= ~W
34760 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
34770 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  CT;.  }..  /* Th
34780 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c  e number of tabl
34790 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
347a0 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
347b0 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   by the number o
347c0 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61  f.  ** bits in a
347d0 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20   Bitmask .  */. 
347e0 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 4c   testcase( pTabL
347f0 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29  ist->nSrc==BMS )
34800 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  ;.  if( pTabList
34810 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20  ->nSrc>BMS ){.  
34820 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
34830 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f  g(pParse, "at mo
34840 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20  st %d tables in 
34850 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20  a join", BMS);. 
34860 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
34870 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
34880 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65  tion normally ge
34890 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74 65 64  nerates a nested
348a0 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61   loop for all ta
348b0 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54  bles in .  ** pT
348c0 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20  abList.  But if 
348d0 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  the WHERE_ONETAB
348e0 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20  LE_ONLY flag is 
348f0 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f  set, then we sho
34900 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65  uld.  ** only ge
34910 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
34920 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65 20  the first table 
34930 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20  in pTabList and 
34940 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a  assume that.  **
34950 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73   any cursors ass
34960 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 75 62  ociated with sub
34970 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61  sequent tables a
34980 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  re uninitialized
34990 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73  ..  */.  nTabLis
349a0 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20  t = (wctrlFlags 
349b0 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
349c0 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54 61  _ONLY) ? 1 : pTa
349d0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20  bList->nSrc;..  
349e0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
349f0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57  initialize the W
34a00 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
34a10 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  re that will bec
34a20 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74  ome the.  ** ret
34a30 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e  urn value. A sin
34a40 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  gle allocation i
34a50 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
34a60 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20  the WhereInfo.  
34a70 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20 63  ** struct, the c
34a80 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65  ontents of Where
34a90 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68  Info.a[], the Wh
34aa0 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
34ab0 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ure.  ** and the
34ac0 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74   WhereMaskSet st
34ad0 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57  ructure. Since W
34ae0 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61  hereClause conta
34af0 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20  ins an 8-byte.  
34b00 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20 42  ** field (type B
34b10 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20  itmask) it must 
34b20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e  be aligned on an
34b30 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79   8-byte boundary
34b40 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72   on.  ** some ar
34b50 63 68 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e  chitectures. Hen
34b60 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20  ce the ROUND8() 
34b70 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42  below..  */.  nB
34b80 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44  yteWInfo = ROUND
34b90 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e  8(sizeof(WhereIn
34ba0 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29  fo)+(nTabList-1)
34bb0 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76  *sizeof(WhereLev
34bc0 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  el));.  pWInfo =
34bd0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
34be0 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 57 49  Zero(db, nByteWI
34bf0 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68 65  nfo + sizeof(Whe
34c00 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20  reLoop));.  if( 
34c10 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
34c20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
34c30 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  bFree(db, pWInfo
34c40 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  );.    pWInfo = 
34c50 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  0;.    goto wher
34c60 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
34c70 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  .  pWInfo->nLeve
34c80 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20  l = nTabList;.  
34c90 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d  pWInfo->pParse =
34ca0 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66   pParse;.  pWInf
34cb0 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54  o->pTabList = pT
34cc0 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
34cd0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
34ce0 64 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d  derBy;.  pWInfo-
34cf0 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 70 52  >pResultSet = pR
34d00 65 73 75 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e  esultSet;.  pWIn
34d10 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c  fo->iBreak = sql
34d20 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
34d30 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  l(v);.  pWInfo->
34d40 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74  wctrlFlags = wct
34d50 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66  rlFlags;.  pWInf
34d60 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  o->savedNQueryLo
34d70 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75  op = pParse->nQu
34d80 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b  eryLoop;.  pMask
34d90 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  Set = &pWInfo->s
34da0 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e  MaskSet;.  sWLB.
34db0 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b  pWInfo = pWInfo;
34dc0 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70  .  sWLB.pWC = &p
34dd0 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57  WInfo->sWC;.  sW
34de0 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65  LB.pNew = (Where
34df0 4c 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a 29 70  Loop*)(((char*)p
34e00 57 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66  WInfo)+nByteWInf
34e10 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  o);.  assert( EI
34e20 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
34e30 4e 54 28 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b  NT(sWLB.pNew) );
34e40 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  .  whereLoopInit
34e50 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66  (sWLB.pNew);.#if
34e60 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
34e70 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49  .  sWLB.pNew->cI
34e80 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a  d = '*';.#endif.
34e90 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20  .  /* Split the 
34ea0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74  WHERE clause int
34eb0 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78  o separate subex
34ec0 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20  pressions where 
34ed0 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70  each.  ** subexp
34ee0 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
34ef0 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f  ated by an AND o
34f00 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20  perator..  */.  
34f10 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73  initMaskSet(pMas
34f20 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c  kSet);.  whereCl
34f30 61 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f  auseInit(&pWInfo
34f40 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a  ->sWC, pWInfo);.
34f50 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
34f60 65 43 6f 6e 73 74 61 6e 74 73 28 70 50 61 72 73  eConstants(pPars
34f70 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 77 68  e, pWhere);.  wh
34f80 65 72 65 53 70 6c 69 74 28 26 70 57 49 6e 66 6f  ereSplit(&pWInfo
34f90 2d 3e 73 57 43 2c 20 70 57 68 65 72 65 2c 20 54  ->sWC, pWhere, T
34fa0 4b 5f 41 4e 44 29 3b 0a 20 20 73 71 6c 69 74 65  K_AND);.  sqlite
34fb0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
34fc0 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f  a(pParse, -1); /
34fd0 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63 6f 6f  * Insert the coo
34fe0 6b 69 65 20 76 65 72 69 66 69 65 72 20 47 6f 74  kie verifier Got
34ff0 6f 20 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a 20 53  o */.    .  /* S
35000 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57  pecial case: a W
35010 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
35020 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45   is constant.  E
35030 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a  valuate the.  **
35040 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
35050 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72  either jump over
35060 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65   all of the code
35070 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20   or fall thru.. 
35080 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65   */.  if( pWhere
35090 20 26 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30   && (nTabList==0
350a0 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49   || sqlite3ExprI
350b0 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
350c0 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20  (pWhere)) ){.   
350d0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
350e0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57 68 65  lse(pParse, pWhe
350f0 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  re, pWInfo->iBre
35100 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ak, SQLITE_JUMPI
35110 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65  FNULL);.    pWhe
35120 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  re = 0;.  }..  /
35130 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
35140 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  No FROM clause. 
35150 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c 69   */.  if( nTabLi
35160 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  st==0 ){.    if(
35170 20 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e   pOrderBy ) pWIn
35180 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 31 3b 0a  fo->bOBSat = 1;.
35190 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61      if( wctrlFla
351a0 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
351b0 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
351c0 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
351d0 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
351e0 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20  INCT_UNIQUE;.   
351f0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73   }.  }..  /* Ass
35200 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74  ign a bit from t
35210 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76  he bitmask to ev
35220 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ery term in the 
35230 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a  FROM clause..  *
35240 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73 73 69  *.  ** When assi
35250 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20 76 61  gning bitmask va
35260 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61  lues to FROM cla
35270 75 73 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  use cursors, it 
35280 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 74 68 65  must be.  ** the
35290 20 63 61 73 65 20 74 68 61 74 20 69 66 20 58 20   case that if X 
352a0 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  is the bitmask f
352b0 6f 72 20 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d  or the N-th FROM
352c0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 65   clause term the
352d0 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69 74 6d 61  n.  ** the bitma
352e0 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20  sk for all FROM 
352f0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 6f 20  clause terms to 
35300 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
35310 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69  N-th term.  ** i
35320 73 20 28 58 2d 31 29 2e 20 20 20 41 6e 20 65 78  s (X-1).   An ex
35330 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68  pression from th
35340 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61  e ON clause of a
35350 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75   LEFT JOIN can u
35360 73 65 0a 20 20 2a 2a 20 69 74 73 20 45 78 70 72  se.  ** its Expr
35370 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
35380 20 76 61 6c 75 65 20 74 6f 20 66 69 6e 64 20 74   value to find t
35390 68 65 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68  he bitmask of th
353a0 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20  e right table.  
353b0 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ** of the join. 
353c0 20 53 75 62 74 72 61 63 74 69 6e 67 20 6f 6e 65   Subtracting one
353d0 20 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74 20   from the right 
353e0 74 61 62 6c 65 20 62 69 74 6d 61 73 6b 20 67 69  table bitmask gi
353f0 76 65 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61  ves a.  ** bitma
35400 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  sk for all table
35410 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
35420 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77   the join.  Know
35430 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 0a  ing the bitmask.
35440 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62    ** for all tab
35450 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
35460 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69  of a left join i
35470 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69  s important.  Ti
35480 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a  cket #3015..  **
35490 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
354a0 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65  bitmasks are cre
354b0 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61  ated for all pTa
354c0 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c  bList->nSrc tabl
354d0 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c  es in.  ** pTabL
354e0 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68  ist, not just th
354f0 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74  e first nTabList
35500 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69   tables.  nTabLi
35510 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20  st is normally. 
35520 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61   ** equal to pTa
35530 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20  bList->nSrc but 
35540 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e  might be shorten
35550 65 64 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20  ed to 1 if the. 
35560 20 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42   ** WHERE_ONETAB
35570 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20  LE_ONLY flag is 
35580 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  set..  */.  for(
35590 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73  ii=0; ii<pTabLis
355a0 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a  t->nSrc; ii++){.
355b0 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70      createMask(p
355c0 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
355d0 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72  t->a[ii].iCursor
355e0 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  );.  }.#ifndef N
355f0 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69  DEBUG.  {.    Bi
35600 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20  tmask toTheLeft 
35610 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  = 0;.    for(ii=
35620 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e  0; ii<pTabList->
35630 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nSrc; ii++){.   
35640 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67     Bitmask m = g
35650 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
35660 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d   pTabList->a[ii]
35670 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .iCursor);.     
35680 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d   assert( (m-1)==
35690 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20  toTheLeft );.   
356a0 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20     toTheLeft |= 
356b0 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  m;.    }.  }.#en
356c0 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  dif..  /* Analyz
356d0 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62  e all of the sub
356e0 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f  expressions.  No
356f0 74 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c  te that exprAnal
35700 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a  yze() might.  **
35710 20 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c   add new virtual
35720 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20   terms onto the 
35730 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
35740 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20   clause.  We do 
35750 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f  not.  ** want to
35760 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76   analyze these v
35770 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f  irtual terms, so
35780 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67   start analyzing
35790 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a   at the end.  **
357a0 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72   and work forwar
357b0 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64  d so that the ad
357c0 64 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d  ded virtual term
357d0 73 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63  s are never proc
357e0 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78  essed..  */.  ex
357f0 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61  prAnalyzeAll(pTa
35800 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e  bList, &pWInfo->
35810 73 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  sWC);.  if( db->
35820 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
35830 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
35840 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20  ginError;.  }.. 
35850 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52   /* If the ORDER
35860 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
35870 29 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  ) clause contain
35880 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  s references to 
35890 67 65 6e 65 72 61 6c 0a 20 20 2a 2a 20 65 78 70  general.  ** exp
358a0 72 65 73 73 69 6f 6e 73 2c 20 74 68 65 6e 20 77  ressions, then w
358b0 65 20 77 6f 6e 27 74 20 62 65 20 61 62 6c 65 20  e won't be able 
358c0 74 6f 20 73 61 74 69 73 66 79 20 69 74 20 75 73  to satisfy it us
358d0 69 6e 67 20 69 6e 64 69 63 65 73 2c 20 73 6f 0a  ing indices, so.
358e0 20 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e    ** go ahead an
358f0 64 20 64 69 73 61 62 6c 65 20 69 74 20 6e 6f 77  d disable it now
35900 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
35910 64 65 72 42 79 20 26 26 20 28 77 63 74 72 6c 46  derBy && (wctrlF
35920 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
35930 54 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 20 29  T_DISTINCT)!=0 )
35940 7b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  {.    for(ii=0; 
35950 69 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  ii<pOrderBy->nEx
35960 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  pr; ii++){.     
35970 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73   Expr *pExpr = s
35980 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
35990 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e  llate(pOrderBy->
359a0 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  a[ii].pExpr);.  
359b0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
359c0 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p!=TK_COLUMN ){.
359d0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
359e0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
359f0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rBy = 0;.       
35a00 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
35a10 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69  lse if( pExpr->i
35a20 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
35a30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
35a40 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
35a50 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
35a60 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
35a70 49 4e 43 54 20 29 7b 0a 20 20 20 20 69 66 28 20  INCT ){.    if( 
35a80 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
35a90 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ant(pParse, pTab
35aa0 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  List, &pWInfo->s
35ab0 57 43 2c 20 70 52 65 73 75 6c 74 53 65 74 29 20  WC, pResultSet) 
35ac0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
35ad0 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e 67  DISTINCT marking
35ae0 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20   is pointless.  
35af0 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20  Ignore it. */.  
35b00 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
35b10 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
35b20 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
35b30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
35b40 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
35b50 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44 45    /* Try to ORDE
35b60 52 20 42 59 20 74 68 65 20 72 65 73 75 6c 74 20  R BY the result 
35b70 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69 73 74  set to make dist
35b80 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e 67 20  inct processing 
35b90 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20 20 20  easier */.      
35ba0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
35bb0 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49 53 54  gs |= WHERE_DIST
35bc0 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20 70 57  INCTBY;.      pW
35bd0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d  Info->pOrderBy =
35be0 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 20   pResultSet;.   
35bf0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e   }.  }..  /* Con
35c00 73 74 72 75 63 74 20 74 68 65 20 57 68 65 72 65  struct the Where
35c10 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Loop objects */.
35c20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
35c30 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  fff,("*** Optimi
35c40 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22  zer Start ***\n"
35c50 29 29 3b 0a 20 20 69 66 28 20 6e 54 61 62 4c 69  ));.  if( nTabLi
35c60 73 74 21 3d 31 20 7c 7c 20 77 68 65 72 65 53 68  st!=1 || whereSh
35c70 6f 72 74 43 75 74 28 26 73 57 4c 42 29 3d 3d 30  ortCut(&sWLB)==0
35c80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 68 65   ){.    rc = whe
35c90 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57  reLoopAddAll(&sW
35ca0 4c 42 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  LB);.    if( rc 
35cb0 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
35cc0 6e 45 72 72 6f 72 3b 0a 20 20 0a 20 20 20 20 2f  nError;.  .    /
35cd0 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66  * Display all of
35ce0 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   the WhereLoop o
35cf0 62 6a 65 63 74 73 20 69 66 20 77 68 65 72 65 74  bjects if wheret
35d00 72 61 63 65 20 69 73 20 65 6e 61 62 6c 65 64 20  race is enabled 
35d10 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  */.#ifdef WHERET
35d20 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
35d30 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
35d40 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eTrace ){.      
35d50 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20  WhereLoop *p;.  
35d60 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
35d70 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4c 61   static char zLa
35d80 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35 36  bel[] = "0123456
35d90 37 38 39 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d  789abcdefghijklm
35da0 6e 6f 70 71 72 73 74 75 76 77 79 78 7a 22 0a 20  nopqrstuvwyxz". 
35db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35dd0 20 20 20 20 20 20 22 41 42 43 44 45 46 47 48 49        "ABCDEFGHI
35de0 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58  JKLMNOPQRSTUVWYX
35df0 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d  Z";.      for(p=
35e00 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
35e10 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  i=0; p; p=p->pNe
35e20 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20  xtLoop, i++){.  
35e30 20 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a        p->cId = z
35e40 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a  Label[i%sizeof(z
35e50 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20  Label)];.       
35e60 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
35e70 70 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20  p, pTabList);.  
35e80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
35e90 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50  if.  .    whereP
35ea0 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f  athSolver(pWInfo
35eb0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62  , 0);.    if( db
35ec0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
35ed0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
35ee0 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70  Error;.    if( p
35ef0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
35f00 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65 50  ){.       whereP
35f10 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f  athSolver(pWInfo
35f20 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  , pWInfo->nRowOu
35f30 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28  t+1);.       if(
35f40 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
35f50 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
35f60 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ginError;.    }.
35f70 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f    }.  if( pWInfo
35f80 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ->pOrderBy==0 &&
35f90 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
35fa0 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65  LITE_ReverseOrde
35fb0 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57  r)!=0 ){.     pW
35fc0 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
35fd0 28 42 69 74 6d 61 73 6b 29 28 2d 31 29 3b 0a 20  (Bitmask)(-1);. 
35fe0 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
35ff0 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45 52 28 64  >nErr || NEVER(d
36000 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
36010 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
36020 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
36030 7d 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  }.#ifdef WHERETR
36040 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
36050 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
36060 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ace ){.    int i
36070 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  i;.    sqlite3De
36080 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20  bugPrintf("---- 
36090 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64  Solution nRow=%d
360a0 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  ", pWInfo->nRowO
360b0 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ut);.    if( pWI
360c0 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 29 7b 0a 20  nfo->bOBSat ){. 
360d0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
360e0 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42  gPrintf(" ORDERB
360f0 59 3d 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66  Y=0x%llx", pWInf
36100 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20  o->revMask);.   
36110 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20 70   }.    switch( p
36120 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
36130 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57   ){.      case W
36140 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
36150 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  IQUE: {.        
36160 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
36170 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75  tf("  DISTINCT=u
36180 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20 20 20  nique");.       
36190 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
361a0 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
361b0 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
361c0 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D: {.        sql
361d0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
361e0 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72 64 65  "  DISTINCT=orde
361f0 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62  red");.        b
36200 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
36210 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
36220 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
36230 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D: {.        sql
36240 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
36250 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72  "  DISTINCT=unor
36260 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20  dered");.       
36270 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
36280 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
36290 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
362a0 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ");.    for(ii=0
362b0 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ; ii<pWInfo->nLe
362c0 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  vel; ii++){.    
362d0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
362e0 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70  (pWInfo->a[ii].p
362f0 57 4c 6f 6f 70 2c 20 70 54 61 62 4c 69 73 74 29  WLoop, pTabList)
36300 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
36310 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20  if.  /* Attempt 
36320 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73 20 66  to omit tables f
36330 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68 61  rom the join tha
36340 74 20 64 6f 20 6e 6f 74 20 65 66 66 65 63 74 20  t do not effect 
36350 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
36360 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
36370 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52 65 73  el>=2.   && pRes
36380 75 6c 74 53 65 74 21 3d 30 0a 20 20 20 26 26 20  ultSet!=0.   && 
36390 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
363a0 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  led(db, SQLITE_O
363b0 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29  mitNoopJoin).  )
363c0 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 61  {.    Bitmask ta
363d0 62 55 73 65 64 20 3d 20 65 78 70 72 4c 69 73 74  bUsed = exprList
363e0 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
363f0 53 65 74 2c 20 70 52 65 73 75 6c 74 53 65 74 29  Set, pResultSet)
36400 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  ;.    if( pOrder
36410 42 79 20 29 20 74 61 62 55 73 65 64 20 7c 3d 20  By ) tabUsed |= 
36420 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
36430 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72  ge(pMaskSet, pOr
36440 64 65 72 42 79 29 3b 0a 20 20 20 20 77 68 69 6c  derBy);.    whil
36450 65 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  e( pWInfo->nLeve
36460 6c 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 57 68  l>=2 ){.      Wh
36470 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
36480 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 4c 6f  *pEnd;.      pLo
36490 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 70  op = pWInfo->a[p
364a0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d  WInfo->nLevel-1]
364b0 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69  .pWLoop;.      i
364c0 66 28 20 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62  f( (pWInfo->pTab
364d0 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69  List->a[pLoop->i
364e0 54 61 62 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  Tab].jointype & 
364f0 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62 72  JT_LEFT)==0 ) br
36500 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 28  eak;.      if( (
36510 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
36520 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
36530 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28  )==0.       && (
36540 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
36550 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d   WHERE_ONEROW)==
36560 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
36570 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
36580 7d 0a 20 20 20 20 20 20 69 66 28 20 28 74 61 62  }.      if( (tab
36590 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  Used & pLoop->ma
365a0 73 6b 53 65 6c 66 29 21 3d 30 20 29 20 62 72 65  skSelf)!=0 ) bre
365b0 61 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d  ak;.      pEnd =
365c0 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73   sWLB.pWC->a + s
365d0 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  WLB.pWC->nTerm;.
365e0 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
365f0 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65  sWLB.pWC->a; pTe
36600 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  rm<pEnd; pTerm++
36610 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
36620 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
36630 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65   & pLoop->maskSe
36640 6c 66 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  lf)!=0.         
36650 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
36660 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
36670 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20  , EP_FromJoin). 
36680 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
36690 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
366a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
366b0 20 20 20 69 66 28 20 70 54 65 72 6d 3c 70 45 6e     if( pTerm<pEn
366c0 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  d ) break;.     
366d0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66   WHERETRACE(0xff
366e0 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c 6f  ff, ("-> drop lo
366f0 6f 70 20 25 63 20 6e 6f 74 20 75 73 65 64 5c 6e  op %c not used\n
36700 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b  ", pLoop->cId));
36710 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e  .      pWInfo->n
36720 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e  Level--;.      n
36730 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d  TabList--;.    }
36740 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43  .  }.  WHERETRAC
36750 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f  E(0xffff,("*** O
36760 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65  ptimizer Finishe
36770 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57  d ***\n"));.  pW
36780 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51  Info->pParse->nQ
36790 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e  ueryLoop += pWIn
367a0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20  fo->nRowOut;..  
367b0 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  /* If the caller
367c0 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72   is an UPDATE or
367d0 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
367e0 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73  t that is reques
367f0 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65  ting.  ** to use
36800 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f   a one-pass algo
36810 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65  rithm, determine
36820 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72   if this is appr
36830 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68  opriate..  ** Th
36840 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  e one-pass algor
36850 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  ithm only works 
36860 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
36870 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  use constraints.
36880 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
36890 6e 74 20 74 6f 20 75 70 64 61 74 65 20 61 20 73  nt to update a s
368a0 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a  ingle row..  */.
368b0 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c    assert( (wctrl
368c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
368d0 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
368e0 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0 || pWInfo->nLe
368f0 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  vel==1 );.  if( 
36900 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
36910 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
36920 52 45 44 29 21 3d 30 20 0a 20 20 20 26 26 20 28  RED)!=0 .   && (
36930 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
36940 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
36950 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 20  HERE_ONEROW)!=0 
36960 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f  ){.    pWInfo->o
36970 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20 20  kOnePass = 1;.  
36980 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70    pWInfo->a[0].p
36990 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
369a0 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  = ~WHERE_IDX_ONL
369b0 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  Y;.  }..  /* Ope
369c0 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  n all tables in 
369d0 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64  the pTabList and
369e0 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c   any indices sel
369f0 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73  ected for.  ** s
36a00 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74  earching those t
36a10 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 6e 6f  ables..  */.  no
36a20 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
36a30 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30  sk)0;.  for(ii=0
36a40 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
36a50 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b  >a; ii<nTabList;
36a60 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29   ii++, pLevel++)
36a70 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
36a80 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  b;     /* Table 
36a90 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69  to open */.    i
36aa0 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
36ab0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61  /* Index of data
36ac0 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
36ad0 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20  table/index */. 
36ae0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
36af0 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
36b00 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20  ;..    pTabItem 
36b10 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
36b20 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
36b30 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74     pTab = pTabIt
36b40 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44  em->pTab;.    iD
36b50 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
36b60 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
36b70 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
36b80 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
36b90 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28  >pWLoop;.    if(
36ba0 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
36bb0 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
36bc0 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  !=0 || pTab->pSe
36bd0 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  lect ){.      /*
36be0 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
36bf0 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66     }else.#ifndef
36c00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
36c10 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
36c20 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
36c30 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
36c40 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
36c50 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
36c60 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63  pVTab = (const c
36c70 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74  har *)sqlite3Get
36c80 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
36c90 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72  ;.      int iCur
36ca0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
36cb0 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  rsor;.      sqli
36cc0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
36cd0 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c   OP_VOpen, iCur,
36ce0 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34   0, 0, pVTab, P4
36cf0 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73  _VTAB);.    }els
36d00 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28  e if( IsVirtual(
36d10 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f  pTab) ){.      /
36d20 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65  * noop */.    }e
36d30 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
36d40 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
36d50 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
36d60 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  NLY)==0.        
36d70 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
36d80 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45  & WHERE_OMIT_OPE
36d90 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a 20  N_CLOSE)==0 ){. 
36da0 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 57       int op = pW
36db0 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
36dc0 3f 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 3a  ? OP_OpenWrite :
36dd0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20   OP_OpenRead;.  
36de0 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
36df0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
36e00 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  bItem->iCursor, 
36e10 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a  iDb, pTab, op);.
36e20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
36e30 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
36e40 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  ss && pTab->nCol
36e50 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
36e60 20 74 65 73 74 63 61 73 65 28 20 21 70 57 49 6e   testcase( !pWIn
36e70 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26  fo->okOnePass &&
36e80 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
36e90 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
36ea0 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
36eb0 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42   && pTab->nCol<B
36ec0 4d 53 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69  MS ){.        Bi
36ed0 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74  tmask b = pTabIt
36ee0 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20  em->colUsed;.   
36ef0 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a       int n = 0;.
36f00 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b          for(; b;
36f10 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a   b=b>>1, n++){}.
36f20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
36f30 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 73  dbeChangeP4(v, s
36f40 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
36f50 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20 20 20  tAddr(v)-1, .   
36f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f70 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
36f80 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50  INT_TO_PTR(n), P
36f90 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20  4_INT32);.      
36fa0 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61    assert( n<=pTa
36fb0 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
36fc0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
36fd0 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
36fe0 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
36ff0 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
37000 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
37010 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f     }.    if( pLo
37020 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
37030 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
37040 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20       Index *pIx 
37050 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
37060 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 4b  .pIndex;.      K
37070 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73  eyInfo *pKey = s
37080 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
37090 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b  fo(pParse, pIx);
370a0 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a  .      /* FIXME:
370b0 20 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61    As an optimiza
370c0 74 69 6f 6e 20 75 73 65 20 70 54 61 62 49 74 65  tion use pTabIte
370d0 6d 2d 3e 69 43 75 72 73 6f 72 20 69 66 20 57 48  m->iCursor if WH
370e0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 2a 2f 0a  ERE_IDX_ONLY */.
370f0 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78        int iIndex
37100 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  Cur = pLevel->iI
37110 64 78 43 75 72 20 3d 20 69 49 64 78 43 75 72 20  dxCur = iIdxCur 
37120 3f 20 69 49 64 78 43 75 72 20 3a 20 70 50 61 72  ? iIdxCur : pPar
37130 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
37140 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70    assert( pIx->p
37150 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
37160 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61  chema );.      a
37170 73 73 65 72 74 28 20 69 49 6e 64 65 78 43 75 72  ssert( iIndexCur
37180 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  >=0 );.      sql
37190 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
371a0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
371b0 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e 74  IndexCur, pIx->t
371c0 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20  num, iDb,.      
371d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
371e0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50    (char*)pKey, P
371f0 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
37200 46 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  F);.      VdbeCo
37210 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
37220 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  pIx->zName));.  
37230 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
37240 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
37250 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
37260 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67    notReady &= ~g
37270 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
37280 73 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74  sMaskSet, pTabIt
37290 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
372a0 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  }.  pWInfo->iTop
372b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
372c0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
372d0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
372e0 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
372f0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20  eBeginError;..  
37300 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
37310 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73  code to do the s
37320 65 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65  earch.  Each ite
37330 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f  ration of the fo
37340 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f  r.  ** loop belo
37350 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  w generates code
37360 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65   for a single ne
37370 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65  sted loop of the
37380 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d   VM.  ** program
37390 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64  ..  */.  notRead
373a0 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  y = ~(Bitmask)0;
373b0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
373c0 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b  nTabList; ii++){
373d0 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
373e0 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 23 69  WInfo->a[ii];.#i
373f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
37400 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
37410 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  X.    if( (pLeve
37420 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  l->pWLoop->wsFla
37430 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
37440 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20  INDEX)!=0 ){.   
37450 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f     constructAuto
37460 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61 72 73  maticIndex(pPars
37470 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  e, &pWInfo->sWC,
37480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
37490 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
374a0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f  evel->iFrom], no
374b0 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b  tReady, pLevel);
374c0 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  .      if( db->m
374d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
374e0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
374f0 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  or;.    }.#endif
37500 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53  .    explainOneS
37510 63 61 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  can(pParse, pTab
37520 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69  List, pLevel, ii
37530 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c  , pLevel->iFrom,
37540 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20   wctrlFlags);.  
37550 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f    pLevel->addrBo
37560 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dy = sqlite3Vdbe
37570 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
37580 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 63      notReady = c
37590 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28  odeOneLoopStart(
375a0 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52  pWInfo, ii, notR
375b0 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66  eady);.    pWInf
375c0 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70  o->iContinue = p
375d0 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b  Level->addrCont;
375e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e  .  }..  /* Done.
375f0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 57 49   */.  return pWI
37600 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  nfo;..  /* Jump 
37610 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66  here if malloc f
37620 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67  ails */.whereBeg
37630 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28 20 70  inError:.  if( p
37640 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50 61  WInfo ){.    pPa
37650 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
37660 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e  = pWInfo->savedN
37670 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77  QueryLoop;.    w
37680 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c  hereInfoFree(db,
37690 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20   pWInfo);.  }.  
376a0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
376b0 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
376c0 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
376d0 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d   loop.  See comm
376e0 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69  ents on .** sqli
376f0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
37700 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
37710 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  nformation..*/.v
37720 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  oid sqlite3Where
37730 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  End(WhereInfo *p
37740 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20  WInfo){.  Parse 
37750 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
37760 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65  ->pParse;.  Vdbe
37770 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
37780 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
37790 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
377a0 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  el;.  WhereLoop 
377b0 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73  *pLoop;.  SrcLis
377c0 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57  t *pTabList = pW
377d0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
377e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
377f0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
37800 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20  * Generate loop 
37810 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65  termination code
37820 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
37830 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
37840 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d  Parse);.  for(i=
37850 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31  pWInfo->nLevel-1
37860 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
37870 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
37880 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c  fo->a[i];.    pL
37890 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
378a0 4c 6f 6f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65  Loop;.    sqlite
378b0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
378c0 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
378d0 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  rCont);.    if( 
378e0 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e  pLevel->op!=OP_N
378f0 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  oop ){.      sql
37900 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
37910 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c  , pLevel->op, pL
37920 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c  evel->p1, pLevel
37930 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  ->p2);.      sql
37940 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
37950 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b  (v, pLevel->p5);
37960 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
37970 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
37980 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26  WHERE_IN_ABLE &&
37990 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
379a0 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  n>0 ){.      str
379b0 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b  uct InLoop *pIn;
379c0 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
379d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
379e0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
379f0 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b  Level->addrNxt);
37a00 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65  .      for(j=pLe
37a10 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70  vel->u.in.nIn, p
37a20 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  In=&pLevel->u.in
37a30 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a  .aInLoop[j-1]; j
37a40 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b  >0; j--, pIn--){
37a50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
37a60 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
37a70 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31  pIn->addrInTop+1
37a80 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
37a90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
37aa0 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c  pIn->eEndLoopOp,
37ab0 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d   pIn->iCur, pIn-
37ac0 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20  >addrInTop);.   
37ad0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37ae0 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d  JumpHere(v, pIn-
37af0 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20  >addrInTop-1);. 
37b00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
37b10 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
37b20 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
37b30 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  oop);.    }.    
37b40 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
37b50 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
37b60 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  l->addrBrk);.   
37b70 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
37b80 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
37b90 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
37ba0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
37bb0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
37bc0 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  fPos, pLevel->iL
37bd0 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20  eftJoin);.      
37be0 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
37bf0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
37c00 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20  IDX_ONLY)==0.   
37c10 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f          || (pLoo
37c20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
37c30 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29  RE_INDEXED)!=0 )
37c40 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f  ;.      if( (pLo
37c50 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
37c60 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
37c70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
37c80 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
37c90 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61   OP_NullRow, pTa
37ca0 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
37cb0 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
37cc0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
37cd0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
37ce0 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20  NDEXED ){.      
37cf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
37d00 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
37d10 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  w, pLevel->iIdxC
37d20 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ur);.      }.   
37d30 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
37d40 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a  p==OP_Return ){.
37d50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
37d60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
37d70 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70  Gosub, pLevel->p
37d80 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46  1, pLevel->addrF
37d90 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  irst);.      }el
37da0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
37db0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
37dc0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
37dd0 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
37de0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
37df0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
37e00 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
37e10 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
37e20 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69   "break" point i
37e30 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73  s here, just pas
37e40 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
37e50 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a   outer loop..  *
37e60 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20  * Set it..  */. 
37e70 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
37e80 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e  lveLabel(v, pWIn
37e90 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
37ea0 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20  /* Close all of 
37eb0 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
37ec0 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20   were opened by 
37ed0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
37ee0 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
37ef0 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
37f00 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  <=pTabList->nSrc
37f10 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   );.  for(i=0, p
37f20 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
37f30 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   i<pWInfo->nLeve
37f40 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  l; i++, pLevel++
37f50 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
37f60 64 78 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75  dx = 0;.    stru
37f70 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
37f80 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61  *pTabItem = &pTa
37f90 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
37fa0 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62  >iFrom];.    Tab
37fb0 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49  le *pTab = pTabI
37fc0 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  tem->pTab;.    a
37fd0 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
37fe0 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ;.    pLoop = pL
37ff0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
38000 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
38010 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
38020 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26  eral)==0.     &&
38030 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
38040 30 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66  0.     && (pWInf
38050 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
38060 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f  WHERE_OMIT_OPEN_
38070 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b  CLOSE)==0.    ){
38080 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20  .      int ws = 
38090 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  pLoop->wsFlags;.
380a0 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66        if( !pWInf
380b0 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20  o->okOnePass && 
380c0 28 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  (ws & WHERE_IDX_
380d0 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
380e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
380f0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
38100 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
38110 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
38120 20 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57       if( (ws & W
38130 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
38140 20 26 26 20 28 77 73 20 26 20 28 57 48 45 52 45   && (ws & (WHERE
38150 5f 49 50 4b 7c 57 48 45 52 45 5f 41 55 54 4f 5f  _IPK|WHERE_AUTO_
38160 49 4e 44 45 58 29 29 3d 3d 30 20 29 7b 0a 20 20  INDEX))==0 ){.  
38170 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
38180 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
38190 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ose, pLevel->iId
381a0 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
381b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
381c0 74 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61  this scan uses a
381d0 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 6