/ Hex Artifact Content
Login

Artifact 2323663d074a94fa1609d65d7175948d490e560b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 4b 2c 58  e WHERETRACE(K,X
0430: 29 20 20 69 66 28 73 71 6c 69 74 65 33 57 68 65  )  if(sqlite3Whe
0440: 72 65 54 72 61 63 65 26 28 4b 29 29 20 73 71 6c  reTrace&(K)) sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
0460: 58 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  X.# define WHERE
0470: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 31 0a  TRACE_ENABLED 1.
0480: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 57  #else.# define W
0490: 48 45 52 45 54 52 41 43 45 28 4b 2c 58 29 0a 23  HERETRACE(K,X).#
04a0: 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72  endif../* Forwar
04b0: 64 20 72 65 66 65 72 65 6e 63 65 73 0a 2a 2f 0a  d references.*/.
04c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
04d0: 68 65 72 65 43 6c 61 75 73 65 20 57 68 65 72 65  hereClause Where
04e0: 43 6c 61 75 73 65 3b 0a 74 79 70 65 64 65 66 20  Clause;.typedef 
04f0: 73 74 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b  struct WhereMask
0500: 53 65 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74  Set WhereMaskSet
0510: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
0520: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 57 68 65   WhereOrInfo Whe
0530: 72 65 4f 72 49 6e 66 6f 3b 0a 74 79 70 65 64 65  reOrInfo;.typede
0540: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 41 6e  f struct WhereAn
0550: 64 49 6e 66 6f 20 57 68 65 72 65 41 6e 64 49 6e  dInfo WhereAndIn
0560: 66 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  fo;.typedef stru
0570: 63 74 20 57 68 65 72 65 4c 65 76 65 6c 20 57 68  ct WhereLevel Wh
0580: 65 72 65 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65  ereLevel;.typede
0590: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f  f struct WhereLo
05a0: 6f 70 20 57 68 65 72 65 4c 6f 6f 70 3b 0a 74 79  op WhereLoop;.ty
05b0: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
05c0: 72 65 50 61 74 68 20 57 68 65 72 65 50 61 74 68  rePath WherePath
05d0: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
05e0: 20 57 68 65 72 65 54 65 72 6d 20 57 68 65 72 65   WhereTerm Where
05f0: 54 65 72 6d 3b 0a 74 79 70 65 64 65 66 20 73 74  Term;.typedef st
0600: 72 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 42 75  ruct WhereLoopBu
0610: 69 6c 64 65 72 20 57 68 65 72 65 4c 6f 6f 70 42  ilder WhereLoopB
0620: 75 69 6c 64 65 72 3b 0a 74 79 70 65 64 65 66 20  uilder;.typedef 
0630: 73 74 72 75 63 74 20 57 68 65 72 65 53 63 61 6e  struct WhereScan
0640: 20 57 68 65 72 65 53 63 61 6e 3b 0a 74 79 70 65   WhereScan;.type
0650: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
0660: 4f 72 43 6f 73 74 20 57 68 65 72 65 4f 72 43 6f  OrCost WhereOrCo
0670: 73 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  st;.typedef stru
0680: 63 74 20 57 68 65 72 65 4f 72 53 65 74 20 57 68  ct WhereOrSet Wh
0690: 65 72 65 4f 72 53 65 74 3b 0a 0a 2f 2a 0a 2a 2a  ereOrSet;../*.**
06a0: 20 43 6f 73 74 20 58 20 69 73 20 74 72 61 63 6b   Cost X is track
06b0: 65 64 20 61 73 20 31 30 2a 6c 6f 67 32 28 58 29  ed as 10*log2(X)
06c0: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 31 36 2d   stored in a 16-
06d0: 62 69 74 20 69 6e 74 65 67 65 72 2e 20 20 54 68  bit integer.  Th
06e0: 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 63 6f 73  e.** maximum cos
06f0: 74 20 66 6f 72 20 6f 72 64 69 6e 61 72 79 20 74  t for ordinary t
0700: 61 62 6c 65 73 20 69 73 20 36 34 2a 28 32 2a 2a  ables is 64*(2**
0710: 36 33 29 20 77 68 69 63 68 20 62 65 63 6f 6d 65  63) which become
0720: 73 20 36 39 30 30 2e 0a 2a 2a 20 28 56 69 72 74  s 6900..** (Virt
0730: 75 61 6c 20 74 61 62 6c 65 73 20 63 61 6e 20 72  ual tables can r
0740: 65 74 75 72 6e 20 61 20 6c 61 72 67 65 72 20 63  eturn a larger c
0750: 6f 73 74 2c 20 62 75 74 20 6c 65 74 27 73 20 61  ost, but let's a
0760: 73 73 75 6d 65 20 74 68 65 79 20 64 6f 20 6e 6f  ssume they do no
0770: 74 2e 29 0a 2a 2a 20 53 6f 20 61 6c 6c 20 63 6f  t.).** So all co
0780: 73 74 73 20 63 61 6e 20 62 65 20 73 74 6f 72 65  sts can be store
0790: 64 20 69 6e 20 61 20 31 36 2d 62 69 74 20 75 6e  d in a 16-bit un
07a0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 77  signed integer w
07b0: 69 74 68 6f 75 74 20 72 69 73 6b 0a 2a 2a 20 6f  ithout risk.** o
07c0: 66 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2a 0a 2a  f overflow..**.*
07d0: 2a 20 43 6f 73 74 73 20 61 72 65 20 65 73 74 69  * Costs are esti
07e0: 6d 61 74 65 73 2c 20 73 6f 20 6e 6f 20 65 66 66  mates, so no eff
07f0: 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  ort is made to c
0800: 6f 6d 70 75 74 65 20 31 30 2a 6c 6f 67 32 28 58  ompute 10*log2(X
0810: 29 20 65 78 61 63 74 6c 79 2e 0a 2a 2a 20 49 6e  ) exactly..** In
0820: 73 74 65 61 64 2c 20 61 20 63 6c 6f 73 65 20 65  stead, a close e
0830: 73 74 69 6d 61 74 65 20 69 73 20 75 73 65 64 2e  stimate is used.
0840: 20 20 41 6e 79 20 76 61 6c 75 65 20 6f 66 20 58    Any value of X
0850: 3c 3d 31 20 69 73 20 73 74 6f 72 65 64 20 61 73  <=1 is stored as
0860: 20 30 2e 0a 2a 2a 20 58 3d 32 20 69 73 20 31 30   0..** X=2 is 10
0870: 2e 20 20 58 3d 33 20 69 73 20 31 36 2e 20 20 58  .  X=3 is 16.  X
0880: 3d 31 30 30 30 20 69 73 20 39 39 2e 20 65 74 63  =1000 is 99. etc
0890: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 6f 6f 6c  ..**.** The tool
08a0: 2f 77 68 65 72 65 63 6f 73 74 74 65 73 74 2e 63  /wherecosttest.c
08b0: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 69 6d 70   source file imp
08c0: 6c 65 6d 65 6e 74 73 20 61 20 63 6f 6d 6d 61 6e  lements a comman
08d0: 64 2d 6c 69 6e 65 20 70 72 6f 67 72 61 6d 0a 2a  d-line program.*
08e0: 2a 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 6e 76  * that will conv
08f0: 65 72 74 20 57 68 65 72 65 43 6f 73 74 73 20 74  ert WhereCosts t
0900: 6f 20 69 6e 74 65 67 65 72 73 2c 20 63 6f 6e 76  o integers, conv
0910: 65 72 74 20 69 6e 74 65 67 65 72 73 20 74 6f 20  ert integers to 
0920: 57 68 65 72 65 43 6f 73 74 73 0a 2a 2a 20 61 6e  WhereCosts.** an
0930: 64 20 64 6f 20 61 64 64 69 74 69 6f 6e 20 61 6e  d do addition an
0940: 64 20 6d 75 6c 74 69 70 6c 69 63 61 74 69 6f 6e  d multiplication
0950: 20 6f 6e 20 57 68 65 72 65 43 6f 73 74 20 76 61   on WhereCost va
0960: 6c 75 65 73 2e 20 20 54 68 65 20 77 68 65 72 65  lues.  The where
0970: 63 6f 73 74 74 65 73 74 0a 2a 2a 20 63 6f 6d 6d  costtest.** comm
0980: 61 6e 64 2d 6c 69 6e 65 20 70 72 6f 67 72 61 6d  and-line program
0990: 20 69 73 20 61 20 75 73 65 66 75 6c 20 75 74 69   is a useful uti
09a0: 6c 69 74 79 20 74 6f 20 68 61 76 65 20 61 72 6f  lity to have aro
09b0: 75 6e 64 20 77 68 65 6e 20 77 6f 72 6b 69 6e 67  und when working
09c0: 20 77 69 74 68 0a 2a 2a 20 74 68 69 73 20 6d 6f   with.** this mo
09d0: 64 75 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  dule..*/.typedef
09e0: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
09f0: 69 6e 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a  int WhereCost;..
0a00: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6f 62 6a 65 63  /*.** This objec
0a10: 74 20 63 6f 6e 74 61 69 6e 73 20 69 6e 66 6f 72  t contains infor
0a20: 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f  mation needed to
0a30: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 73 69 6e   implement a sin
0a40: 67 6c 65 20 6e 65 73 74 65 64 0a 2a 2a 20 6c 6f  gle nested.** lo
0a50: 6f 70 20 69 6e 20 57 48 45 52 45 20 63 6c 61 75  op in WHERE clau
0a60: 73 65 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 74 72 61  se..**.** Contra
0a70: 73 74 20 74 68 69 73 20 6f 62 6a 65 63 74 20 77  st this object w
0a80: 69 74 68 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20  ith WhereLoop.  
0a90: 54 68 69 73 20 6f 62 6a 65 63 74 20 64 65 73 63  This object desc
0aa0: 72 69 62 65 73 20 74 68 65 0a 2a 2a 20 69 6d 70  ribes the.** imp
0ab0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ac0: 68 65 20 6c 6f 6f 70 2e 20 20 57 68 65 72 65 4c  he loop.  WhereL
0ad0: 6f 6f 70 20 64 65 73 63 72 69 62 65 73 20 74 68  oop describes th
0ae0: 65 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2a 20  e algorithm..** 
0af0: 54 68 69 73 20 6f 62 6a 65 63 74 20 63 6f 6e 74  This object cont
0b00: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
0b10: 6f 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  o the WhereLoop 
0b20: 61 6c 67 6f 72 69 74 68 6d 20 61 73 20 6f 6e 65  algorithm as one
0b30: 20 6f 66 0a 2a 2a 20 69 74 73 20 65 6c 65 6d 65   of.** its eleme
0b40: 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 57  nts..**.** The W
0b50: 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  hereInfo object 
0b60: 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c  contains a singl
0b70: 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
0b80: 69 73 20 6f 62 6a 65 63 74 20 66 6f 72 0a 2a 2a  is object for.**
0b90: 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68   each term in th
0ba0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 28 77  e FROM clause (w
0bb0: 68 69 63 68 20 69 73 20 74 6f 20 73 61 79 2c 20  hich is to say, 
0bc0: 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a  for each of the.
0bd0: 2a 2a 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  ** nested loops 
0be0: 61 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 29 2e  as implemented).
0bf0: 20 20 54 68 65 20 6f 72 64 65 72 20 6f 66 20 57    The order of W
0c00: 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74  hereLevel object
0c10: 73 20 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20  s determines.** 
0c20: 74 68 65 20 6c 6f 6f 70 20 6e 65 73 74 65 64 20  the loop nested 
0c30: 6f 72 64 65 72 2c 20 77 69 74 68 20 57 68 65 72  order, with Wher
0c40: 65 49 6e 66 6f 2e 61 5b 30 5d 20 62 65 69 6e 67  eInfo.a[0] being
0c50: 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20   the outer loop 
0c60: 61 6e 64 0a 2a 2a 20 57 68 65 72 65 49 6e 66 6f  and.** WhereInfo
0c70: 2e 61 5b 57 68 65 72 65 49 6e 66 6f 2e 6e 4c 65  .a[WhereInfo.nLe
0c80: 76 65 6c 2d 31 5d 20 62 65 69 6e 67 20 74 68 65  vel-1] being the
0c90: 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 0a 2a 2f 0a   inner loop..*/.
0ca0: 73 74 72 75 63 74 20 57 68 65 72 65 4c 65 76 65  struct WhereLeve
0cb0: 6c 20 7b 0a 20 20 69 6e 74 20 69 4c 65 66 74 4a  l {.  int iLeftJ
0cc0: 6f 69 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  oin;        /* M
0cd0: 65 6d 6f 72 79 20 63 65 6c 6c 20 75 73 65 64 20  emory cell used 
0ce0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 45 46  to implement LEF
0cf0: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 2a 2f 0a  T OUTER JOIN */.
0d00: 20 20 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20    int iTabCur;  
0d10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
0d20: 44 42 45 20 63 75 72 73 6f 72 20 75 73 65 64 20  DBE cursor used 
0d30: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 74 61  to access the ta
0d40: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ble */.  int iId
0d50: 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 2f  xCur;          /
0d60: 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
0d70: 72 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  r used to access
0d80: 20 70 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 61   pIdx */.  int a
0d90: 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20  ddrBrk;         
0da0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
0db0: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
0dc0: 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  e loop */.  int 
0dd0: 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20  addrNxt;        
0de0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
0df0: 6f 20 73 74 61 72 74 20 74 68 65 20 6e 65 78 74  o start the next
0e00: 20 49 4e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20   IN combination 
0e10: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
0e20: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t;         /* Ju
0e30: 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
0e40: 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
0e50: 74 20 6c 6f 6f 70 20 63 79 63 6c 65 20 2a 2f 0a  t loop cycle */.
0e60: 20 20 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b    int addrFirst;
0e70: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
0e80: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20   instruction of 
0e90: 69 6e 74 65 72 69 6f 72 20 6f 66 20 74 68 65 20  interior of the 
0ea0: 6c 6f 6f 70 20 2a 2f 0a 20 20 75 38 20 69 46 72  loop */.  u8 iFr
0eb0: 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  om;             
0ec0: 2f 2a 20 57 68 69 63 68 20 65 6e 74 72 79 20 69  /* Which entry i
0ed0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
0ee0: 65 20 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 70 35  e */.  u8 op, p5
0ef0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0f00: 4f 70 63 6f 64 65 20 61 6e 64 20 50 35 20 6f 66  Opcode and P5 of
0f10: 20 74 68 65 20 6f 70 63 6f 64 65 20 74 68 61 74   the opcode that
0f20: 20 65 6e 64 73 20 74 68 65 20 6c 6f 6f 70 20 2a   ends the loop *
0f30: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 70 32 3b 20  /.  int p1, p2; 
0f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
0f50: 72 61 6e 64 73 20 6f 66 20 74 68 65 20 6f 70 63  rands of the opc
0f60: 6f 64 65 20 75 73 65 64 20 74 6f 20 65 6e 64 73  ode used to ends
0f70: 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75   the loop */.  u
0f80: 6e 69 6f 6e 20 7b 20 20 20 20 20 20 20 20 20 20  nion {          
0f90: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
0fa0: 69 6f 6e 20 74 68 61 74 20 64 65 70 65 6e 64 73  ion that depends
0fb0: 20 6f 6e 20 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c   on pWLoop->wsFl
0fc0: 61 67 73 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  ags */.    struc
0fd0: 74 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49  t {.      int nI
0fe0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
0ff0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
1000: 72 69 65 73 20 69 6e 20 61 49 6e 4c 6f 6f 70 5b  ries in aInLoop[
1010: 5d 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  ] */.      struc
1020: 74 20 49 6e 4c 6f 6f 70 20 7b 0a 20 20 20 20 20  t InLoop {.     
1030: 20 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20     int iCur;    
1040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1050: 20 56 44 42 45 20 63 75 72 73 6f 72 20 75 73 65   VDBE cursor use
1060: 64 20 62 79 20 74 68 69 73 20 49 4e 20 6f 70 65  d by this IN ope
1070: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  rator */.       
1080: 20 69 6e 74 20 61 64 64 72 49 6e 54 6f 70 3b 20   int addrInTop; 
1090: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
10a0: 66 20 74 68 65 20 49 4e 20 6c 6f 6f 70 20 2a 2f  f the IN loop */
10b0: 0a 20 20 20 20 20 20 20 20 75 38 20 65 45 6e 64  .        u8 eEnd
10c0: 4c 6f 6f 70 4f 70 3b 20 20 20 20 20 20 20 20 20  LoopOp;         
10d0: 2f 2a 20 49 4e 20 4c 6f 6f 70 20 74 65 72 6d 69  /* IN Loop termi
10e0: 6e 61 74 6f 72 2e 20 4f 50 5f 4e 65 78 74 20 6f  nator. OP_Next o
10f0: 72 20 4f 50 5f 50 72 65 76 20 2a 2f 0a 20 20 20  r OP_Prev */.   
1100: 20 20 20 7d 20 2a 61 49 6e 4c 6f 6f 70 3b 20 20     } *aInLoop;  
1110: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
1120: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 65 61  rmation about ea
1130: 63 68 20 6e 65 73 74 65 64 20 49 4e 20 6f 70 65  ch nested IN ope
1140: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 20 69  rator */.    } i
1150: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1160: 20 20 20 2f 2a 20 55 73 65 64 20 77 68 65 6e 20     /* Used when 
1170: 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26  pWLoop->wsFlags&
1180: 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 2a 2f  WHERE_IN_ABLE */
1190: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76  .    Index *pCov
11a0: 69 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  idx;       /* Po
11b0: 73 73 69 62 6c 65 20 63 6f 76 65 72 69 6e 67 20  ssible covering 
11c0: 69 6e 64 65 78 20 66 6f 72 20 57 48 45 52 45 5f  index for WHERE_
11d0: 4d 55 4c 54 49 5f 4f 52 20 2a 2f 0a 20 20 7d 20  MULTI_OR */.  } 
11e0: 75 3b 0a 20 20 73 74 72 75 63 74 20 57 68 65 72  u;.  struct Wher
11f0: 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20  eLoop *pWLoop;  
1200: 2f 2a 20 54 68 65 20 73 65 6c 65 63 74 65 64 20  /* The selected 
1210: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1220: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61   */.};../*.** Ea
1230: 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ch instance of t
1240: 68 69 73 20 6f 62 6a 65 63 74 20 72 65 70 72 65  his object repre
1250: 73 65 6e 74 73 20 61 6e 20 61 6c 67 6f 72 69 74  sents an algorit
1260: 68 6d 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e  hm for evaluatin
1270: 67 20 6f 6e 65 0a 2a 2a 20 74 65 72 6d 20 6f 66  g one.** term of
1280: 20 61 20 6a 6f 69 6e 2e 20 20 45 76 65 72 79 20   a join.  Every 
1290: 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d  term of the FROM
12a0: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 68 61 76   clause will hav
12b0: 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e  e at least.** on
12c0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
12d0: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
12e0: 20 28 75 6e 6c 65 73 73 20 49 4e 44 45 58 45 44   (unless INDEXED
12f0: 20 42 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a   BY constraints.
1300: 2a 2a 20 70 72 65 76 65 6e 74 20 61 20 71 75 65  ** prevent a que
1310: 72 79 20 73 6f 6c 75 74 69 6f 6e 20 2d 20 77 68  ry solution - wh
1320: 69 63 68 20 69 73 20 61 6e 20 65 72 72 6f 72 29  ich is an error)
1330: 20 61 6e 64 20 6d 61 6e 79 20 74 65 72 6d 73 20   and many terms 
1340: 6f 66 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  of the.** FROM c
1350: 6c 61 75 73 65 20 77 69 6c 6c 20 68 61 76 65 20  lause will have 
1360: 6d 75 6c 74 69 70 6c 65 20 57 68 65 72 65 4c 6f  multiple WhereLo
1370: 6f 70 20 6f 62 6a 65 63 74 73 2c 20 65 61 63 68  op objects, each
1380: 20 64 65 73 63 72 69 62 69 6e 67 20 61 0a 2a 2a   describing a.**
1390: 20 70 6f 74 65 6e 74 69 61 6c 20 77 61 79 20 6f   potential way o
13a0: 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  f implementing t
13b0: 68 61 74 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  hat FROM-clause 
13c0: 74 65 72 6d 2c 20 74 6f 67 65 74 68 65 72 20 77  term, together w
13d0: 69 74 68 0a 2a 2a 20 64 65 70 65 6e 64 65 6e 63  ith.** dependenc
13e0: 69 65 73 20 61 6e 64 20 63 6f 73 74 20 65 73 74  ies and cost est
13f0: 69 6d 61 74 65 73 20 66 6f 72 20 75 73 69 6e 67  imates for using
1400: 20 74 68 65 20 63 68 6f 73 65 6e 20 61 6c 67 6f   the chosen algo
1410: 72 69 74 68 6d 2e 0a 2a 2a 0a 2a 2a 20 51 75 65  rithm..**.** Que
1420: 72 79 20 70 6c 61 6e 6e 69 6e 67 20 63 6f 6e 73  ry planning cons
1430: 69 73 74 73 20 6f 66 20 62 75 69 6c 64 69 6e 67  ists of building
1440: 20 75 70 20 61 20 63 6f 6c 6c 65 63 74 69 6f 6e   up a collection
1450: 20 6f 66 20 74 68 65 73 65 20 57 68 65 72 65 4c   of these WhereL
1460: 6f 6f 70 0a 2a 2a 20 6f 62 6a 65 63 74 73 2c 20  oop.** objects, 
1470: 74 68 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20 61  then computing a
1480: 20 70 61 72 74 69 63 75 6c 61 72 20 73 65 71 75   particular sequ
1490: 65 6e 63 65 20 6f 66 20 57 68 65 72 65 4c 6f 6f  ence of WhereLoo
14a0: 70 20 6f 62 6a 65 63 74 73 2c 20 77 69 74 68 0a  p objects, with.
14b0: 2a 2a 20 6f 6e 65 20 57 68 65 72 65 4c 6f 6f 70  ** one WhereLoop
14c0: 20 6f 62 6a 65 63 74 20 70 65 72 20 46 52 4f 4d   object per FROM
14d0: 20 63 6c 61 75 73 65 20 74 65 72 6d 2c 20 74 68   clause term, th
14e0: 61 74 20 73 61 74 69 73 66 79 20 61 6c 6c 20 64  at satisfy all d
14f0: 65 70 65 6e 64 65 6e 63 69 65 73 0a 2a 2a 20 61  ependencies.** a
1500: 6e 64 20 74 68 61 74 20 6d 69 6e 69 6d 69 7a 65  nd that minimize
1510: 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 63 6f 73   the overall cos
1520: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  t..*/.struct Whe
1530: 72 65 4c 6f 6f 70 20 7b 0a 20 20 42 69 74 6d 61  reLoop {.  Bitma
1540: 73 6b 20 70 72 65 72 65 71 3b 20 20 20 20 20 20  sk prereq;      
1550: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 6f   /* Bitmask of o
1560: 74 68 65 72 20 6c 6f 6f 70 73 20 74 68 61 74 20  ther loops that 
1570: 6d 75 73 74 20 72 75 6e 20 66 69 72 73 74 20 2a  must run first *
1580: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  /.  Bitmask mask
1590: 53 65 6c 66 3b 20 20 20 20 20 2f 2a 20 42 69 74  Self;     /* Bit
15a0: 6d 61 73 6b 20 69 64 65 6e 74 69 66 79 69 6e 67  mask identifying
15b0: 20 74 61 62 6c 65 20 69 54 61 62 20 2a 2f 0a 23   table iTab */.#
15c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
15d0: 55 47 0a 20 20 63 68 61 72 20 63 49 64 3b 20 20  UG.  char cId;  
15e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79             /* Sy
15f0: 6d 62 6f 6c 69 63 20 49 44 20 6f 66 20 74 68 69  mbolic ID of thi
1600: 73 20 6c 6f 6f 70 20 66 6f 72 20 64 65 62 75 67  s loop for debug
1610: 67 69 6e 67 20 75 73 65 20 2a 2f 0a 23 65 6e 64  ging use */.#end
1620: 69 66 0a 20 20 75 38 20 69 54 61 62 3b 20 20 20  if.  u8 iTab;   
1630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1640: 73 69 74 69 6f 6e 20 69 6e 20 46 52 4f 4d 20 63  sition in FROM c
1650: 6c 61 75 73 65 20 6f 66 20 74 61 62 6c 65 20 66  lause of table f
1660: 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a  or this loop */.
1670: 20 20 75 38 20 69 53 6f 72 74 49 64 78 3b 20 20    u8 iSortIdx;  
1680: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 69          /* Sorti
1690: 6e 67 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 2e  ng index number.
16a0: 20 20 30 3d 3d 4e 6f 6e 65 20 2a 2f 0a 20 20 57    0==None */.  W
16b0: 68 65 72 65 43 6f 73 74 20 72 53 65 74 75 70 3b  hereCost rSetup;
16c0: 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65       /* One-time
16d0: 20 73 65 74 75 70 20 63 6f 73 74 20 28 65 78 3a   setup cost (ex:
16e0: 20 63 72 65 61 74 65 20 74 72 61 6e 73 69 65 6e   create transien
16f0: 74 20 69 6e 64 65 78 29 20 2a 2f 0a 20 20 57 68  t index) */.  Wh
1700: 65 72 65 43 6f 73 74 20 72 52 75 6e 3b 20 20 20  ereCost rRun;   
1710: 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 72      /* Cost of r
1720: 75 6e 6e 69 6e 67 20 65 61 63 68 20 6c 6f 6f 70  unning each loop
1730: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
1740: 6e 4f 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 45  nOut;       /* E
1750: 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
1760: 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a  of output rows *
1770: 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20  /.  union {.    
1780: 73 74 72 75 63 74 20 7b 20 20 20 20 20 20 20 20  struct {        
1790: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d         /* Inform
17a0: 61 74 69 6f 6e 20 66 6f 72 20 69 6e 74 65 72 6e  ation for intern
17b0: 61 6c 20 62 74 72 65 65 20 74 61 62 6c 65 73 20  al btree tables 
17c0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71  */.      int nEq
17d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 71 75  /* Number of equ
17f0: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1800: 73 20 2a 2f 0a 20 20 20 20 20 20 49 6e 64 65 78  s */.      Index
1810: 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
1820: 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 2c    /* Index used,
1830: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20   or NULL */.    
1840: 7d 20 62 74 72 65 65 3b 0a 20 20 20 20 73 74 72  } btree;.    str
1850: 75 63 74 20 7b 20 20 20 20 20 20 20 20 20 20 20  uct {           
1860: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
1870: 6f 6e 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74  on for virtual t
1880: 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 69  ables */.      i
1890: 6e 74 20 69 64 78 4e 75 6d 3b 20 20 20 20 20 20  nt idxNum;      
18a0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e        /* Index n
18b0: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 75  umber */.      u
18c0: 38 20 6e 65 65 64 46 72 65 65 3b 20 20 20 20 20  8 needFree;     
18d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
18e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 69 64   sqlite3_free(id
18f0: 78 53 74 72 29 20 69 73 20 6e 65 65 64 65 64 20  xStr) is needed 
1900: 2a 2f 0a 20 20 20 20 20 20 75 38 20 69 73 4f 72  */.      u8 isOr
1910: 64 65 72 65 64 3b 20 20 20 20 20 20 20 20 20 20  dered;          
1920: 2f 2a 20 54 72 75 65 20 69 66 20 73 61 74 69 73  /* True if satis
1930: 66 69 65 73 20 4f 52 44 45 52 20 42 59 20 2a 2f  fies ORDER BY */
1940: 0a 20 20 20 20 20 20 75 31 36 20 6f 6d 69 74 4d  .      u16 omitM
1950: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ask;          /*
1960: 20 54 65 72 6d 73 20 74 68 61 74 20 6d 61 79 20   Terms that may 
1970: 62 65 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20  be omitted */.  
1980: 20 20 20 20 63 68 61 72 20 2a 69 64 78 53 74 72      char *idxStr
1990: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
19a0: 64 65 78 20 69 64 65 6e 74 69 66 69 65 72 20 73  dex identifier s
19b0: 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 20 76  tring */.    } v
19c0: 74 61 62 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33  tab;.  } u;.  u3
19d0: 32 20 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20  2 wsFlags;      
19e0: 20 20 20 20 2f 2a 20 57 48 45 52 45 5f 2a 20 66      /* WHERE_* f
19f0: 6c 61 67 73 20 64 65 73 63 72 69 62 69 6e 67 20  lags describing 
1a00: 74 68 65 20 70 6c 61 6e 20 2a 2f 0a 20 20 75 31  the plan */.  u1
1a10: 36 20 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20 20  6 nLTerm;       
1a20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1a30: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 4c 54 65   entries in aLTe
1a40: 72 6d 5b 5d 20 2a 2f 0a 20 20 2f 2a 2a 2a 2a 20  rm[] */.  /**** 
1a50: 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 29 20  whereLoopXfer() 
1a60: 63 6f 70 69 65 73 20 66 69 65 6c 64 73 20 61 62  copies fields ab
1a70: 6f 76 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ove ************
1a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 20 64  ***********/.# d
1a90: 65 66 69 6e 65 20 57 48 45 52 45 5f 4c 4f 4f 50  efine WHERE_LOOP
1aa0: 5f 58 46 45 52 5f 53 5a 20 6f 66 66 73 65 74 6f  _XFER_SZ offseto
1ab0: 66 28 57 68 65 72 65 4c 6f 6f 70 2c 6e 4c 53 6c  f(WhereLoop,nLSl
1ac0: 6f 74 29 0a 20 20 75 31 36 20 6e 4c 53 6c 6f 74  ot).  u16 nLSlot
1ad0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
1ae0: 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 61  umber of slots a
1af0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4c 54  llocated for aLT
1b00: 65 72 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  erm[] */.  Where
1b10: 54 65 72 6d 20 2a 2a 61 4c 54 65 72 6d 3b 20 20  Term **aLTerm;  
1b20: 20 2f 2a 20 57 68 65 72 65 54 65 72 6d 73 20 75   /* WhereTerms u
1b30: 73 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  sed */.  WhereLo
1b40: 6f 70 20 2a 70 4e 65 78 74 4c 6f 6f 70 3b 20 2f  op *pNextLoop; /
1b50: 2a 20 4e 65 78 74 20 57 68 65 72 65 4c 6f 6f 70  * Next WhereLoop
1b60: 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 57   object in the W
1b70: 68 65 72 65 43 6c 61 75 73 65 20 2a 2f 0a 20 20  hereClause */.  
1b80: 57 68 65 72 65 54 65 72 6d 20 2a 61 4c 54 65 72  WhereTerm *aLTer
1b90: 6d 53 70 61 63 65 5b 34 5d 3b 20 20 2f 2a 20 49  mSpace[4];  /* I
1ba0: 6e 69 74 69 61 6c 20 61 4c 54 65 72 6d 5b 5d 20  nitial aLTerm[] 
1bb0: 73 70 61 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  space */.};../* 
1bc0: 54 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64  This object hold
1bd0: 73 20 74 68 65 20 70 72 65 72 65 71 75 69 73 69  s the prerequisi
1be0: 74 65 73 20 61 6e 64 20 74 68 65 20 63 6f 73 74  tes and the cost
1bf0: 20 6f 66 20 72 75 6e 6e 69 6e 67 20 61 0a 2a 2a   of running a.**
1c00: 20 73 75 62 71 75 65 72 79 20 6f 6e 20 6f 6e 65   subquery on one
1c10: 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 4f   operand of an O
1c20: 52 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 74 68  R operator in th
1c30: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  e WHERE clause..
1c40: 2a 2a 20 53 65 65 20 57 68 65 72 65 4f 72 53 65  ** See WhereOrSe
1c50: 74 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  t for additional
1c60: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 0a 2a 2f   information .*/
1c70: 0a 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 43  .struct WhereOrC
1c80: 6f 73 74 20 7b 0a 20 20 42 69 74 6d 61 73 6b 20  ost {.  Bitmask 
1c90: 70 72 65 72 65 71 3b 20 20 20 20 20 2f 2a 20 50  prereq;     /* P
1ca0: 72 65 72 65 71 75 69 73 69 74 65 73 20 2a 2f 0a  rerequisites */.
1cb0: 20 20 57 68 65 72 65 43 6f 73 74 20 72 52 75 6e    WhereCost rRun
1cc0: 3b 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66  ;     /* Cost of
1cd0: 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 73 75   running this su
1ce0: 62 71 75 65 72 79 20 2a 2f 0a 20 20 57 68 65 72  bquery */.  Wher
1cf0: 65 43 6f 73 74 20 6e 4f 75 74 3b 20 20 20 20 20  eCost nOut;     
1d00: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
1d10: 70 75 74 73 20 66 6f 72 20 74 68 69 73 20 73 75  puts for this su
1d20: 62 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  bquery */.};../*
1d30: 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74 20   The WhereOrSet 
1d40: 6f 62 6a 65 63 74 20 68 6f 6c 64 73 20 61 20 73  object holds a s
1d50: 65 74 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57  et of possible W
1d60: 68 65 72 65 4f 72 43 6f 73 74 73 20 74 68 61 74  hereOrCosts that
1d70: 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  .** correspond t
1d80: 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 28 73  o the subquery(s
1d90: 29 20 6f 66 20 4f 52 2d 63 6c 61 75 73 65 20 70  ) of OR-clause p
1da0: 72 6f 63 65 73 73 69 6e 67 2e 20 20 4f 6e 6c 79  rocessing.  Only
1db0: 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 4e 5f 4f   the.** best N_O
1dc0: 52 5f 43 4f 53 54 20 65 6c 65 6d 65 6e 74 73 20  R_COST elements 
1dd0: 61 72 65 20 72 65 74 61 69 6e 65 64 2e 0a 2a 2f  are retained..*/
1de0: 0a 23 64 65 66 69 6e 65 20 4e 5f 4f 52 5f 43 4f  .#define N_OR_CO
1df0: 53 54 20 33 0a 73 74 72 75 63 74 20 57 68 65 72  ST 3.struct Wher
1e00: 65 4f 72 53 65 74 20 7b 0a 20 20 75 31 36 20 6e  eOrSet {.  u16 n
1e10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e30: 20 6f 66 20 76 61 6c 69 64 20 61 5b 5d 20 65 6e   of valid a[] en
1e40: 74 72 69 65 73 20 2a 2f 0a 20 20 57 68 65 72 65  tries */.  Where
1e50: 4f 72 43 6f 73 74 20 61 5b 4e 5f 4f 52 5f 43 4f  OrCost a[N_OR_CO
1e60: 53 54 5d 3b 20 20 20 2f 2a 20 53 65 74 20 6f 66  ST];   /* Set of
1e70: 20 62 65 73 74 20 63 6f 73 74 73 20 2a 2f 0a 7d   best costs */.}
1e80: 3b 0a 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  ;.../* Forward d
1e90: 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20 6d 65  eclaration of me
1ea0: 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20  thods */.static 
1eb0: 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  int whereLoopRes
1ec0: 69 7a 65 28 73 71 6c 69 74 65 33 2a 2c 20 57 68  ize(sqlite3*, Wh
1ed0: 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e 74 29 3b 0a  ereLoop*, int);.
1ee0: 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74  ./*.** Each inst
1ef0: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
1f00: 65 63 74 20 68 6f 6c 64 73 20 61 20 73 65 71 75  ect holds a sequ
1f10: 65 6e 63 65 20 6f 66 20 57 68 65 72 65 4c 6f 6f  ence of WhereLoo
1f20: 70 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 74 68 61  p objects.** tha
1f30: 74 20 69 6d 70 6c 65 6d 65 6e 74 20 73 6f 6d 65  t implement some
1f40: 20 6f 72 20 61 6c 6c 20 6f 66 20 61 20 71 75 65   or all of a que
1f50: 72 79 20 70 6c 61 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ry plan..**.** T
1f60: 68 69 6e 6b 20 6f 66 20 65 61 63 68 20 57 68 65  hink of each Whe
1f70: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 61 73  reLoop object as
1f80: 20 61 20 6e 6f 64 65 20 69 6e 20 61 20 67 72 61   a node in a gra
1f90: 70 68 20 77 69 74 68 20 61 72 63 73 0a 2a 2a 20  ph with arcs.** 
1fa0: 73 68 6f 77 69 6e 67 20 64 65 70 65 6e 64 65 6e  showing dependen
1fb0: 63 65 73 20 61 6e 64 20 63 6f 73 74 73 20 66 6f  ces and costs fo
1fc0: 72 20 74 72 61 76 65 6c 6c 69 6e 67 20 62 65 74  r travelling bet
1fd0: 77 65 65 6e 20 6e 6f 64 65 73 2e 20 20 28 54 68  ween nodes.  (Th
1fe0: 61 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 61 20 63  at is.** not a c
1ff0: 6f 6d 70 6c 65 74 65 6c 79 20 61 63 63 75 72 61  ompletely accura
2000: 74 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 62  te description b
2010: 65 63 61 75 73 65 20 57 68 65 72 65 4c 6f 6f 70  ecause WhereLoop
2020: 20 63 6f 73 74 73 20 61 72 65 20 61 0a 2a 2a 20   costs are a.** 
2030: 76 65 63 74 6f 72 2c 20 6e 6f 74 20 61 20 73 63  vector, not a sc
2040: 61 6c 61 72 2c 20 61 6e 64 20 62 65 63 61 75 73  alar, and becaus
2050: 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20 61 72  e dependences ar
2060: 65 20 6d 61 6e 79 2d 74 6f 2d 6f 6e 65 2c 20 6e  e many-to-one, n
2070: 6f 74 0a 2a 2a 20 6f 6e 65 2d 74 6f 2d 6f 6e 65  ot.** one-to-one
2080: 20 61 73 20 61 72 65 20 67 72 61 70 68 20 6e 6f   as are graph no
2090: 64 65 73 2e 20 20 42 75 74 20 69 74 20 69 73 20  des.  But it is 
20a0: 61 20 75 73 65 66 75 6c 20 76 69 73 75 61 6c 69  a useful visuali
20b0: 7a 61 74 69 6f 6e 20 61 69 64 2e 29 0a 2a 2a 20  zation aid.).** 
20c0: 54 68 65 6e 20 61 20 57 68 65 72 65 50 61 74 68  Then a WherePath
20d0: 20 6f 62 6a 65 63 74 20 69 73 20 61 20 70 61 74   object is a pat
20e0: 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 67 72  h through the gr
20f0: 61 70 68 20 74 68 61 74 20 76 69 73 69 74 73 20  aph that visits 
2100: 73 6f 6d 65 0a 2a 2a 20 6f 72 20 61 6c 6c 20 6f  some.** or all o
2110: 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
2120: 6f 62 6a 65 63 74 73 20 6f 6e 63 65 2e 0a 2a 2a  objects once..**
2130: 0a 2a 2a 20 54 68 65 20 22 73 6f 6c 76 65 72 22  .** The "solver"
2140: 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69   works by creati
2150: 6e 67 20 74 68 65 20 4e 20 62 65 73 74 20 57 68  ng the N best Wh
2160: 65 72 65 50 61 74 68 20 6f 62 6a 65 63 74 73 20  erePath objects 
2170: 6f 66 20 6c 65 6e 67 74 68 0a 2a 2a 20 31 2e 20  of length.** 1. 
2180: 20 54 68 65 6e 20 75 73 69 6e 67 20 74 68 6f 73   Then using thos
2190: 65 20 61 73 20 61 20 62 61 73 69 73 20 74 6f 20  e as a basis to 
21a0: 63 6f 6d 70 75 74 65 20 74 68 65 20 4e 20 62 65  compute the N be
21b0: 73 74 20 57 68 65 72 65 50 61 74 68 20 6f 62 6a  st WherePath obj
21c0: 65 63 74 73 0a 2a 2a 20 6f 66 20 6c 65 6e 67 74  ects.** of lengt
21d0: 68 20 32 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  h 2.  And so for
21e0: 74 68 20 75 6e 74 69 6c 20 74 68 65 20 6c 65 6e  th until the len
21f0: 67 74 68 20 6f 66 20 57 68 65 72 65 50 61 74 68  gth of WherePath
2200: 73 20 65 71 75 61 6c 73 20 74 68 65 0a 2a 2a 20  s equals the.** 
2210: 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 64 65 73 20  number of nodes 
2220: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2230: 73 65 2e 20 20 54 68 65 20 62 65 73 74 20 28 6c  se.  The best (l
2240: 6f 77 65 73 74 20 63 6f 73 74 29 20 57 68 65 72  owest cost) Wher
2250: 65 50 61 74 68 0a 2a 2a 20 61 74 20 74 68 65 20  ePath.** at the 
2260: 65 6e 64 20 69 73 20 74 68 65 20 63 68 6f 6f 73  end is the choos
2270: 65 6e 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a  en query plan..*
2280: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 50 61  /.struct WherePa
2290: 74 68 20 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  th {.  Bitmask m
22a0: 61 73 6b 4c 6f 6f 70 3b 20 20 20 20 20 2f 2a 20  askLoop;     /* 
22b0: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 57  Bitmask of all W
22c0: 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
22d0: 20 69 6e 20 74 68 69 73 20 70 61 74 68 20 2a 2f   in this path */
22e0: 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4c 6f  .  Bitmask revLo
22f0: 6f 70 3b 20 20 20 20 20 20 2f 2a 20 61 4c 6f 6f  op;      /* aLoo
2300: 70 5b 5d 73 20 74 68 61 74 20 73 68 6f 75 6c 64  p[]s that should
2310: 20 62 65 20 72 65 76 65 72 73 65 64 20 66 6f 72   be reversed for
2320: 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 57   ORDER BY */.  W
2330: 68 65 72 65 43 6f 73 74 20 6e 52 6f 77 3b 20 20  hereCost nRow;  
2340: 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65       /* Estimate
2350: 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  d number of rows
2360: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
2370: 69 73 20 70 61 74 68 20 2a 2f 0a 20 20 57 68 65  is path */.  Whe
2380: 72 65 43 6f 73 74 20 72 43 6f 73 74 3b 20 20 20  reCost rCost;   
2390: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63 6f 73 74     /* Total cost
23a0: 20 6f 66 20 74 68 69 73 20 70 61 74 68 20 2a 2f   of this path */
23b0: 0a 20 20 75 38 20 69 73 4f 72 64 65 72 65 64 3b  .  u8 isOrdered;
23c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
23d0: 20 69 66 20 74 68 69 73 20 70 61 74 68 20 73 61   if this path sa
23e0: 74 69 73 66 69 65 73 20 4f 52 44 45 52 20 42 59  tisfies ORDER BY
23f0: 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72   */.  u8 isOrder
2400: 65 64 56 61 6c 69 64 3b 20 20 20 20 2f 2a 20 54  edValid;    /* T
2410: 72 75 65 20 69 66 20 74 68 65 20 69 73 4f 72 64  rue if the isOrd
2420: 65 72 65 64 20 66 69 65 6c 64 20 69 73 20 76 61  ered field is va
2430: 6c 69 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  lid */.  WhereLo
2440: 6f 70 20 2a 2a 61 4c 6f 6f 70 3b 20 20 20 20 2f  op **aLoop;    /
2450: 2a 20 41 72 72 61 79 20 6f 66 20 57 68 65 72 65  * Array of Where
2460: 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69 6d 70  Loop objects imp
2470: 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 70  lementing this p
2480: 61 74 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ath */.};../*.**
2490: 20 54 68 65 20 71 75 65 72 79 20 67 65 6e 65 72   The query gener
24a0: 61 74 6f 72 20 75 73 65 73 20 61 6e 20 61 72 72  ator uses an arr
24b0: 61 79 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20  ay of instances 
24c0: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
24d0: 65 20 74 6f 0a 2a 2a 20 68 65 6c 70 20 69 74 20  e to.** help it 
24e0: 61 6e 61 6c 79 7a 65 20 74 68 65 20 73 75 62 65  analyze the sube
24f0: 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
2500: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
2510: 20 45 61 63 68 20 57 48 45 52 45 0a 2a 2a 20 63   Each WHERE.** c
2520: 6c 61 75 73 65 20 73 75 62 65 78 70 72 65 73 73  lause subexpress
2530: 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64  ion is separated
2540: 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73   from the others
2550: 20 62 79 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   by AND operator
2560: 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c 79 2c 20 6f  s,.** usually, o
2570: 72 20 73 6f 6d 65 74 69 6d 65 73 20 73 75 62 65  r sometimes sube
2580: 78 70 72 65 73 73 69 6f 6e 73 20 73 65 70 61 72  xpressions separ
2590: 61 74 65 64 20 62 79 20 4f 52 2e 0a 2a 2a 0a 2a  ated by OR..**.*
25a0: 2a 20 41 6c 6c 20 57 68 65 72 65 54 65 72 6d 73  * All WhereTerms
25b0: 20 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 20 69   are collected i
25c0: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65  nto a single Whe
25d0: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
25e0: 72 65 2e 20 20 0a 2a 2a 20 54 68 65 20 66 6f 6c  re.  .** The fol
25f0: 6c 6f 77 69 6e 67 20 69 64 65 6e 74 69 74 79 20  lowing identity 
2600: 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  holds:.**.**    
2610: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 70 57      WhereTerm.pW
2620: 43 2d 3e 61 5b 57 68 65 72 65 54 65 72 6d 2e 69  C->a[WhereTerm.i
2630: 64 78 5d 20 3d 3d 20 57 68 65 72 65 54 65 72 6d  dx] == WhereTerm
2640: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 74 65  .**.** When a te
2650: 72 6d 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  rm is of the for
2660: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  m:.**.**        
2670: 20 20 20 20 20 20 58 20 3c 6f 70 3e 20 3c 65 78        X <op> <ex
2680: 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  pr>.**.** where 
2690: 58 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61  X is a column na
26a0: 6d 65 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  me and <op> is o
26b0: 6e 65 20 6f 66 20 63 65 72 74 61 69 6e 20 6f 70  ne of certain op
26c0: 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 74 68 65 6e  erators,.** then
26d0: 20 57 68 65 72 65 54 65 72 6d 2e 6c 65 66 74 43   WhereTerm.leftC
26e0: 75 72 73 6f 72 20 61 6e 64 20 57 68 65 72 65 54  ursor and WhereT
26f0: 65 72 6d 2e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  erm.u.leftColumn
2700: 20 72 65 63 6f 72 64 20 74 68 65 0a 2a 2a 20 63   record the.** c
2710: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 61 6e 64  ursor number and
2720: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 66   column number f
2730: 6f 72 20 58 2e 20 20 57 68 65 72 65 54 65 72 6d  or X.  WhereTerm
2740: 2e 65 4f 70 65 72 61 74 6f 72 20 72 65 63 6f 72  .eOperator recor
2750: 64 73 0a 2a 2a 20 74 68 65 20 3c 6f 70 3e 20 75  ds.** the <op> u
2760: 73 69 6e 67 20 61 20 62 69 74 6d 61 73 6b 20 65  sing a bitmask e
2770: 6e 63 6f 64 69 6e 67 20 64 65 66 69 6e 65 64 20  ncoding defined 
2780: 62 79 20 57 4f 5f 78 78 78 20 62 65 6c 6f 77 2e  by WO_xxx below.
2790: 20 20 54 68 65 0a 2a 2a 20 75 73 65 20 6f 66 20    The.** use of 
27a0: 61 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69  a bitmask encodi
27b0: 6e 67 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61  ng for the opera
27c0: 74 6f 72 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f  tor allows us to
27d0: 20 73 65 61 72 63 68 0a 2a 2a 20 71 75 69 63 6b   search.** quick
27e0: 6c 79 20 66 6f 72 20 74 65 72 6d 73 20 74 68 61  ly for terms tha
27f0: 74 20 6d 61 74 63 68 20 61 6e 79 20 6f 66 20 73  t match any of s
2800: 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74  everal different
2810: 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a   operators..**.*
2820: 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20 6d 69  * A WhereTerm mi
2830: 67 68 74 20 61 6c 73 6f 20 62 65 20 74 77 6f 20  ght also be two 
2840: 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73  or more subterms
2850: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52   connected by OR
2860: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
2870: 28 74 31 2e 58 20 3c 6f 70 3e 20 3c 65 78 70 72  (t1.X <op> <expr
2880: 3e 29 20 4f 52 20 28 74 31 2e 59 20 3c 6f 70 3e  >) OR (t1.Y <op>
2890: 20 3c 65 78 70 72 3e 29 20 4f 52 20 2e 2e 2e 2e   <expr>) OR ....
28a0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 73  .**.** In this s
28b0: 65 63 6f 6e 64 20 63 61 73 65 2c 20 77 74 46 6c  econd case, wtFl
28c0: 61 67 20 68 61 73 20 74 68 65 20 54 45 52 4d 5f  ag has the TERM_
28d0: 4f 52 49 4e 46 4f 20 62 69 74 20 73 65 74 20 61  ORINFO bit set a
28e0: 6e 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  nd eOperator==WO
28f0: 5f 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65 20 57  _OR.** and the W
2900: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
2910: 66 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20  fo field points 
2920: 74 6f 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66  to auxiliary inf
2930: 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  ormation that.**
2940: 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 61 62   is collected ab
2950: 6f 75 74 20 74 68 65 20 4f 52 20 63 6c 61 75 73  out the OR claus
2960: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 65  e..**.** If a te
2970: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
2980: 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20  clause does not 
2990: 6d 61 74 63 68 20 65 69 74 68 65 72 20 6f 66 20  match either of 
29a0: 74 68 65 20 74 77 6f 20 70 72 65 76 69 6f 75 73  the two previous
29b0: 0a 2a 2a 20 63 61 74 65 67 6f 72 69 65 73 2c 20  .** categories, 
29c0: 74 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 3d 3d  then eOperator==
29d0: 30 2e 20 20 54 68 65 20 57 68 65 72 65 54 65 72  0.  The WhereTer
29e0: 6d 2e 70 45 78 70 72 20 66 69 65 6c 64 20 69 73  m.pExpr field is
29f0: 20 73 74 69 6c 6c 20 73 65 74 0a 2a 2a 20 74 6f   still set.** to
2a00: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 75   the original su
2a10: 62 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74  bexpression cont
2a20: 65 6e 74 20 61 6e 64 20 77 74 46 6c 61 67 73 20  ent and wtFlags 
2a30: 69 73 20 73 65 74 20 75 70 20 61 70 70 72 6f 70  is set up approp
2a40: 72 69 61 74 65 6c 79 0a 2a 2a 20 62 75 74 20 6e  riately.** but n
2a50: 6f 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 69  o other fields i
2a60: 6e 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 20  n the WhereTerm 
2a70: 6f 62 6a 65 63 74 20 61 72 65 20 6d 65 61 6e 69  object are meani
2a80: 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ngful..**.** Whe
2a90: 6e 20 65 4f 70 65 72 61 74 6f 72 21 3d 30 2c 20  n eOperator!=0, 
2aa0: 70 72 65 72 65 71 52 69 67 68 74 20 61 6e 64 20  prereqRight and 
2ab0: 70 72 65 72 65 71 41 6c 6c 20 72 65 63 6f 72 64  prereqAll record
2ac0: 20 73 65 74 73 20 6f 66 20 63 75 72 73 6f 72 20   sets of cursor 
2ad0: 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20 62 75 74 20  numbers,.** but 
2ae0: 74 68 65 79 20 64 6f 20 73 6f 20 69 6e 64 69 72  they do so indir
2af0: 65 63 74 6c 79 2e 20 20 41 20 73 69 6e 67 6c 65  ectly.  A single
2b00: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74   WhereMaskSet st
2b10: 72 75 63 74 75 72 65 20 74 72 61 6e 73 6c 61 74  ructure translat
2b20: 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d  es.** cursor num
2b30: 62 65 72 20 69 6e 74 6f 20 62 69 74 73 20 61 6e  ber into bits an
2b40: 64 20 74 68 65 20 74 72 61 6e 73 6c 61 74 65 64  d the translated
2b50: 20 62 69 74 20 69 73 20 73 74 6f 72 65 64 20 69   bit is stored i
2b60: 6e 20 74 68 65 20 70 72 65 72 65 71 0a 2a 2a 20  n the prereq.** 
2b70: 66 69 65 6c 64 73 2e 20 20 54 68 65 20 74 72 61  fields.  The tra
2b80: 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75 73 65 64  nslation is used
2b90: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 78   in order to max
2ba0: 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d 62 65 72  imize the number
2bb0: 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74 68 61 74   of.** bits that
2bc0: 20 77 69 6c 6c 20 66 69 74 20 69 6e 20 61 20 42   will fit in a B
2bd0: 69 74 6d 61 73 6b 2e 20 20 54 68 65 20 56 44 42  itmask.  The VDB
2be0: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
2bf0: 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 73 70 72   might be.** spr
2c00: 65 61 64 20 6f 75 74 20 6f 76 65 72 20 74 68 65  ead out over the
2c10: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
2c20: 74 65 67 65 72 73 2e 20 20 46 6f 72 20 65 78 61  tegers.  For exa
2c30: 6d 70 6c 65 2c 20 74 68 65 20 63 75 72 73 6f 72  mple, the cursor
2c40: 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d 69 67 68  .** numbers migh
2c50: 74 20 62 65 20 33 2c 20 38 2c 20 39 2c 20 31 30  t be 3, 8, 9, 10
2c60: 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c 20 61 6e  , 20, 23, 41, an
2c70: 64 20 34 35 2e 20 20 54 68 65 20 57 68 65 72 65  d 45.  The Where
2c80: 4d 61 73 6b 53 65 74 0a 2a 2a 20 74 72 61 6e 73  MaskSet.** trans
2c90: 6c 61 74 65 73 20 74 68 65 73 65 20 73 70 61 72  lates these spar
2ca0: 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  se cursor number
2cb0: 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69  s into consecuti
2cc0: 76 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 62  ve integers.** b
2cd0: 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30 20  eginning with 0 
2ce0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65  in order to make
2cf0: 20 74 68 65 20 62 65 73 74 20 70 6f 73 73 69 62   the best possib
2d00: 6c 65 20 75 73 65 20 6f 66 20 74 68 65 20 61 76  le use of the av
2d10: 61 69 6c 61 62 6c 65 0a 2a 2a 20 62 69 74 73 20  ailable.** bits 
2d20: 69 6e 20 74 68 65 20 42 69 74 6d 61 73 6b 2e 20  in the Bitmask. 
2d30: 20 53 6f 2c 20 69 6e 20 74 68 65 20 65 78 61 6d   So, in the exam
2d40: 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 63  ple above, the c
2d50: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 0a 2a 2a  ursor numbers.**
2d60: 20 77 6f 75 6c 64 20 62 65 20 6d 61 70 70 65 64   would be mapped
2d70: 20 69 6e 74 6f 20 69 6e 74 65 67 65 72 73 20 30   into integers 0
2d80: 20 74 68 72 6f 75 67 68 20 37 2e 0a 2a 2a 0a 2a   through 7..**.*
2d90: 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
2da0: 74 65 72 6d 73 20 69 6e 20 61 20 6a 6f 69 6e 20  terms in a join 
2db0: 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68  is limited by th
2dc0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  e number of bits
2dd0: 0a 2a 2a 20 69 6e 20 70 72 65 72 65 71 52 69 67  .** in prereqRig
2de0: 68 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c  ht and prereqAll
2df0: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
2e00: 73 20 36 34 20 62 69 74 73 2c 20 68 65 6e 63 65  s 64 bits, hence
2e10: 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73 20 6f 6e   SQLite.** is on
2e20: 6c 79 20 61 62 6c 65 20 74 6f 20 70 72 6f 63 65  ly able to proce
2e30: 73 73 20 6a 6f 69 6e 73 20 77 69 74 68 20 36 34  ss joins with 64
2e40: 20 6f 72 20 66 65 77 65 72 20 74 61 62 6c 65 73   or fewer tables
2e50: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72  ..*/.struct Wher
2e60: 65 54 65 72 6d 20 7b 0a 20 20 45 78 70 72 20 2a  eTerm {.  Expr *
2e70: 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  pExpr;          
2e80: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2e90: 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
2ea0: 6e 20 74 68 61 74 20 69 73 20 74 68 69 73 20 74  n that is this t
2eb0: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  erm */.  int iPa
2ec0: 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
2ed0: 20 2f 2a 20 44 69 73 61 62 6c 65 20 70 57 43 2d   /* Disable pWC-
2ee0: 3e 61 5b 69 50 61 72 65 6e 74 5d 20 77 68 65 6e  >a[iParent] when
2ef0: 20 74 68 69 73 20 74 65 72 6d 20 64 69 73 61 62   this term disab
2f00: 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 66  led */.  int lef
2f10: 74 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20  tCursor;        
2f20: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
2f30: 72 20 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f 70  r of X in "X <op
2f40: 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20 75  > <expr>" */.  u
2f50: 6e 69 6f 6e 20 7b 0a 20 20 20 20 69 6e 74 20 6c  nion {.    int l
2f60: 65 66 74 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  eftColumn;      
2f70: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
2f80: 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20 3c  ber of X in "X <
2f90: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20  op> <expr>" */. 
2fa0: 20 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a     WhereOrInfo *
2fb0: 70 4f 72 49 6e 66 6f 3b 20 20 20 2f 2a 20 45 78  pOrInfo;   /* Ex
2fc0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
2fd0: 69 66 20 28 65 4f 70 65 72 61 74 6f 72 20 26 20  if (eOperator & 
2fe0: 57 4f 5f 4f 52 29 21 3d 30 20 2a 2f 0a 20 20 20  WO_OR)!=0 */.   
2ff0: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70   WhereAndInfo *p
3000: 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78 74 72  AndInfo; /* Extr
3010: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66  a information if
3020: 20 28 65 4f 70 65 72 61 74 6f 72 26 20 57 4f 5f   (eOperator& WO_
3030: 41 4e 44 29 21 3d 30 20 2a 2f 0a 20 20 7d 20 75  AND)!=0 */.  } u
3040: 3b 0a 20 20 75 31 36 20 65 4f 70 65 72 61 74 6f  ;.  u16 eOperato
3050: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  r;          /* A
3060: 20 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73   WO_xx value des
3070: 63 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a  cribing <op> */.
3080: 20 20 75 38 20 77 74 46 6c 61 67 73 3b 20 20 20    u8 wtFlags;   
3090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 45 52            /* TER
30a0: 4d 5f 78 78 78 20 62 69 74 20 66 6c 61 67 73 2e  M_xxx bit flags.
30b0: 20 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20    See below */. 
30c0: 20 75 38 20 6e 43 68 69 6c 64 3b 20 20 20 20 20   u8 nChild;     
30d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
30e0: 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 74  er of children t
30f0: 68 61 74 20 6d 75 73 74 20 64 69 73 61 62 6c 65  hat must disable
3100: 20 75 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c   us */.  WhereCl
3110: 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
3120: 20 2f 2a 20 54 68 65 20 63 6c 61 75 73 65 20 74   /* The clause t
3130: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
3140: 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b   of */.  Bitmask
3150: 20 70 72 65 72 65 71 52 69 67 68 74 3b 20 20 20   prereqRight;   
3160: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74   /* Bitmask of t
3170: 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 70 45  ables used by pE
3180: 78 70 72 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20  xpr->pRight */. 
3190: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41   Bitmask prereqA
31a0: 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d  ll;      /* Bitm
31b0: 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65  ask of tables re
31c0: 66 65 72 65 6e 63 65 64 20 62 79 20 70 45 78 70  ferenced by pExp
31d0: 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  r */.};../*.** A
31e0: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66  llowed values of
31f0: 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61   WhereTerm.wtFla
3200: 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45  gs.*/.#define TE
3210: 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20 30 78  RM_DYNAMIC    0x
3220: 30 31 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  01   /* Need to 
3230: 63 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  call sqlite3Expr
3240: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
3250: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  ) */.#define TER
3260: 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78 30  M_VIRTUAL    0x0
3270: 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62 79 20  2   /* Added by 
3280: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20  the optimizer.  
3290: 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23  Do not code */.#
32a0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45  define TERM_CODE
32b0: 44 20 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a  D      0x04   /*
32c0: 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 61 6c   This term is al
32d0: 72 65 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23  ready coded */.#
32e0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49  define TERM_COPI
32f0: 45 44 20 20 20 20 20 30 78 30 38 20 20 20 2f 2a  ED     0x08   /*
3300: 20 48 61 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a   Has a child */.
3310: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49  #define TERM_ORI
3320: 4e 46 4f 20 20 20 20 20 30 78 31 30 20 20 20 2f  NFO     0x10   /
3330: 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74  * Need to free t
3340: 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70  he WhereTerm.u.p
3350: 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f  OrInfo object */
3360: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e  .#define TERM_AN
3370: 44 49 4e 46 4f 20 20 20 20 30 78 32 30 20 20 20  DINFO    0x20   
3380: 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20  /* Need to free 
3390: 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  the WhereTerm.u.
33a0: 70 41 6e 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a  pAndInfo obj */.
33b0: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f  #define TERM_OR_
33c0: 4f 4b 20 20 20 20 20 20 30 78 34 30 20 20 20 2f  OK      0x40   /
33d0: 2a 20 55 73 65 64 20 64 75 72 69 6e 67 20 4f 52  * Used during OR
33e0: 2d 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69  -clause processi
33f0: 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ng */.#ifdef SQL
3400: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
3410: 0a 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f  .#  define TERM_
3420: 56 4e 55 4c 4c 20 20 20 20 30 78 38 30 20 20 20  VNULL    0x80   
3430: 2f 2a 20 4d 61 6e 75 66 61 63 74 75 72 65 64 20  /* Manufactured 
3440: 78 3e 4e 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55 4c  x>NULL or x<=NUL
3450: 4c 20 74 65 72 6d 20 2a 2f 0a 23 65 6c 73 65 0a  L term */.#else.
3460: 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  #  define TERM_V
3470: 4e 55 4c 4c 20 20 20 20 30 78 30 30 20 20 20 2f  NULL    0x00   /
3480: 2a 20 44 69 73 61 62 6c 65 64 20 69 66 20 6e 6f  * Disabled if no
3490: 74 20 75 73 69 6e 67 20 73 74 61 74 33 20 2a 2f  t using stat3 */
34a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
34b0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
34c0: 65 20 57 68 65 72 65 53 63 61 6e 20 6f 62 6a 65  e WhereScan obje
34d0: 63 74 20 69 73 20 75 73 65 64 20 61 73 20 61 6e  ct is used as an
34e0: 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f   iterator for lo
34f0: 63 61 74 69 6e 67 0a 2a 2a 20 74 65 72 6d 73 20  cating.** terms 
3500: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
3510: 75 73 65 20 74 68 61 74 20 61 72 65 20 75 73 65  use that are use
3520: 66 75 6c 20 74 6f 20 74 68 65 20 71 75 65 72 79  ful to the query
3530: 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 72   planner..*/.str
3540: 75 63 74 20 57 68 65 72 65 53 63 61 6e 20 7b 0a  uct WhereScan {.
3550: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
3560: 4f 72 69 67 57 43 3b 20 20 20 20 20 20 2f 2a 20  OrigWC;      /* 
3570: 4f 72 69 67 69 6e 61 6c 2c 20 69 6e 6e 65 72 6d  Original, innerm
3580: 6f 73 74 20 57 68 65 72 65 43 6c 61 75 73 65 20  ost WhereClause 
3590: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
35a0: 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
35b0: 2f 2a 20 57 68 65 72 65 43 6c 61 75 73 65 20 63  /* WhereClause c
35c0: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 73  urrently being s
35d0: 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 63 68 61 72  canned */.  char
35e0: 20 2a 7a 43 6f 6c 6c 4e 61 6d 65 3b 20 20 20 20   *zCollName;    
35f0: 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72         /* Requir
3600: 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ed collating seq
3610: 75 65 6e 63 65 2c 20 69 66 20 6e 6f 74 20 4e 55  uence, if not NU
3620: 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 69 64 78  LL */.  char idx
3630: 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  aff;            
3640: 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61 74 63 68     /* Must match
3650: 20 74 68 69 73 20 61 66 66 69 6e 69 74 79 2c 20   this affinity, 
3660: 69 66 20 7a 43 6f 6c 6c 4e 61 6d 65 21 3d 4e 55  if zCollName!=NU
3670: 4c 4c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  LL */.  unsigned
3680: 20 63 68 61 72 20 6e 45 71 75 69 76 3b 20 20 20   char nEquiv;   
3690: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
36a0: 65 6e 74 72 69 65 73 20 69 6e 20 61 45 71 75 69  entries in aEqui
36b0: 76 5b 5d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  v[] */.  unsigne
36c0: 64 20 63 68 61 72 20 69 45 71 75 69 76 3b 20 20  d char iEquiv;  
36d0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73      /* Next unus
36e0: 65 64 20 73 6c 6f 74 20 69 6e 20 61 45 71 75 69  ed slot in aEqui
36f0: 76 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d  v[] */.  u32 opM
3700: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
3710: 20 20 20 20 2f 2a 20 41 63 63 65 70 74 61 62 6c      /* Acceptabl
3720: 65 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  e operators */. 
3730: 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20   int k;         
3740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
3750: 65 73 75 6d 65 20 73 63 61 6e 6e 69 6e 67 20 61  esume scanning a
3760: 74 20 74 68 69 73 2d 3e 70 57 43 2d 3e 61 5b 74  t this->pWC->a[t
3770: 68 69 73 2d 3e 6b 5d 20 2a 2f 0a 20 20 69 6e 74  his->k] */.  int
3780: 20 61 45 71 75 69 76 5b 32 32 5d 3b 20 20 20 20   aEquiv[22];    
3790: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
37a0: 72 2c 43 6f 6c 75 6d 6e 20 70 61 69 72 73 20 66  r,Column pairs f
37b0: 6f 72 20 65 71 75 69 76 61 6c 65 6e 63 65 20 63  or equivalence c
37c0: 6c 61 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  lasses */.};../*
37d0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
37e0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
37f0: 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73   structure holds
3800: 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
3810: 20 61 62 6f 75 74 20 61 0a 2a 2a 20 57 48 45 52   about a.** WHER
3820: 45 20 63 6c 61 75 73 65 2e 20 20 4d 6f 73 74 6c  E clause.  Mostl
3830: 79 20 74 68 69 73 20 69 73 20 61 20 63 6f 6e 74  y this is a cont
3840: 61 69 6e 65 72 20 66 6f 72 20 6f 6e 65 20 6f 72  ainer for one or
3850: 20 6d 6f 72 65 20 57 68 65 72 65 54 65 72 6d 73   more WhereTerms
3860: 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 6c 61 6e 61 74  ..**.** Explanat
3870: 69 6f 6e 20 6f 66 20 70 4f 75 74 65 72 3a 20 20  ion of pOuter:  
3880: 46 6f 72 20 61 20 57 48 45 52 45 20 63 6c 61 75  For a WHERE clau
3890: 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  se of the form.*
38a0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  *.**           a
38b0: 20 41 4e 44 20 28 28 62 20 41 4e 44 20 63 29 20   AND ((b AND c) 
38c0: 4f 52 20 28 64 20 41 4e 44 20 65 29 29 20 41 4e  OR (d AND e)) AN
38d0: 44 20 66 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  D f.**.** There 
38e0: 61 72 65 20 73 65 70 61 72 61 74 65 20 57 68 65  are separate Whe
38f0: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 73  reClause objects
3900: 20 66 6f 72 20 74 68 65 20 77 68 6f 6c 65 20 63   for the whole c
3910: 6c 61 75 73 65 20 61 6e 64 20 66 6f 72 0a 2a 2a  lause and for.**
3920: 20 74 68 65 20 73 75 62 63 6c 61 75 73 65 73 20   the subclauses 
3930: 22 28 62 20 41 4e 44 20 63 29 22 20 61 6e 64 20  "(b AND c)" and 
3940: 22 28 64 20 41 4e 44 20 65 29 22 2e 20 20 54 68  "(d AND e)".  Th
3950: 65 20 70 4f 75 74 65 72 20 66 69 65 6c 64 20 6f  e pOuter field o
3960: 66 20 74 68 65 0a 2a 2a 20 73 75 62 63 6c 61 75  f the.** subclau
3970: 73 65 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ses points to th
3980: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
3990: 6a 65 63 74 20 66 6f 72 20 74 68 65 20 77 68 6f  ject for the who
39a0: 6c 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  le clause..*/.st
39b0: 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65  ruct WhereClause
39c0: 20 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a   {.  WhereInfo *
39d0: 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 2f 2a  pWInfo;       /*
39e0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
39f0: 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74  ocessing context
3a00: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
3a10: 65 20 2a 70 4f 75 74 65 72 3b 20 20 20 20 20 2f  e *pOuter;     /
3a20: 2a 20 4f 75 74 65 72 20 63 6f 6e 6a 75 6e 63 74  * Outer conjunct
3a30: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6f 70 3b 20  ion */.  u8 op; 
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 2f 2a 20 53 70 6c 69 74 20 6f 70 65 72 61    /* Split opera
3a60: 74 6f 72 2e 20 20 54 4b 5f 41 4e 44 20 6f 72 20  tor.  TK_AND or 
3a70: 54 4b 5f 4f 52 20 2a 2f 0a 20 20 69 6e 74 20 6e  TK_OR */.  int n
3a80: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
3a90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3aa0: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20   terms */.  int 
3ab0: 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20  nSlot;          
3ac0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3ad0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 5b 5d  f entries in a[]
3ae0: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
3af0: 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *a;            /
3b00: 2a 20 45 61 63 68 20 61 5b 5d 20 64 65 73 63 72  * Each a[] descr
3b10: 69 62 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ibes a term of t
3b20: 68 65 20 57 48 45 52 45 20 63 6c 75 61 73 65 20  he WHERE cluase 
3b30: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
3b40: 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f 53 54 41 43  QLITE_SMALL_STAC
3b50: 4b 29 0a 20 20 57 68 65 72 65 54 65 72 6d 20 61  K).  WhereTerm a
3b60: 53 74 61 74 69 63 5b 31 5d 3b 20 20 20 20 2f 2a  Static[1];    /*
3b70: 20 49 6e 69 74 69 61 6c 20 73 74 61 74 69 63 20   Initial static 
3b80: 73 70 61 63 65 20 66 6f 72 20 61 5b 5d 20 2a 2f  space for a[] */
3b90: 0a 23 65 6c 73 65 0a 20 20 57 68 65 72 65 54 65  .#else.  WhereTe
3ba0: 72 6d 20 61 53 74 61 74 69 63 5b 38 5d 3b 20 20  rm aStatic[8];  
3bb0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
3bc0: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
3bd0: 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  ] */.#endif.};..
3be0: 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72  /*.** A WhereTer
3bf0: 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74 6f 72  m with eOperator
3c00: 3d 3d 57 4f 5f 4f 52 20 68 61 73 20 69 74 73 20  ==WO_OR has its 
3c10: 75 2e 70 4f 72 49 6e 66 6f 20 70 6f 69 6e 74 65  u.pOrInfo pointe
3c20: 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61 20 64 79  r set to.** a dy
3c30: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
3c40: 74 65 64 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ted instance of 
3c50: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3c60: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
3c70: 63 74 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 7b  ct WhereOrInfo {
3c80: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 77  .  WhereClause w
3c90: 63 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  c;          /* D
3ca0: 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 69 6e 74  ecomposition int
3cb0: 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20  o subterms */.  
3cc0: 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c  Bitmask indexabl
3cd0: 65 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d  e;       /* Bitm
3ce0: 61 73 6b 20 6f 66 20 61 6c 6c 20 69 6e 64 65 78  ask of all index
3cf0: 61 62 6c 65 20 74 61 62 6c 65 73 20 69 6e 20 74  able tables in t
3d00: 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 7d 3b 0a  he clause */.};.
3d10: 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65  ./*.** A WhereTe
3d20: 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74 6f  rm with eOperato
3d30: 72 3d 3d 57 4f 5f 41 4e 44 20 68 61 73 20 69 74  r==WO_AND has it
3d40: 73 20 75 2e 70 41 6e 64 49 6e 66 6f 20 70 6f 69  s u.pAndInfo poi
3d50: 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61  nter set to.** a
3d60: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
3d70: 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65 20  ocated instance 
3d80: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3d90: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
3da0: 74 72 75 63 74 20 57 68 65 72 65 41 6e 64 49 6e  truct WhereAndIn
3db0: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
3dc0: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
3dd0: 2f 2a 20 54 68 65 20 73 75 62 65 78 70 72 65 73  /* The subexpres
3de0: 73 69 6f 6e 20 62 72 6f 6b 65 6e 20 6f 75 74 20  sion broken out 
3df0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
3e00: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
3e10: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
3e20: 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20  ure keeps track 
3e30: 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20  of a mapping.** 
3e40: 62 65 74 77 65 65 6e 20 56 44 42 45 20 63 75 72  between VDBE cur
3e50: 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e 64 20  sor numbers and 
3e60: 62 69 74 73 20 6f 66 20 74 68 65 20 62 69 74 6d  bits of the bitm
3e70: 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54 65 72  asks in WhereTer
3e80: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42  m..**.** The VDB
3e90: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
3ea0: 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65 67   are small integ
3eb0: 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ers contained in
3ec0: 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69 74 65   .** SrcList_ite
3ed0: 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20 45 78  m.iCursor and Ex
3ee0: 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73  pr.iTable fields
3ef0: 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76 65 6e  .  For any given
3f00: 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75 73   WHERE .** claus
3f10: 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  e, the cursor nu
3f20: 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f 74 20  mbers might not 
3f30: 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64  begin with 0 and
3f40: 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a 20 63   they might.** c
3f50: 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e 20 74  ontain gaps in t
3f60: 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73 65 71  he numbering seq
3f70: 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65 20 77  uence.  But we w
3f80: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61 78 69  ant to make maxi
3f90: 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20 74 68  mum.** use of th
3fa0: 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20 62 69  e bits in our bi
3fb0: 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20 73 74  tmasks.  This st
3fc0: 72 75 63 74 75 72 65 20 70 72 6f 76 69 64 65 73  ructure provides
3fd0: 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 66 72   a mapping.** fr
3fe0: 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20 63 75  om the sparse cu
3ff0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74  rsor numbers int
4000: 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e  o consecutive in
4010: 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  tegers beginning
4020: 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a 0a 2a  .** with 0..**.*
4030: 2a 20 49 66 20 57 68 65 72 65 4d 61 73 6b 53 65  * If WhereMaskSe
4040: 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d 65  t.ix[A]==B it me
4050: 61 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d 74  ans that The A-t
4060: 68 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d 61  h bit of a Bitma
4070: 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  sk.** correspond
4080: 73 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  s VDBE cursor nu
4090: 6d 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d 74  mber B.  The A-t
40a0: 68 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d 61  h bit of a bitma
40b0: 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a  sk is 1<<A..**.*
40c0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
40d0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
40e0: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75 73  se expression us
40f0: 65 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a 2a  ed these VDBE.**
4100: 20 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35 2c   cursors:  4, 5,
4110: 20 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e 20   8, 29, 57, 73. 
4120: 20 54 68 65 6e 20 74 68 65 20 20 57 68 65 72 65   Then the  Where
4130: 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
4140: 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20 74  e.** would map t
4150: 68 6f 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  hose cursor numb
4160: 65 72 73 20 69 6e 74 6f 20 62 69 74 73 20 30 20  ers into bits 0 
4170: 74 68 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a 2a  through 5..**.**
4180: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6d   Note that the m
4190: 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  apping is not ne
41a0: 63 65 73 73 61 72 69 6c 79 20 6f 72 64 65 72 65  cessarily ordere
41b0: 64 2e 20 20 49 6e 20 74 68 65 20 65 78 61 6d 70  d.  In the examp
41c0: 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 65  le.** above, the
41d0: 20 6d 61 70 70 69 6e 67 20 6d 69 67 68 74 20 67   mapping might g
41e0: 6f 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 34 2d  o like this:  4-
41f0: 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c 20  >3, 5->1, 8->2, 
4200: 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35 2c  29->0,.** 57->5,
4210: 20 37 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65 20   73->4.  Or one 
4220: 6f 66 20 37 31 39 20 6f 74 68 65 72 20 63 6f 6d  of 719 other com
4230: 62 69 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74 20  binations might 
4240: 62 65 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20 64  be used. It.** d
4250: 6f 65 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6d  oes not really m
4260: 61 74 74 65 72 2e 20 20 57 68 61 74 20 69 73 20  atter.  What is 
4270: 69 6d 70 6f 72 74 61 6e 74 20 69 73 20 74 68 61  important is tha
4280: 74 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 0a  t sparse cursor.
4290: 2a 2a 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20 67  ** numbers all g
42a0: 65 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 62  et mapped into b
42b0: 69 74 20 6e 75 6d 62 65 72 73 20 74 68 61 74 20  it numbers that 
42c0: 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64  begin with 0 and
42d0: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20 67   contain.** no g
42e0: 61 70 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57  aps..*/.struct W
42f0: 68 65 72 65 4d 61 73 6b 53 65 74 20 7b 0a 20 20  hereMaskSet {.  
4300: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4320: 20 4e 75 6d 62 65 72 20 6f 66 20 61 73 73 69 67   Number of assig
4330: 6e 65 64 20 63 75 72 73 6f 72 20 76 61 6c 75 65  ned cursor value
4340: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 78 5b 42 4d  s */.  int ix[BM
4350: 53 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  S];             
4360: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 61       /* Cursor a
4370: 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63 68 20  ssigned to each 
4380: 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  bit */.};../*.**
4390: 20 54 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   This object is 
43a0: 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72  a convenience wr
43b0: 61 70 70 65 72 20 68 6f 6c 64 69 6e 67 20 61 6c  apper holding al
43c0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65  l information ne
43d0: 65 64 65 64 0a 2a 2a 20 74 6f 20 63 6f 6e 73 74  eded.** to const
43e0: 72 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 20 6f  ruct WhereLoop o
43f0: 62 6a 65 63 74 73 20 66 6f 72 20 61 20 70 61 72  bjects for a par
4400: 74 69 63 75 6c 61 72 20 71 75 65 72 79 2e 0a 2a  ticular query..*
4410: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f  /.struct WhereLo
4420: 6f 70 42 75 69 6c 64 65 72 20 7b 0a 20 20 57 68  opBuilder {.  Wh
4430: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
4440: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72          /* Infor
4450: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69  mation about thi
4460: 73 20 57 48 45 52 45 20 2a 2f 0a 20 20 57 68 65  s WHERE */.  Whe
4470: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
4480: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
4490: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a  clause terms */.
44a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
44b0: 65 72 42 79 3b 20 20 20 20 20 20 20 2f 2a 20 4f  erBy;       /* O
44c0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
44d0: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
44e0: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  New;          /*
44f0: 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c   Template WhereL
4500: 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72  oop */.  WhereOr
4510: 53 65 74 20 2a 70 4f 72 53 65 74 3b 20 20 20 20  Set *pOrSet;    
4520: 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 62 65 73     /* Record bes
4530: 74 20 6c 6f 6f 70 73 20 68 65 72 65 2c 20 69 66  t loops here, if
4540: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 23 69 66   not NULL */.#if
4550: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4560: 45 5f 53 54 41 54 34 0a 20 20 55 6e 70 61 63 6b  E_STAT4.  Unpack
4570: 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 3b 20  edRecord *pRec; 
4580: 20 20 20 20 2f 2a 20 50 72 6f 62 65 20 66 6f 72      /* Probe for
4590: 20 73 74 61 74 34 20 28 69 66 20 72 65 71 75 69   stat4 (if requi
45a0: 72 65 64 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  red) */.  int nR
45b0: 65 63 56 61 6c 69 64 3b 20 20 20 20 20 20 20 20  ecValid;        
45c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
45d0: 20 76 61 6c 69 64 20 66 69 65 6c 64 73 20 63 75   valid fields cu
45e0: 72 72 65 6e 74 6c 79 20 69 6e 20 70 52 65 63 20  rrently in pRec 
45f0: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
4600: 0a 2a 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c  .** The WHERE cl
4610: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
4620: 72 6f 75 74 69 6e 65 20 68 61 73 20 74 77 6f 20  routine has two 
4630: 68 61 6c 76 65 73 2e 20 20 54 68 65 0a 2a 2a 20  halves.  The.** 
4640: 66 69 72 73 74 20 70 61 72 74 20 64 6f 65 73 20  first part does 
4650: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
4660: 20 57 48 45 52 45 20 6c 6f 6f 70 20 61 6e 64 20   WHERE loop and 
4670: 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 68 61  the second.** ha
4680: 6c 66 20 64 6f 65 73 20 74 68 65 20 74 61 69 6c  lf does the tail
4690: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f   of the WHERE lo
46a0: 6f 70 2e 20 20 41 6e 20 69 6e 73 74 61 6e 63 65  op.  An instance
46b0: 20 6f 66 0a 2a 2a 20 74 68 69 73 20 73 74 72 75   of.** this stru
46c0: 63 74 75 72 65 20 69 73 20 72 65 74 75 72 6e 65  cture is returne
46d0: 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 68  d by the first h
46e0: 61 6c 66 20 61 6e 64 20 70 61 73 73 65 64 0a 2a  alf and passed.*
46f0: 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 63 6f 6e  * into the secon
4700: 64 20 68 61 6c 66 20 74 6f 20 67 69 76 65 20 73  d half to give s
4710: 6f 6d 65 20 63 6f 6e 74 69 6e 75 69 74 79 2e 0a  ome continuity..
4720: 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  **.** An instanc
4730: 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  e of this object
4740: 20 68 6f 6c 64 73 20 74 68 65 20 63 6f 6d 70 6c   holds the compl
4750: 65 74 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  ete state of the
4760: 20 71 75 65 72 79 0a 2a 2a 20 70 6c 61 6e 6e 65   query.** planne
4770: 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  r..*/.struct Whe
4780: 72 65 49 6e 66 6f 20 7b 0a 20 20 50 61 72 73 65  reInfo {.  Parse
4790: 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
47a0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
47b0: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
47c0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
47d0: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
47e0: 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st;        /* Li
47f0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
4800: 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78  the join */.  Ex
4810: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
4820: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f  ;       /* The O
4830: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
4840: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  r NULL */.  Expr
4850: 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74  List *pResultSet
4860: 3b 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20  ;     /* Result 
4870: 73 65 74 2e 20 44 49 53 54 49 4e 43 54 20 6f 70  set. DISTINCT op
4880: 65 72 61 74 65 73 20 6f 6e 20 74 68 65 73 65 20  erates on these 
4890: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
48a0: 70 4c 6f 6f 70 73 3b 20 20 20 20 20 20 20 20 2f  pLoops;        /
48b0: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 57 68  * List of all Wh
48c0: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
48d0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 76  */.  Bitmask rev
48e0: 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  Mask;          /
48f0: 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20  * Mask of ORDER 
4900: 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 6e 65  BY terms that ne
4910: 65 64 20 72 65 76 65 72 73 69 6e 67 20 2a 2f 0a  ed reversing */.
4920: 20 20 57 68 65 72 65 43 6f 73 74 20 6e 52 6f 77    WhereCost nRow
4930: 4f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  Out;        /* E
4940: 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
4950: 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a  of output rows *
4960: 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
4970: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs;           /*
4980: 20 46 6c 61 67 73 20 6f 72 69 67 69 6e 61 6c 6c   Flags originall
4990: 79 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  y passed to sqli
49a0: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
49b0: 2a 2f 0a 20 20 75 38 20 62 4f 42 53 61 74 3b 20  */.  u8 bOBSat; 
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
49d0: 2a 20 4f 52 44 45 52 20 42 59 20 73 61 74 69 73  * ORDER BY satis
49e0: 66 69 65 64 20 62 79 20 69 6e 64 69 63 65 73 20  fied by indices 
49f0: 2a 2f 0a 20 20 75 38 20 6f 6b 4f 6e 65 50 61 73  */.  u8 okOnePas
4a00: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s;             /
4a10: 2a 20 4f 6b 20 74 6f 20 75 73 65 20 6f 6e 65 2d  * Ok to use one-
4a20: 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 66  pass algorithm f
4a30: 6f 72 20 55 50 44 41 54 45 2f 44 45 4c 45 54 45  or UPDATE/DELETE
4a40: 20 2a 2f 0a 20 20 75 38 20 75 6e 74 65 73 74 65   */.  u8 unteste
4a50: 64 54 65 72 6d 73 3b 20 20 20 20 20 20 20 20 20  dTerms;         
4a60: 2f 2a 20 4e 6f 74 20 61 6c 6c 20 57 48 45 52 45  /* Not all WHERE
4a70: 20 74 65 72 6d 73 20 72 65 73 6f 6c 76 65 64 20   terms resolved 
4a80: 62 79 20 6f 75 74 65 72 20 6c 6f 6f 70 20 2a 2f  by outer loop */
4a90: 0a 20 20 75 38 20 65 44 69 73 74 69 6e 63 74 3b  .  u8 eDistinct;
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4ab0: 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
4ac0: 5f 44 49 53 54 49 4e 43 54 5f 2a 20 76 61 6c 75  _DISTINCT_* valu
4ad0: 65 73 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38  es below */.  u8
4ae0: 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20   nLevel;        
4af0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4b00: 72 20 6f 66 20 6e 65 73 74 65 64 20 6c 6f 6f 70  r of nested loop
4b10: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6f 70 3b 20   */.  int iTop; 
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b30: 2f 2a 20 54 68 65 20 76 65 72 79 20 62 65 67 69  /* The very begi
4b40: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 57 48 45  nning of the WHE
4b50: 52 45 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  RE loop */.  int
4b60: 20 69 43 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20   iContinue;     
4b70: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
4b80: 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
4b90: 77 69 74 68 20 6e 65 78 74 20 72 65 63 6f 72 64  with next record
4ba0: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
4bb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4bc0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
4bd0: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
4be0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 73   loop */.  int s
4bf0: 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 20  avedNQueryLoop; 
4c00: 20 20 20 20 20 2f 2a 20 70 50 61 72 73 65 2d 3e       /* pParse->
4c10: 6e 51 75 65 72 79 4c 6f 6f 70 20 6f 75 74 73 69  nQueryLoop outsi
4c20: 64 65 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f  de the WHERE loo
4c30: 70 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  p */.  WhereMask
4c40: 53 65 74 20 73 4d 61 73 6b 53 65 74 3b 20 20 20  Set sMaskSet;   
4c50: 20 2f 2a 20 4d 61 70 20 63 75 72 73 6f 72 20 6e   /* Map cursor n
4c60: 75 6d 62 65 72 73 20 74 6f 20 62 69 74 6d 61 73  umbers to bitmas
4c70: 6b 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ks */.  WhereCla
4c80: 75 73 65 20 73 57 43 3b 20 20 20 20 20 20 20 20  use sWC;        
4c90: 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69    /* Decompositi
4ca0: 6f 6e 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  on of the WHERE 
4cb0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
4cc0: 65 4c 65 76 65 6c 20 61 5b 31 5d 3b 20 20 20 20  eLevel a[1];    
4cd0: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
4ce0: 74 69 6f 6e 20 61 62 6f 75 74 20 65 61 63 68 20  tion about each 
4cf0: 6e 65 73 74 20 6c 6f 6f 70 20 69 6e 20 57 48 45  nest loop in WHE
4d00: 52 45 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  RE */.};../*.** 
4d10: 42 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65  Bitmasks for the
4d20: 20 6f 70 65 72 61 74 6f 72 73 20 6f 6e 20 57 68   operators on Wh
4d30: 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 73 2e  ereTerm objects.
4d40: 20 20 54 68 65 73 65 20 61 72 65 20 61 6c 6c 0a    These are all.
4d50: 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  ** operators tha
4d60: 74 20 61 72 65 20 6f 66 20 69 6e 74 65 72 65 73  t are of interes
4d70: 74 20 74 6f 20 74 68 65 20 71 75 65 72 79 20 70  t to the query p
4d80: 6c 61 6e 6e 65 72 2e 20 20 41 6e 0a 2a 2a 20 4f  lanner.  An.** O
4d90: 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  R-ed combination
4da0: 20 6f 66 20 74 68 65 73 65 20 76 61 6c 75 65 73   of these values
4db0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65   can be used whe
4dc0: 6e 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 0a  n searching for.
4dd0: 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 20 57 68  ** particular Wh
4de0: 65 72 65 54 65 72 6d 73 20 77 69 74 68 69 6e 20  ereTerms within 
4df0: 61 20 57 68 65 72 65 43 6c 61 75 73 65 2e 0a 2a  a WhereClause..*
4e00: 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 4e 20  /.#define WO_IN 
4e10: 20 20 20 20 30 78 30 30 31 0a 23 64 65 66 69 6e      0x001.#defin
4e20: 65 20 57 4f 5f 45 51 20 20 20 20 20 30 78 30 30  e WO_EQ     0x00
4e30: 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 54 20  2.#define WO_LT 
4e40: 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f      (WO_EQ<<(TK_
4e50: 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69  LT-TK_EQ)).#defi
4e60: 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20 28 57 4f  ne WO_LE     (WO
4e70: 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45  _EQ<<(TK_LE-TK_E
4e80: 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47  Q)).#define WO_G
4e90: 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54  T     (WO_EQ<<(T
4ea0: 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65  K_GT-TK_EQ)).#de
4eb0: 66 69 6e 65 20 57 4f 5f 47 45 20 20 20 20 20 28  fine WO_GE     (
4ec0: 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b  WO_EQ<<(TK_GE-TK
4ed0: 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f  _EQ)).#define WO
4ee0: 5f 4d 41 54 43 48 20 20 30 78 30 34 30 0a 23 64  _MATCH  0x040.#d
4ef0: 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55 4c 4c 20  efine WO_ISNULL 
4f00: 30 78 30 38 30 0a 23 64 65 66 69 6e 65 20 57 4f  0x080.#define WO
4f10: 5f 4f 52 20 20 20 20 20 30 78 31 30 30 20 20 20  _OR     0x100   
4f20: 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f      /* Two or mo
4f30: 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  re OR-connected 
4f40: 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65  terms */.#define
4f50: 20 57 4f 5f 41 4e 44 20 20 20 20 30 78 32 30 30   WO_AND    0x200
4f60: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
4f70: 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e 6e 65 63   more AND-connec
4f80: 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65  ted terms */.#de
4f90: 66 69 6e 65 20 57 4f 5f 45 51 55 49 56 20 20 30  fine WO_EQUIV  0
4fa0: 78 34 30 30 20 20 20 20 20 20 20 2f 2a 20 4f 66  x400       /* Of
4fb0: 20 74 68 65 20 66 6f 72 6d 20 41 3d 3d 42 2c 20   the form A==B, 
4fc0: 62 6f 74 68 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  both columns */.
4fd0: 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f 4f 50 20  #define WO_NOOP 
4fe0: 20 20 30 78 38 30 30 20 20 20 20 20 20 20 2f 2a    0x800       /*
4ff0: 20 54 68 69 73 20 74 65 72 6d 20 64 6f 65 73 20   This term does 
5000: 6e 6f 74 20 72 65 73 74 72 69 63 74 20 73 65 61  not restrict sea
5010: 72 63 68 20 73 70 61 63 65 20 2a 2f 0a 0a 23 64  rch space */..#d
5020: 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20 20 20 20  efine WO_ALL    
5030: 30 78 66 66 66 20 20 20 20 20 20 20 2f 2a 20 4d  0xfff       /* M
5040: 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f 73 73 69  ask of all possi
5050: 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20  ble WO_* values 
5060: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 53 49  */.#define WO_SI
5070: 4e 47 4c 45 20 30 78 30 66 66 20 20 20 20 20 20  NGLE 0x0ff      
5080: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
5090: 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f  non-compound WO_
50a0: 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a  * values */../*.
50b0: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 64 65 66  ** These are def
50c0: 69 6e 69 74 69 6f 6e 73 20 6f 66 20 62 69 74 73  initions of bits
50d0: 20 69 6e 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   in the WhereLoo
50e0: 70 2e 77 73 46 6c 61 67 73 20 66 69 65 6c 64 2e  p.wsFlags field.
50f0: 0a 2a 2a 20 54 68 65 20 70 61 72 74 69 63 75 6c  .** The particul
5100: 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ar combination o
5110: 66 20 62 69 74 73 20 69 6e 20 65 61 63 68 20 57  f bits in each W
5120: 68 65 72 65 4c 6f 6f 70 20 68 65 6c 70 20 74 6f  hereLoop help to
5130: 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 74 68  .** determine th
5140: 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74  e algorithm that
5150: 20 57 68 65 72 65 4c 6f 6f 70 20 72 65 70 72 65   WhereLoop repre
5160: 73 65 6e 74 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  sents..*/.#defin
5170: 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  e WHERE_COLUMN_E
5180: 51 20 20 20 20 30 78 30 30 30 30 30 30 30 31 20  Q    0x00000001 
5190: 20 2f 2a 20 78 3d 45 58 50 52 20 2a 2f 0a 23 64   /* x=EXPR */.#d
51a0: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
51b0: 4d 4e 5f 52 41 4e 47 45 20 30 78 30 30 30 30 30  MN_RANGE 0x00000
51c0: 30 30 32 20 20 2f 2a 20 78 3c 45 58 50 52 20 61  002  /* x<EXPR a
51d0: 6e 64 2f 6f 72 20 78 3e 45 58 50 52 20 2a 2f 0a  nd/or x>EXPR */.
51e0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f  #define WHERE_CO
51f0: 4c 55 4d 4e 5f 49 4e 20 20 20 20 30 78 30 30 30  LUMN_IN    0x000
5200: 30 30 30 30 34 20 20 2f 2a 20 78 20 49 4e 20 28  00004  /* x IN (
5210: 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ...) */.#define 
5220: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
5230: 4c 20 20 30 78 30 30 30 30 30 30 30 38 20 20 2f  L  0x00000008  /
5240: 2a 20 78 20 49 53 20 4e 55 4c 4c 20 2a 2f 0a 23  * x IS NULL */.#
5250: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4e  define WHERE_CON
5260: 53 54 52 41 49 4e 54 20 20 20 30 78 30 30 30 30  STRAINT   0x0000
5270: 30 30 30 66 20 20 2f 2a 20 41 6e 79 20 6f 66 20  000f  /* Any of 
5280: 74 68 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  the WHERE_COLUMN
5290: 5f 78 78 78 20 76 61 6c 75 65 73 20 2a 2f 0a 23  _xxx values */.#
52a0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 54 4f 50  define WHERE_TOP
52b0: 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 30 30 30  _LIMIT    0x0000
52c0: 30 30 31 30 20 20 2f 2a 20 78 3c 45 58 50 52 20  0010  /* x<EXPR 
52d0: 6f 72 20 78 3c 3d 45 58 50 52 20 63 6f 6e 73 74  or x<=EXPR const
52e0: 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65  raint */.#define
52f0: 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
5300: 20 20 20 20 30 78 30 30 30 30 30 30 32 30 20 20      0x00000020  
5310: 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20 78 3e 3d  /* x>EXPR or x>=
5320: 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20  EXPR constraint 
5330: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
5340: 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 20 20 30 78  _BOTH_LIMIT   0x
5350: 30 30 30 30 30 30 33 30 20 20 2f 2a 20 42 6f 74  00000030  /* Bot
5360: 68 20 78 3e 45 58 50 52 20 61 6e 64 20 78 3c 45  h x>EXPR and x<E
5370: 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  XPR */.#define W
5380: 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 20 20  HERE_IDX_ONLY   
5390: 20 20 30 78 30 30 30 30 30 30 34 30 20 20 2f 2a    0x00000040  /*
53a0: 20 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20   Use index only 
53b0: 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f 0a  - omit table */.
53c0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 50  #define WHERE_IP
53d0: 4b 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30  K          0x000
53e0: 30 30 31 30 30 20 20 2f 2a 20 78 20 69 73 20 74  00100  /* x is t
53f0: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
5400: 52 59 20 4b 45 59 20 2a 2f 0a 23 64 65 66 69 6e  RY KEY */.#defin
5410: 65 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  e WHERE_INDEXED 
5420: 20 20 20 20 20 30 78 30 30 30 30 30 32 30 30 20       0x00000200 
5430: 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e 75 2e   /* WhereLoop.u.
5440: 62 74 72 65 65 2e 70 49 6e 64 65 78 20 69 73 20  btree.pIndex is 
5450: 76 61 6c 69 64 20 2a 2f 0a 23 64 65 66 69 6e 65  valid */.#define
5460: 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
5470: 42 4c 45 20 30 78 30 30 30 30 30 34 30 30 20 20  BLE 0x00000400  
5480: 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e 75 2e 76  /* WhereLoop.u.v
5490: 74 61 62 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  tab is valid */.
54a0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 4e  #define WHERE_IN
54b0: 5f 41 42 4c 45 20 20 20 20 20 20 30 78 30 30 30  _ABLE      0x000
54c0: 30 30 38 30 30 20 20 2f 2a 20 41 62 6c 65 20 74  00800  /* Able t
54d0: 6f 20 73 75 70 70 6f 72 74 20 61 6e 20 49 4e 20  o support an IN 
54e0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 23 64 65 66  operator */.#def
54f0: 69 6e 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  ine WHERE_ONEROW
5500: 20 20 20 20 20 20 20 30 78 30 30 30 30 31 30 30         0x0000100
5510: 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f  0  /* Selects no
5520: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72   more than one r
5530: 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  ow */.#define WH
5540: 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 20 20 20  ERE_MULTI_OR    
5550: 20 30 78 30 30 30 30 32 30 30 30 20 20 2f 2a 20   0x00002000  /* 
5560: 4f 52 20 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c  OR using multipl
5570: 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a 23 64 65  e indices */.#de
5580: 66 69 6e 65 20 57 48 45 52 45 5f 41 55 54 4f 5f  fine WHERE_AUTO_
5590: 49 4e 44 45 58 20 20 20 30 78 30 30 30 30 34 30  INDEX   0x000040
55a0: 30 30 20 20 2f 2a 20 55 73 65 73 20 61 6e 20 65  00  /* Uses an e
55b0: 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 2a  phemeral index *
55c0: 2f 0a 0a 0a 2f 2a 20 43 6f 6e 76 65 72 74 20 61  /.../* Convert a
55d0: 20 57 68 65 72 65 43 6f 73 74 20 76 61 6c 75 65   WhereCost value
55e0: 20 28 31 30 20 74 69 6d 65 73 20 6c 6f 67 32 28   (10 times log2(
55f0: 58 29 29 20 69 6e 74 6f 20 69 74 73 20 69 6e 74  X)) into its int
5600: 65 67 65 72 20 76 61 6c 75 65 20 58 2e 0a 2a 2a  eger value X..**
5610: 20 41 20 72 6f 75 67 68 20 61 70 70 72 6f 78 69   A rough approxi
5620: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20  mation is used. 
5630: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
5640: 6e 65 64 20 69 73 20 6e 6f 74 20 65 78 61 63 74  ned is not exact
5650: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36 34 20  ..*/.static u64 
5660: 77 68 65 72 65 43 6f 73 74 54 6f 49 6e 74 28 57  whereCostToInt(W
5670: 68 65 72 65 43 6f 73 74 20 78 29 7b 0a 20 20 75  hereCost x){.  u
5680: 36 34 20 6e 3b 0a 20 20 69 66 28 20 78 3c 31 30  64 n;.  if( x<10
5690: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6e   ) return 1;.  n
56a0: 20 3d 20 78 25 31 30 3b 0a 20 20 78 20 2f 3d 20   = x%10;.  x /= 
56b0: 31 30 3b 0a 20 20 69 66 28 20 6e 3e 3d 35 20 29  10;.  if( n>=5 )
56c0: 20 6e 20 2d 3d 20 32 3b 0a 20 20 65 6c 73 65 20   n -= 2;.  else 
56d0: 69 66 28 20 6e 3e 3d 31 20 29 20 6e 20 2d 3d 20  if( n>=1 ) n -= 
56e0: 31 3b 0a 20 20 69 66 28 20 78 3e 3d 33 20 29 20  1;.  if( x>=3 ) 
56f0: 72 65 74 75 72 6e 20 28 6e 2b 38 29 3c 3c 28 78  return (n+8)<<(x
5700: 2d 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 6e  -3);.  return (n
5710: 2b 38 29 3e 3e 28 33 2d 78 29 3b 0a 7d 0a 0a 2f  +8)>>(3-x);.}../
5720: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
5730: 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  estimated number
5740: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
5750: 66 72 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61  from a WHERE cla
5760: 75 73 65 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74  use.*/.u64 sqlit
5770: 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77  e3WhereOutputRow
5780: 43 6f 75 6e 74 28 57 68 65 72 65 49 6e 66 6f 20  Count(WhereInfo 
5790: 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75  *pWInfo){.  retu
57a0: 72 6e 20 77 68 65 72 65 43 6f 73 74 54 6f 49 6e  rn whereCostToIn
57b0: 74 28 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  t(pWInfo->nRowOu
57c0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
57d0: 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 57  urn one of the W
57e0: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 78 78  HERE_DISTINCT_xx
57f0: 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20 69 6e  xxx values to in
5800: 64 69 63 61 74 65 20 68 6f 77 20 74 68 69 73 0a  dicate how this.
5810: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
5820: 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74 73 20  returns outputs 
5830: 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f  for DISTINCT pro
5840: 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  cessing..*/.int 
5850: 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69  sqlite3WhereIsDi
5860: 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e 66 6f  stinct(WhereInfo
5870: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
5880: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73  urn pWInfo->eDis
5890: 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinct;.}../*.** 
58a0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
58b0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
58c0: 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69 6e 20  returns rows in 
58d0: 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 2e 0a  ORDER BY order..
58e0: 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  ** Return FALSE 
58f0: 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 6e 65  if the output ne
5900: 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74 65 64  eds to be sorted
5910: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5920: 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 57  WhereIsOrdered(W
5930: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
5940: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  ){.  return pWIn
5950: 66 6f 2d 3e 62 4f 42 53 61 74 21 3d 30 3b 0a 7d  fo->bOBSat!=0;.}
5960: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5970: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
5980: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
5990: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
59a0: 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65  continue.** imme
59b0: 64 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65  diately with the
59c0: 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57   next row of a W
59d0: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  HERE clause..*/.
59e0: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
59f0: 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68  ContinueLabel(Wh
5a00: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
5a10: 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  {.  return pWInf
5a20: 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  o->iContinue;.}.
5a30: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5a40: 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f  e VDBE address o
5a50: 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  r label to jump 
5a60: 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  to in order to b
5a70: 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20 61  reak.** out of a
5a80: 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a   WHERE loop..*/.
5a90: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
5aa0: 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72 65  BreakLabel(Where
5ab0: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
5ac0: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
5ad0: 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iBreak;.}../*.**
5ae0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
5af0: 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
5b00: 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 63 61  ETE statement ca
5b10: 6e 20 6f 70 65 72 61 74 65 20 64 69 72 65 63 74  n operate direct
5b20: 6c 79 20 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f 77  ly on.** the row
5b30: 69 64 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ids returned by 
5b40: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  a WHERE clause. 
5b50: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
5b60: 20 64 6f 69 6e 67 20 61 6e 0a 2a 2a 20 55 50 44   doing an.** UPD
5b70: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 6d 69  ATE or DELETE mi
5b80: 67 68 74 20 63 68 61 6e 67 65 20 73 75 62 73 65  ght change subse
5b90: 71 75 65 6e 74 20 57 48 45 52 45 20 63 6c 61 75  quent WHERE clau
5ba0: 73 65 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 69  se results..*/.i
5bb0: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f  nt sqlite3WhereO
5bc0: 6b 4f 6e 65 50 61 73 73 28 57 68 65 72 65 49 6e  kOnePass(WhereIn
5bd0: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
5be0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 6f 6b  eturn pWInfo->ok
5bf0: 4f 6e 65 50 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  OnePass;.}../*.*
5c00: 2a 20 4d 6f 76 65 20 74 68 65 20 63 6f 6e 74 65  * Move the conte
5c10: 6e 74 20 6f 66 20 70 53 72 63 20 69 6e 74 6f 20  nt of pSrc into 
5c20: 70 44 65 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20  pDest.*/.static 
5c30: 76 6f 69 64 20 77 68 65 72 65 4f 72 4d 6f 76 65  void whereOrMove
5c40: 28 57 68 65 72 65 4f 72 53 65 74 20 2a 70 44 65  (WhereOrSet *pDe
5c50: 73 74 2c 20 57 68 65 72 65 4f 72 53 65 74 20 2a  st, WhereOrSet *
5c60: 70 53 72 63 29 7b 0a 20 20 70 44 65 73 74 2d 3e  pSrc){.  pDest->
5c70: 6e 20 3d 20 70 53 72 63 2d 3e 6e 3b 0a 20 20 6d  n = pSrc->n;.  m
5c80: 65 6d 63 70 79 28 70 44 65 73 74 2d 3e 61 2c 20  emcpy(pDest->a, 
5c90: 70 53 72 63 2d 3e 61 2c 20 70 44 65 73 74 2d 3e  pSrc->a, pDest->
5ca0: 6e 2a 73 69 7a 65 6f 66 28 70 44 65 73 74 2d 3e  n*sizeof(pDest->
5cb0: 61 5b 30 5d 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  a[0]));.}../*.**
5cc0: 20 54 72 79 20 74 6f 20 69 6e 73 65 72 74 20 61   Try to insert a
5cd0: 20 6e 65 77 20 70 72 65 72 65 71 75 69 73 69 74   new prerequisit
5ce0: 65 2f 63 6f 73 74 20 65 6e 74 72 79 20 69 6e 74  e/cost entry int
5cf0: 6f 20 74 68 65 20 57 68 65 72 65 4f 72 53 65 74  o the WhereOrSet
5d00: 20 70 53 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pSet..**.** The
5d10: 20 6e 65 77 20 65 6e 74 72 79 20 6d 69 67 68 74   new entry might
5d20: 20 6f 76 65 72 77 72 69 74 65 20 61 6e 20 65 78   overwrite an ex
5d30: 69 73 74 69 6e 67 20 65 6e 74 72 79 2c 20 6f 72  isting entry, or
5d40: 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20   it might be.** 
5d50: 61 70 70 65 6e 64 65 64 2c 20 6f 72 20 69 74 20  appended, or it 
5d60: 6d 69 67 68 74 20 62 65 20 64 69 73 63 61 72 64  might be discard
5d70: 65 64 2e 20 20 44 6f 20 77 68 61 74 65 76 65 72  ed.  Do whatever
5d80: 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 68   is the right th
5d90: 69 6e 67 0a 2a 2a 20 73 6f 20 74 68 61 74 20 70  ing.** so that p
5da0: 53 65 74 20 6b 65 65 70 73 20 74 68 65 20 4e 5f  Set keeps the N_
5db0: 4f 52 5f 43 4f 53 54 20 62 65 73 74 20 65 6e 74  OR_COST best ent
5dc0: 72 69 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72  ries seen so far
5dd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5de0: 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 0a 20  whereOrInsert(. 
5df0: 20 57 68 65 72 65 4f 72 53 65 74 20 2a 70 53 65   WhereOrSet *pSe
5e00: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57  t,      /* The W
5e10: 68 65 72 65 4f 72 53 65 74 20 74 6f 20 62 65 20  hereOrSet to be 
5e20: 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 42 69 74  updated */.  Bit
5e30: 6d 61 73 6b 20 70 72 65 72 65 71 2c 20 20 20 20  mask prereq,    
5e40: 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 69 73      /* Prerequis
5e50: 69 74 65 73 20 6f 66 20 74 68 65 20 6e 65 77 20  ites of the new 
5e60: 65 6e 74 72 79 20 2a 2f 0a 20 20 57 68 65 72 65  entry */.  Where
5e70: 43 6f 73 74 20 72 52 75 6e 2c 20 20 20 20 20 20  Cost rRun,      
5e80: 20 20 2f 2a 20 52 75 6e 2d 63 6f 73 74 20 6f 66    /* Run-cost of
5e90: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a   the new entry *
5ea0: 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6e 4f  /.  WhereCost nO
5eb0: 75 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ut         /* Nu
5ec0: 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 73 20  mber of outputs 
5ed0: 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72  for the new entr
5ee0: 79 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 69 3b  y */.){.  u16 i;
5ef0: 0a 20 20 57 68 65 72 65 4f 72 43 6f 73 74 20 2a  .  WhereOrCost *
5f00: 70 3b 0a 20 20 66 6f 72 28 69 3d 70 53 65 74 2d  p;.  for(i=pSet-
5f10: 3e 6e 2c 20 70 3d 70 53 65 74 2d 3e 61 3b 20 69  >n, p=pSet->a; i
5f20: 3e 30 3b 20 69 2d 2d 2c 20 70 2b 2b 29 7b 0a 20  >0; i--, p++){. 
5f30: 20 20 20 69 66 28 20 72 52 75 6e 3c 3d 70 2d 3e     if( rRun<=p->
5f40: 72 52 75 6e 20 26 26 20 28 70 72 65 72 65 71 20  rRun && (prereq 
5f50: 26 20 70 2d 3e 70 72 65 72 65 71 29 3d 3d 70 72  & p->prereq)==pr
5f60: 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20 67 6f  ereq ){.      go
5f70: 74 6f 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74  to whereOrInsert
5f80: 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  _done;.    }.   
5f90: 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52   if( p->rRun<=rR
5fa0: 75 6e 20 26 26 20 28 70 2d 3e 70 72 65 72 65 71  un && (p->prereq
5fb0: 20 26 20 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70   & prereq)==p->p
5fc0: 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20 72  rereq ){.      r
5fd0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
5fe0: 20 7d 0a 20 20 69 66 28 20 70 53 65 74 2d 3e 6e   }.  if( pSet->n
5ff0: 3c 4e 5f 4f 52 5f 43 4f 53 54 20 29 7b 0a 20 20  <N_OR_COST ){.  
6000: 20 20 70 20 3d 20 26 70 53 65 74 2d 3e 61 5b 70    p = &pSet->a[p
6010: 53 65 74 2d 3e 6e 2b 2b 5d 3b 0a 20 20 20 20 70  Set->n++];.    p
6020: 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a 20  ->nOut = nOut;. 
6030: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
6040: 70 53 65 74 2d 3e 61 3b 0a 20 20 20 20 66 6f 72  pSet->a;.    for
6050: 28 69 3d 31 3b 20 69 3c 70 53 65 74 2d 3e 6e 3b  (i=1; i<pSet->n;
6060: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
6070: 20 70 2d 3e 72 52 75 6e 3e 70 53 65 74 2d 3e 61   p->rRun>pSet->a
6080: 5b 69 5d 2e 72 52 75 6e 20 29 20 70 20 3d 20 70  [i].rRun ) p = p
6090: 53 65 74 2d 3e 61 20 2b 20 69 3b 0a 20 20 20 20  Set->a + i;.    
60a0: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75  }.    if( p->rRu
60b0: 6e 3c 3d 72 52 75 6e 20 29 20 72 65 74 75 72 6e  n<=rRun ) return
60c0: 20 30 3b 0a 20 20 7d 0a 77 68 65 72 65 4f 72 49   0;.  }.whereOrI
60d0: 6e 73 65 72 74 5f 64 6f 6e 65 3a 0a 20 20 70 2d  nsert_done:.  p-
60e0: 3e 70 72 65 72 65 71 20 3d 20 70 72 65 72 65 71  >prereq = prereq
60f0: 3b 0a 20 20 70 2d 3e 72 52 75 6e 20 3d 20 72 52  ;.  p->rRun = rR
6100: 75 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 75  un;.  if( p->nOu
6110: 74 3e 6e 4f 75 74 20 29 20 70 2d 3e 6e 4f 75 74  t>nOut ) p->nOut
6120: 20 3d 20 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72   = nOut;.  retur
6130: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n 1;.}../*.** In
6140: 69 74 69 61 6c 69 7a 65 20 61 20 70 72 65 61 6c  itialize a preal
6150: 6c 6f 63 61 74 65 64 20 57 68 65 72 65 43 6c 61  located WhereCla
6160: 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  use structure..*
6170: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
6180: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 0a 20  ereClauseInit(. 
6190: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
61a0: 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  C,        /* The
61b0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 6f 20   WhereClause to 
61c0: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a  be initialized *
61d0: 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
61e0: 57 49 6e 66 6f 20 20 20 20 20 20 20 20 2f 2a 20  WInfo        /* 
61f0: 54 68 65 20 57 48 45 52 45 20 70 72 6f 63 65 73  The WHERE proces
6200: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
6210: 29 7b 0a 20 20 70 57 43 2d 3e 70 57 49 6e 66 6f  ){.  pWC->pWInfo
6220: 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 70 57 43   = pWInfo;.  pWC
6230: 2d 3e 70 4f 75 74 65 72 20 3d 20 30 3b 0a 20 20  ->pOuter = 0;.  
6240: 70 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a  pWC->nTerm = 0;.
6250: 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41    pWC->nSlot = A
6260: 72 72 61 79 53 69 7a 65 28 70 57 43 2d 3e 61 53  rraySize(pWC->aS
6270: 74 61 74 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61  tatic);.  pWC->a
6280: 20 3d 20 70 57 43 2d 3e 61 53 74 61 74 69 63 3b   = pWC->aStatic;
6290: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
62a0: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
62b0: 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61  ic void whereCla
62c0: 75 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c  useClear(WhereCl
62d0: 61 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44  ause*);../*.** D
62e0: 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65  eallocate all me
62f0: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
6300: 77 69 74 68 20 61 20 57 68 65 72 65 4f 72 49 6e  with a WhereOrIn
6310: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
6320: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f  atic void whereO
6330: 72 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69  rInfoDelete(sqli
6340: 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4f 72  te3 *db, WhereOr
6350: 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72  Info *p){.  wher
6360: 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d  eClauseClear(&p-
6370: 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  >wc);.  sqlite3D
6380: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
6390: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
63a0: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
63b0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57  ociated with a W
63c0: 68 65 72 65 41 6e 64 49 6e 66 6f 20 6f 62 6a 65  hereAndInfo obje
63d0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
63e0: 69 64 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44  id whereAndInfoD
63f0: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
6400: 62 2c 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20  b, WhereAndInfo 
6410: 2a 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75  *p){.  whereClau
6420: 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b  seClear(&p->wc);
6430: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
6440: 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
6450: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 57  * Deallocate a W
6460: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
6470: 74 75 72 65 2e 20 20 54 68 65 20 57 68 65 72 65  ture.  The Where
6480: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
6490: 0a 2a 2a 20 69 74 73 65 6c 66 20 69 73 20 6e 6f  .** itself is no
64a0: 74 20 66 72 65 65 64 2e 20 20 54 68 69 73 20 72  t freed.  This r
64b0: 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 69 6e  outine is the in
64c0: 76 65 72 73 65 20 6f 66 20 77 68 65 72 65 43 6c  verse of whereCl
64d0: 61 75 73 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73  auseInit()..*/.s
64e0: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
64f0: 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65 72  ClauseClear(Wher
6500: 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20  eClause *pWC){. 
6510: 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54   int i;.  WhereT
6520: 65 72 6d 20 2a 61 3b 0a 20 20 73 71 6c 69 74 65  erm *a;.  sqlite
6530: 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49  3 *db = pWC->pWI
6540: 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
6550: 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
6560: 65 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b  erm-1, a=pWC->a;
6570: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29   i>=0; i--, a++)
6580: 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46  {.    if( a->wtF
6590: 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41  lags & TERM_DYNA
65a0: 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MIC ){.      sql
65b0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
65c0: 62 2c 20 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20  b, a->pExpr);.  
65d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 61 2d 3e 77    }.    if( a->w
65e0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  tFlags & TERM_OR
65f0: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68  INFO ){.      wh
6600: 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28  ereOrInfoDelete(
6610: 64 62 2c 20 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f  db, a->u.pOrInfo
6620: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
6630: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
6640: 52 4d 5f 41 4e 44 49 4e 46 4f 20 29 7b 0a 20 20  RM_ANDINFO ){.  
6650: 20 20 20 20 77 68 65 72 65 41 6e 64 49 6e 66 6f      whereAndInfo
6660: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
6670: 70 41 6e 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  pAndInfo);.    }
6680: 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e  .  }.  if( pWC->
6690: 61 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20  a!=pWC->aStatic 
66a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
66b0: 46 72 65 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Free(db, pWC->a)
66c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
66d0: 64 64 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20  dd a single new 
66e0: 57 68 65 72 65 54 65 72 6d 20 65 6e 74 72 79 20  WhereTerm entry 
66f0: 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  to the WhereClau
6700: 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a  se object pWC..*
6710: 2a 20 54 68 65 20 6e 65 77 20 57 68 65 72 65 54  * The new WhereT
6720: 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f  erm object is co
6730: 6e 73 74 72 75 63 74 65 64 20 66 72 6f 6d 20 45  nstructed from E
6740: 78 70 72 20 70 20 61 6e 64 20 77 69 74 68 20 77  xpr p and with w
6750: 74 46 6c 61 67 73 2e 0a 2a 2a 20 54 68 65 20 69  tFlags..** The i
6760: 6e 64 65 78 20 69 6e 20 70 57 43 2d 3e 61 5b 5d  ndex in pWC->a[]
6770: 20 6f 66 20 74 68 65 20 6e 65 77 20 57 68 65 72   of the new Wher
6780: 65 54 65 72 6d 20 69 73 20 72 65 74 75 72 6e 65  eTerm is returne
6790: 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a  d on success..**
67a0: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 69   0 is returned i
67b0: 66 20 74 68 65 20 6e 65 77 20 57 68 65 72 65 54  f the new WhereT
67c0: 65 72 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  erm could not be
67d0: 20 61 64 64 65 64 20 64 75 65 20 74 6f 20 61 20   added due to a 
67e0: 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61  memory.** alloca
67f0: 74 69 6f 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  tion error.  The
6800: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
6810: 6f 6e 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20  on failure will 
6820: 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e 0a 2a  be recorded in.*
6830: 2a 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63  * the db->malloc
6840: 46 61 69 6c 65 64 20 66 6c 61 67 20 73 6f 20 74  Failed flag so t
6850: 68 61 74 20 68 69 67 68 65 72 2d 6c 65 76 65 6c  hat higher-level
6860: 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 64   functions can d
6870: 65 74 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  etect it..**.** 
6880: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
6890: 6c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73  l increase the s
68a0: 69 7a 65 20 6f 66 20 74 68 65 20 70 57 43 2d 3e  ize of the pWC->
68b0: 61 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63  a[] array as nec
68c0: 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  essary..**.** If
68d0: 20 74 68 65 20 77 74 46 6c 61 67 73 20 61 72 67   the wtFlags arg
68e0: 75 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73 20 54  ument includes T
68f0: 45 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65  ERM_DYNAMIC, the
6900: 6e 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  n responsibility
6910: 0a 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e 67 20  .** for freeing 
6920: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
6930: 20 69 73 20 61 73 73 75 6d 65 64 20 62 79 20 74   is assumed by t
6940: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  he WhereClause o
6950: 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68  bject pWC..** Th
6960: 69 73 20 69 73 20 74 72 75 65 20 65 76 65 6e 20  is is true even 
6970: 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
6980: 66 61 69 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74  fails to allocat
6990: 65 20 61 20 6e 65 77 20 57 68 65 72 65 54 65 72  e a new WhereTer
69a0: 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47  m..**.** WARNING
69b0: 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  :  This routine 
69c0: 6d 69 67 68 74 20 72 65 61 6c 6c 6f 63 61 74 65  might reallocate
69d0: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
69e0: 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72  to store.** Wher
69f0: 65 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69  eTerms.  All poi
6a00: 6e 74 65 72 73 20 74 6f 20 57 68 65 72 65 54 65  nters to WhereTe
6a10: 72 6d 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  rms should be in
6a20: 76 61 6c 69 64 61 74 65 64 20 61 66 74 65 72 0a  validated after.
6a30: 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** calling this 
6a40: 72 6f 75 74 69 6e 65 2e 20 20 53 75 63 68 20 70  routine.  Such p
6a50: 6f 69 6e 74 65 72 73 20 6d 61 79 20 62 65 20 72  ointers may be r
6a60: 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20  einitialized by 
6a70: 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74  referencing.** t
6a80: 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61  he pWC->a[] arra
6a90: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
6aa0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
6ab0: 72 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  rt(WhereClause *
6ac0: 70 57 43 2c 20 45 78 70 72 20 2a 70 2c 20 75 38  pWC, Expr *p, u8
6ad0: 20 77 74 46 6c 61 67 73 29 7b 0a 20 20 57 68 65   wtFlags){.  Whe
6ae0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
6af0: 20 69 6e 74 20 69 64 78 3b 0a 20 20 74 65 73 74   int idx;.  test
6b00: 63 61 73 65 28 20 77 74 46 6c 61 67 73 20 26 20  case( wtFlags & 
6b10: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
6b20: 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d    if( pWC->nTerm
6b30: 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a  >=pWC->nSlot ){.
6b40: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
6b50: 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20  Old = pWC->a;.  
6b60: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
6b70: 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61  pWC->pWInfo->pPa
6b80: 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 57 43  rse->db;.    pWC
6b90: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
6ba0: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
6bb0: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
6bc0: 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20  WC->nSlot*2 );. 
6bd0: 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30     if( pWC->a==0
6be0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 74   ){.      if( wt
6bf0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e  Flags & TERM_DYN
6c00: 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 20 20  AMIC ){.        
6c10: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
6c20: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
6c30: 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 20 3d  }.      pWC->a =
6c40: 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72 65 74   pOld;.      ret
6c50: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
6c60: 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20   memcpy(pWC->a, 
6c70: 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57 43  pOld, sizeof(pWC
6c80: 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65  ->a[0])*pWC->nTe
6c90: 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  rm);.    if( pOl
6ca0: 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20  d!=pWC->aStatic 
6cb0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6cc0: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 6c 64 29  DbFree(db, pOld)
6cd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43 2d  ;.    }.    pWC-
6ce0: 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74 65 33  >nSlot = sqlite3
6cf0: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c  DbMallocSize(db,
6d00: 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f 66 28   pWC->a)/sizeof(
6d10: 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20 7d 0a  pWC->a[0]);.  }.
6d20: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
6d30: 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65  a[idx = pWC->nTe
6d40: 72 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72 6d 2d 3e  rm++];.  pTerm->
6d50: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
6d60: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
6d70: 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  );.  pTerm->wtFl
6d80: 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20  ags = wtFlags;. 
6d90: 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57   pTerm->pWC = pW
6da0: 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  C;.  pTerm->iPar
6db0: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ent = -1;.  retu
6dc0: 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn idx;.}../*.**
6dd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64   This routine id
6de0: 65 6e 74 69 66 69 65 73 20 73 75 62 65 78 70 72  entifies subexpr
6df0: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57  essions in the W
6e00: 48 45 52 45 20 63 6c 61 75 73 65 20 77 68 65 72  HERE clause wher
6e10: 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70  e.** each subexp
6e20: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
6e30: 61 74 65 64 20 62 79 20 74 68 65 20 41 4e 44 20  ated by the AND 
6e40: 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65  operator or some
6e50: 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74   other.** operat
6e60: 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
6e70: 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72  the op parameter
6e80: 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  .  The WhereClau
6e90: 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  se structure.** 
6ea0: 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70  is filled with p
6eb0: 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78  ointers to subex
6ec0: 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20  pressions.  For 
6ed0: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
6ee0: 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c    WHERE  a=='hel
6ef0: 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65  lo' AND coalesce
6f00: 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63  (b,11)<10 AND (c
6f10: 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29  +12!=d OR c==22)
6f20: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f  .**           \_
6f30: 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f  _______/     \__
6f40: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  _____________/  
6f50: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
6f60: 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20  ____/.**        
6f70: 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20      slot[0]     
6f80: 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20         slot[1]  
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f               slo
6fa0: 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  t[2].**.** The o
6fb0: 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c  riginal WHERE cl
6fc0: 61 75 73 65 20 69 6e 20 70 45 78 70 72 20 69 73  ause in pExpr is
6fd0: 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c   unaltered.  All
6fe0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
6ff0: 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c   does is make sl
7000: 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69  ot[] entries poi
7010: 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63 74 75  nt to substructu
7020: 72 65 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e  re within pExpr.
7030: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72  .**.** In the pr
7040: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20  evious sentence 
7050: 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67 72  and in the diagr
7060: 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66  am, "slot[]" ref
7070: 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68  ers to.** the Wh
7080: 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72  ereClause.a[] ar
7090: 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b 5d  ray.  The slot[]
70a0: 20 61 72 72 61 79 20 67 72 6f 77 73 20 61 73 20   array grows as 
70b0: 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69  needed to contai
70c0: 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f  n.** all terms o
70d0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
70e0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
70f0: 69 64 20 77 68 65 72 65 53 70 6c 69 74 28 57 68  id whereSplit(Wh
7100: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
7110: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75 38 20  Expr *pExpr, u8 
7120: 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70 20 3d  op){.  pWC->op =
7130: 20 6f 70 3b 0a 20 20 69 66 28 20 70 45 78 70 72   op;.  if( pExpr
7140: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7150: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f  if( pExpr->op!=o
7160: 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c  p ){.    whereCl
7170: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
7180: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c  pExpr, 0);.  }el
7190: 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53 70 6c  se{.    whereSpl
71a0: 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70  it(pWC, pExpr->p
71b0: 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77  Left, op);.    w
71c0: 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70  hereSplit(pWC, p
71d0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
71e0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
71f0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57 68 65  Initialize a Whe
7200: 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65 63 74  reMaskSet object
7210: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74  .*/.#define init
7220: 4d 61 73 6b 53 65 74 28 50 29 20 20 28 50 29 2d  MaskSet(P)  (P)-
7230: 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  >n=0../*.** Retu
7240: 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  rn the bitmask f
7250: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  or the given cur
7260: 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  sor number.  Ret
7270: 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72  urn 0 if.** iCur
7280: 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  sor is not in th
7290: 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e set..*/.static
72a0: 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b   Bitmask getMask
72b0: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
72c0: 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75  MaskSet, int iCu
72d0: 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  rsor){.  int i;.
72e0: 20 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53    assert( pMaskS
72f0: 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65  et->n<=(int)size
7300: 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b  of(Bitmask)*8 );
7310: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d  .  for(i=0; i<pM
7320: 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b  askSet->n; i++){
7330: 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65  .    if( pMaskSe
7340: 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f  t->ix[i]==iCurso
7350: 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  r ){.      retur
7360: 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  n MASKBIT(i);.  
7370: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
7380: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
7390: 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66  ate a new mask f
73a0: 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f  or cursor iCurso
73b0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  r..**.** There i
73c0: 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72  s one cursor per
73d0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
73e0: 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  OM clause.  The 
73f0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62  number of.** tab
7400: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
7410: 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65  clause is limite
7420: 64 20 62 79 20 61 20 74 65 73 74 20 65 61 72 6c  d by a test earl
7430: 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69  y in the.** sqli
7440: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
7450: 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20  routine.  So we 
7460: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d  know that the pM
7470: 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20  askSet->ix[].** 
7480: 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72  array will never
7490: 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74   overflow..*/.st
74a0: 61 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65  atic void create
74b0: 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65  Mask(WhereMaskSe
74c0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74  t *pMaskSet, int
74d0: 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73   iCursor){.  ass
74e0: 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e  ert( pMaskSet->n
74f0: 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61   < ArraySize(pMa
7500: 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20  skSet->ix) );.  
7510: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61  pMaskSet->ix[pMa
7520: 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43  skSet->n++] = iC
7530: 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ursor;.}../*.** 
7540: 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 77  These routines w
7550: 61 6c 6b 20 28 72 65 63 75 72 73 69 76 65 6c 79  alk (recursively
7560: 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  ) an expression 
7570: 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72 61 74  tree and generat
7580: 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20 69  e.** a bitmask i
7590: 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63 68 20  ndicating which 
75a0: 74 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  tables are used 
75b0: 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69  in that expressi
75c0: 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2f 0a 73  on.** tree..*/.s
75d0: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
75e0: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
75f0: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20  (WhereMaskSet*, 
7600: 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74  ExprList*);.stat
7610: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53  ic Bitmask exprS
7620: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
7630: 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20 53  WhereMaskSet*, S
7640: 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69 63 20  elect*);.static 
7650: 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61 62 6c  Bitmask exprTabl
7660: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
7670: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45  Set *pMaskSet, E
7680: 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61  xpr *p){.  Bitma
7690: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69  sk mask = 0;.  i
76a0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
76b0: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d   0;.  if( p->op=
76c0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
76d0: 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b    mask = getMask
76e0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54  (pMaskSet, p->iT
76f0: 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74 75 72  able);.    retur
7700: 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61  n mask;.  }.  ma
7710: 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  sk = exprTableUs
7720: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
7730: 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b  >pRight);.  mask
7740: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
7750: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  ge(pMaskSet, p->
7760: 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 45 78  pLeft);.  if( Ex
7770: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
7780: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
7790: 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  {.    mask |= ex
77a0: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
77b0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  ge(pMaskSet, p->
77c0: 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65  x.pSelect);.  }e
77d0: 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  lse{.    mask |=
77e0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
77f0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
7800: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20  >x.pList);.  }. 
7810: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
7820: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
7830: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
7840: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a  e(WhereMaskSet *
7850: 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 4c 69  pMaskSet, ExprLi
7860: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
7870: 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  t i;.  Bitmask m
7880: 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ask = 0;.  if( p
7890: 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
78a0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
78b0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
78c0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
78d0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
78e0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
78f0: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
7900: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
7910: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
7920: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
7930: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
7940: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c  t *pMaskSet, Sel
7950: 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d  ect *pS){.  Bitm
7960: 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20  ask mask = 0;.  
7970: 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20 20 20  while( pS ){.   
7980: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
7990: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 6d   pS->pSrc;.    m
79a0: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
79b0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
79c0: 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74 29 3b  et, pS->pEList);
79d0: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
79e0: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
79f0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47  pMaskSet, pS->pG
7a00: 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d 61 73  roupBy);.    mas
7a10: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
7a20: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
7a30: 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b  , pS->pOrderBy);
7a40: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
7a50: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
7a60: 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65 72 65  kSet, pS->pWhere
7a70: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
7a80: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
7a90: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61 76  askSet, pS->pHav
7aa0: 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20 41 4c  ing);.    if( AL
7ab0: 57 41 59 53 28 70 53 72 63 21 3d 30 29 20 29 7b  WAYS(pSrc!=0) ){
7ac0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
7ad0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
7ae0: 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
7af0: 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d  .        mask |=
7b00: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
7b10: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
7b20: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  pSrc->a[i].pSele
7b30: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 6d 61 73  ct);.        mas
7b40: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
7b50: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
7b60: 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20  rc->a[i].pOn);. 
7b70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7b80: 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69 6f 72   pS = pS->pPrior
7b90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  ;.  }.  return m
7ba0: 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ask;.}../*.** Re
7bb0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
7bc0: 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f 72 20   given operator 
7bd0: 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70  is one of the op
7be0: 65 72 61 74 6f 72 73 20 74 68 61 74 20 69 73 0a  erators that is.
7bf0: 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61  ** allowed for a
7c00: 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48 45 52  n indexable WHER
7c10: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 20 20  E clause term.  
7c20: 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72  The allowed oper
7c30: 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22  ators are.** "="
7c40: 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22  , "<", ">", "<="
7c50: 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c 20 61 6e  , ">=", "IN", an
7c60: 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a 2f 0a 73  d "IS NULL".*/.s
7c70: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 77 65  tatic int allowe
7c80: 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20 20 61  dOp(int op){.  a
7c90: 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f  ssert( TK_GT>TK_
7ca0: 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b 5f 47  EQ && TK_GT<TK_G
7cb0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54  E );.  assert( T
7cc0: 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b  K_LT>TK_EQ && TK
7cd0: 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61  _LT<TK_GE );.  a
7ce0: 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f  ssert( TK_LE>TK_
7cf0: 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47  EQ && TK_LE<TK_G
7d00: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54  E );.  assert( T
7d10: 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b  K_GE==TK_EQ+4 );
7d20: 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d 54 4b  .  return op==TK
7d30: 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45  _IN || (op>=TK_E
7d40: 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45 29 20  Q && op<=TK_GE) 
7d50: 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  || op==TK_ISNULL
7d60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20  ;.}../*.** Swap 
7d70: 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20 74  two objects of t
7d80: 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23 64 65  ype TYPE..*/.#de
7d90: 66 69 6e 65 20 53 57 41 50 28 54 59 50 45 2c 41  fine SWAP(TYPE,A
7da0: 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b 20 41  ,B) {TYPE t=A; A
7db0: 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a  =B; B=t;}../*.**
7dc0: 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61   Commute a compa
7dd0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
7de0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
7df0: 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70 20 59  the form "X op Y
7e00: 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65 72 74  ".** are convert
7e10: 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20 58 22  ed into "Y op X"
7e20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c 65 66 74 2f  ..**.** If left/
7e30: 72 69 67 68 74 20 70 72 65 63 65 64 65 6e 63 65  right precedence
7e40: 20 72 75 6c 65 73 20 63 6f 6d 65 20 69 6e 74 6f   rules come into
7e50: 20 70 6c 61 79 20 77 68 65 6e 20 64 65 74 65 72   play when deter
7e60: 6d 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  mining the.** co
7e70: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
7e80: 2c 20 74 68 65 6e 20 43 4f 4c 4c 41 54 45 20 6f  , then COLLATE o
7e90: 70 65 72 61 74 6f 72 73 20 61 72 65 20 61 64 6a  perators are adj
7ea0: 75 73 74 65 64 20 74 6f 20 65 6e 73 75 72 65 0a  usted to ensure.
7eb0: 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f 6c 6c  ** that the coll
7ec0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 64  ating sequence d
7ed0: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20  oes not change. 
7ee0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
7ef0: 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41   "Y collate NOCA
7f00: 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d 65 73  SE op X" becomes
7f10: 20 22 58 20 6f 70 20 59 22 20 62 65 63 61 75 73   "X op Y" becaus
7f20: 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20  e any collation 
7f30: 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74  sequence on.** t
7f40: 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73 69 64  he left hand sid
7f50: 65 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f  e of a compariso
7f60: 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20  n overrides any 
7f70: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
7f80: 63 65 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20  ce .** attached 
7f90: 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20 46 6f  to the right. Fo
7fa0: 72 20 74 68 65 20 73 61 6d 65 20 72 65 61 73 6f  r the same reaso
7fb0: 6e 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65  n the EP_Collate
7fc0: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20   flag.** is not 
7fd0: 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61  commuted..*/.sta
7fe0: 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 6d  tic void exprCom
7ff0: 6d 75 74 65 28 50 61 72 73 65 20 2a 70 50 61 72  mute(Parse *pPar
8000: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
8010: 7b 0a 20 20 75 31 36 20 65 78 70 52 69 67 68 74  {.  u16 expRight
8020: 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68   = (pExpr->pRigh
8030: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
8040: 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20 65 78  llate);.  u16 ex
8050: 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72 2d 3e  pLeft = (pExpr->
8060: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
8070: 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73  P_Collate);.  as
8080: 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28  sert( allowedOp(
8090: 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 70 45  pExpr->op) && pE
80a0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29  xpr->op!=TK_IN )
80b0: 3b 0a 20 20 69 66 28 20 65 78 70 52 69 67 68 74  ;.  if( expRight
80c0: 3d 3d 65 78 70 4c 65 66 74 20 29 7b 0a 20 20 20  ==expLeft ){.   
80d0: 20 2f 2a 20 45 69 74 68 65 72 20 58 20 61 6e 64   /* Either X and
80e0: 20 59 20 62 6f 74 68 20 68 61 76 65 20 43 4f 4c   Y both have COL
80f0: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 6f 72  LATE operator or
8100: 20 6e 65 69 74 68 65 72 20 64 6f 20 2a 2f 0a 20   neither do */. 
8110: 20 20 20 69 66 28 20 65 78 70 52 69 67 68 74 20     if( expRight 
8120: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 6f 74 68  ){.      /* Both
8130: 20 58 20 61 6e 64 20 59 20 68 61 76 65 20 43 4f   X and Y have CO
8140: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 2e  LLATE operators.
8150: 20 20 4d 61 6b 65 20 73 75 72 65 20 58 20 69 73    Make sure X is
8160: 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20 2a 2a   always.      **
8170: 20 75 73 65 64 20 62 79 20 63 6c 65 61 72 69 6e   used by clearin
8180: 67 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65  g the EP_Collate
8190: 20 66 6c 61 67 20 66 72 6f 6d 20 59 2e 20 2a 2f   flag from Y. */
81a0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52  .      pExpr->pR
81b0: 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  ight->flags &= ~
81c0: 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  EP_Collate;.    
81d0: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
81e0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
81f0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
8200: 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  t)!=0 ){.      /
8210: 2a 20 4e 65 69 74 68 65 72 20 58 20 6e 6f 72 20  * Neither X nor 
8220: 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f  Y have COLLATE o
8230: 70 65 72 61 74 6f 72 73 2c 20 62 75 74 20 58 20  perators, but X 
8240: 68 61 73 20 61 20 6e 6f 6e 2d 64 65 66 61 75 6c  has a non-defaul
8250: 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 6c 61  t.      ** colla
8260: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20  ting sequence.  
8270: 53 6f 20 61 64 64 20 74 68 65 20 45 50 5f 43 6f  So add the EP_Co
8280: 6c 6c 61 74 65 20 6d 61 72 6b 65 72 20 6f 6e 20  llate marker on 
8290: 58 20 74 6f 20 63 61 75 73 65 0a 20 20 20 20 20  X to cause.     
82a0: 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 73 65 61   ** it to be sea
82b0: 72 63 68 65 64 20 66 69 72 73 74 2e 20 2a 2f 0a  rched first. */.
82c0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65        pExpr->pLe
82d0: 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ft->flags |= EP_
82e0: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 0a 20  Collate;.    }. 
82f0: 20 7d 0a 20 20 53 57 41 50 28 45 78 70 72 2a 2c   }.  SWAP(Expr*,
8300: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 70 45  pExpr->pRight,pE
8310: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  xpr->pLeft);.  i
8320: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b  f( pExpr->op>=TK
8330: 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _GT ){.    asser
8340: 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b  t( TK_LT==TK_GT+
8350: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
8360: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20   TK_GE==TK_LE+2 
8370: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  );.    assert( T
8380: 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20  K_GT>TK_EQ );.  
8390: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3c    assert( TK_GT<
83a0: 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73  TK_LE );.    ass
83b0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d  ert( pExpr->op>=
83c0: 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72 2d 3e  TK_GT && pExpr->
83d0: 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20  op<=TK_GE );.   
83e0: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70   pExpr->op = ((p
83f0: 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e  Expr->op-TK_GT)^
8400: 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a  2)+TK_GT;.  }.}.
8410: 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65  ./*.** Translate
8420: 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72   from TK_xx oper
8430: 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20 62 69  ator to WO_xx bi
8440: 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  tmask..*/.static
8450: 20 75 31 36 20 6f 70 65 72 61 74 6f 72 4d 61 73   u16 operatorMas
8460: 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75 31 36  k(int op){.  u16
8470: 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c   c;.  assert( al
8480: 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20  lowedOp(op) );. 
8490: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29   if( op==TK_IN )
84a0: 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b  {.    c = WO_IN;
84b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
84c0: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
84d0: 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b    c = WO_ISNULL;
84e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
84f0: 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f  sert( (WO_EQ<<(o
8500: 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78 37 66  p-TK_EQ)) < 0x7f
8510: 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20 28 75  ff );.    c = (u
8520: 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  16)(WO_EQ<<(op-T
8530: 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73  K_EQ));.  }.  as
8540: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e  sert( op!=TK_ISN
8550: 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e  ULL || c==WO_ISN
8560: 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ULL );.  assert(
8570: 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d   op!=TK_IN || c=
8580: 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65  =WO_IN );.  asse
8590: 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c  rt( op!=TK_EQ ||
85a0: 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61   c==WO_EQ );.  a
85b0: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54  ssert( op!=TK_LT
85c0: 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a   || c==WO_LT );.
85d0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
85e0: 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20  _LE || c==WO_LE 
85f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
8600: 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_GT || c==WO_
8610: 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GT );.  assert( 
8620: 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d  op!=TK_GE || c==
8630: 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74 75 72  WO_GE );.  retur
8640: 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n c;.}../*.** Ad
8650: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
8660: 74 20 57 68 65 72 65 54 65 72 6d 20 74 68 61 74  t WhereTerm that
8670: 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64 69   matches accordi
8680: 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74 65 72  ng to the criter
8690: 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68 65  ia.** establishe
86a0: 64 20 77 68 65 6e 20 74 68 65 20 70 53 63 61 6e  d when the pScan
86b0: 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69 74   object was init
86c0: 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72 65  ialized by where
86d0: 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20 52  ScanInit()..** R
86e0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
86f0: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
8700: 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65 54 65  matching WhereTe
8710: 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  rms..*/.static W
8720: 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53  hereTerm *whereS
8730: 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63 61  canNext(WhereSca
8740: 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e 74  n *pScan){.  int
8750: 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
8760: 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
8770: 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
8780: 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  e term */.  int 
8790: 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  iColumn;        
87a0: 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f   /* The column o
87b0: 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  n the LHS of the
87c0: 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20 49   term.  -1 for I
87d0: 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58  PK */.  Expr *pX
87e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
87f0: 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65  An expression be
8800: 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  ing tested */.  
8810: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
8820: 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e  ;    /* Shorthan
8830: 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57 43  d for pScan->pWC
8840: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
8850: 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54 68  *pTerm;    /* Th
8860: 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65 73  e term being tes
8870: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d  ted */.  int k =
8880: 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a   pScan->k;    /*
8890: 20 57 68 65 72 65 20 74 6f 20 73 74 61 72 74 20   Where to start 
88a0: 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20 77  scanning */..  w
88b0: 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69 45 71  hile( pScan->iEq
88c0: 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71 75  uiv<=pScan->nEqu
88d0: 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72 20 3d  iv ){.    iCur =
88e0: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70   pScan->aEquiv[p
88f0: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 32 5d 3b  Scan->iEquiv-2];
8900: 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70  .    iColumn = p
8910: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70 53 63  Scan->aEquiv[pSc
8920: 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b 0a 20  an->iEquiv-1];. 
8930: 20 20 20 77 68 69 6c 65 28 20 28 70 57 43 20 3d     while( (pWC =
8940: 20 70 53 63 61 6e 2d 3e 70 57 43 29 21 3d 30 20   pScan->pWC)!=0 
8950: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65  ){.      for(pTe
8960: 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70  rm=pWC->a+k; k<p
8970: 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20  WC->nTerm; k++, 
8980: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
8990: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
89a0: 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 26 26  tCursor==iCur &&
89b0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
89c0: 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b  lumn==iColumn ){
89d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
89e0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
89f0: 20 26 20 57 4f 5f 45 51 55 49 56 29 21 3d 30 0a   & WO_EQUIV)!=0.
8a00: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 53             && pS
8a10: 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41 72 72 61  can->nEquiv<Arra
8a20: 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e 61 45 71  ySize(pScan->aEq
8a30: 75 69 76 29 0a 20 20 20 20 20 20 20 20 20 20 29  uiv).          )
8a40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
8a50: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t j;.           
8a60: 20 70 58 20 3d 20 73 71 6c 69 74 65 33 45 78 70   pX = sqlite3Exp
8a70: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 54 65  rSkipCollate(pTe
8a80: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
8a90: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
8aa0: 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d  assert( pX->op==
8ab0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
8ac0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
8ad0: 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75 69  ; j<pScan->nEqui
8ae0: 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20 20 20 20  v; j+=2){.      
8af0: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63 61          if( pSca
8b00: 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d 3d 70 58  n->aEquiv[j]==pX
8b10: 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20  ->iTable.       
8b20: 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61 6e          && pScan
8b30: 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 3d 3d 70  ->aEquiv[j+1]==p
8b40: 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  X->iColumn ){.  
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
8b70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8b80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
8b90: 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e   if( j==pScan->n
8ba0: 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20 20  Equiv ){.       
8bb0: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45         pScan->aE
8bc0: 71 75 69 76 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54  quiv[j] = pX->iT
8bd0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
8be0: 20 20 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69      pScan->aEqui
8bf0: 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e 69 43 6f  v[j+1] = pX->iCo
8c00: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
8c10: 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69      pScan->nEqui
8c20: 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  v += 2;.        
8c30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8c40: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
8c50: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
8c60: 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73  r & pScan->opMas
8c70: 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
8c80: 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
8c90: 68 65 20 61 66 66 69 6e 69 74 79 20 61 6e 64 20  he affinity and 
8ca0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
8cb0: 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  ce match */.    
8cc0: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63 61          if( pSca
8cd0: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26 20  n->zCollName && 
8ce0: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
8cf0: 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d  r & WO_ISNULL)==
8d00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
8d10: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
8d20: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l;.             
8d30: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
8d40: 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50   pWC->pWInfo->pP
8d50: 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  arse;.          
8d60: 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e      pX = pTerm->
8d70: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
8d80: 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
8d90: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
8da0: 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69 64 78 61  (pX, pScan->idxa
8db0: 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ff) ){.         
8dc0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
8dd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
8de0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
8df0: 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66 74 29  ssert(pX->pLeft)
8e00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8e10: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42  pColl = sqlite3B
8e20: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
8e30: 53 65 71 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Seq(pParse,.    
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
8e70: 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69  ->pLeft, pX->pRi
8e80: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
8e90: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30      if( pColl==0
8ea0: 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73   ) pColl = pPars
8eb0: 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
8ec0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8ed0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
8ee0: 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
8ef0: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
8f00: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
8f10: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
8f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8f40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
8f50: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8f60: 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20 20 20 20  & WO_EQ)!=0.    
8f70: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58 20           && (pX 
8f80: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  = pTerm->pExpr->
8f90: 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b 5f  pRight)->op==TK_
8fa0: 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20 20  COLUMN.         
8fb0: 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62 6c      && pX->iTabl
8fc0: 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69 76  e==pScan->aEquiv
8fd0: 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  [0].            
8fe0: 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d   && pX->iColumn=
8ff0: 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 31  =pScan->aEquiv[1
9000: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b  ].            ){
9010: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
9020: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
9030: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9040: 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b 2b     pScan->k = k+
9050: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  1;.            r
9060: 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20  eturn pTerm;.   
9070: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9080: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
9090: 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53   pScan->pWC = pS
90a0: 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75 74 65 72  can->pWC->pOuter
90b0: 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20  ;.      k = 0;. 
90c0: 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d 3e     }.    pScan->
90d0: 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f 72  pWC = pScan->pOr
90e0: 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d 20 30 3b  igWC;.    k = 0;
90f0: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 45 71 75  .    pScan->iEqu
9100: 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 72  iv += 2;.  }.  r
9110: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
9120: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57  * Initialize a W
9130: 48 45 52 45 20 63 6c 61 75 73 65 20 73 63 61 6e  HERE clause scan
9140: 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20 52 65 74  ner object.  Ret
9150: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
9160: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61   the.** first ma
9170: 74 63 68 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  tch.  Return NUL
9180: 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  L if there are n
9190: 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  o matches..**.**
91a0: 20 54 68 65 20 73 63 61 6e 6e 65 72 20 77 69 6c   The scanner wil
91b0: 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67 20 74  l be searching t
91c0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
91d0: 70 57 43 2e 20 20 49 74 20 77 69 6c 6c 20 6c 6f  pWC.  It will lo
91e0: 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72 6d 73 20  ok.** for terms 
91f0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
9200: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72  op> <expr>" wher
9210: 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43  e X is column iC
9220: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 0a 2a  olumn of table.*
9230: 2a 20 69 43 75 72 2e 20 20 54 68 65 20 3c 6f 70  * iCur.  The <op
9240: 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  > must be one of
9250: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 64   the operators d
9260: 65 73 63 72 69 62 65 64 20 62 79 20 6f 70 4d 61  escribed by opMa
9270: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  sk..**.** If the
9280: 20 73 65 61 72 63 68 20 69 73 20 66 6f 72 20 58   search is for X
9290: 20 61 6e 64 20 74 68 65 20 57 48 45 52 45 20 63   and the WHERE c
92a0: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 74  lause contains t
92b0: 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66  erms of the.** f
92c0: 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20 74 68 69  orm X=Y then thi
92d0: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
92e0: 61 6c 73 6f 20 72 65 74 75 72 6e 20 74 65 72 6d  also return term
92f0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
9300: 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "Y <op> <expr>"
9310: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  The number of
9320: 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 61 6e 73   levels of trans
9330: 69 74 69 76 69 74 79 20 69 73 20 6c 69 6d 69 74  itivity is limit
9340: 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73 20 65 6e  ed,.** but is en
9350: 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c 65 20 6d  ough to handle m
9360: 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f 63 63  ost commonly occ
9370: 75 72 72 69 6e 67 20 53 51 4c 20 73 74 61 74 65  urring SQL state
9380: 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ments..**.** If 
9390: 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49 4e 54  X is not the INT
93a0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
93b0: 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62 65 20   then X must be 
93c0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 0a  compatible with.
93d0: 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  ** index pIdx..*
93e0: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
93f0: 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 49 6e 69  rm *whereScanIni
9400: 74 28 0a 20 20 57 68 65 72 65 53 63 61 6e 20 2a  t(.  WhereScan *
9410: 70 53 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a 20  pScan,       /* 
9420: 54 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f 62  The WhereScan ob
9430: 6a 65 63 74 20 62 65 69 6e 67 20 69 6e 69 74 69  ject being initi
9440: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alized */.  Wher
9450: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
9460: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
9470: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 63   clause to be sc
9480: 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anned */.  int i
9490: 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
94a0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
94b0: 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  scan for */.  in
94c0: 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t iColumn,      
94d0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
94e0: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
94f0: 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20 20   u32 opMask,    
9500: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72           /* Oper
9510: 61 74 6f 72 28 73 29 20 74 6f 20 73 63 61 6e 20  ator(s) to scan 
9520: 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  for */.  Index *
9530: 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20  pIdx            
9540: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
9550: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
9560: 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 69   index */.){.  i
9570: 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d 65 6d 73  nt j;..  /* mems
9580: 65 74 28 70 53 63 61 6e 2c 20 30 2c 20 73 69 7a  et(pScan, 0, siz
9590: 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b 20 2a 2f  eof(*pScan)); */
95a0: 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57  .  pScan->pOrigW
95b0: 43 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e  C = pWC;.  pScan
95c0: 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 69  ->pWC = pWC;.  i
95d0: 66 28 20 70 49 64 78 20 26 26 20 69 43 6f 6c 75  f( pIdx && iColu
95e0: 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53 63  mn>=0 ){.    pSc
95f0: 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70 49 64  an->idxaff = pId
9600: 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  x->pTable->aCol[
9610: 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
9620: 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  y;.    for(j=0; 
9630: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
9640: 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  ]!=iColumn; j++)
9650: 7b 0a 20 20 20 20 20 20 69 66 28 20 4e 45 56 45  {.      if( NEVE
9660: 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  R(j>=pIdx->nColu
9670: 6d 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  mn) ) return 0;.
9680: 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d      }.    pScan-
9690: 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64  >zCollName = pId
96a0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  x->azColl[j];.  
96b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 63 61 6e  }else{.    pScan
96c0: 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20 20  ->idxaff = 0;.  
96d0: 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61    pScan->zCollNa
96e0: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53  me = 0;.  }.  pS
96f0: 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f 70  can->opMask = op
9700: 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e 6b  Mask;.  pScan->k
9710: 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 61   = 0;.  pScan->a
9720: 45 71 75 69 76 5b 30 5d 20 3d 20 69 43 75 72 3b  Equiv[0] = iCur;
9730: 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76  .  pScan->aEquiv
9740: 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20  [1] = iColumn;. 
9750: 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 3d   pScan->nEquiv =
9760: 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 45 71   2;.  pScan->iEq
9770: 75 69 76 20 3d 20 32 3b 0a 20 20 72 65 74 75 72  uiv = 2;.  retur
9780: 6e 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28  n whereScanNext(
9790: 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pScan);.}../*.**
97a0: 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 65   Search for a te
97b0: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
97c0: 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f  clause that is o
97d0: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
97e0: 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68  p> <expr>".** wh
97f0: 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65 72  ere X is a refer
9800: 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c  ence to the iCol
9810: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75  umn of table iCu
9820: 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e  r and <op> is on
9830: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78  e of.** the WO_x
9840: 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73  x operator codes
9850: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
9860: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a  e op parameter..
9870: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
9880: 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e  ter to the term.
9890: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
98a0: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54  t found..**.** T
98b0: 68 65 20 74 65 72 6d 20 72 65 74 75 72 6e 65 64  he term returned
98c0: 20 6d 69 67 68 74 20 62 79 20 59 3d 3c 65 78 70   might by Y=<exp
98d0: 72 3e 20 69 66 20 74 68 65 72 65 20 69 73 20 61  r> if there is a
98e0: 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69 6e  nother constrain
98f0: 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52  t in.** the WHER
9900: 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 73 70  E clause that sp
9910: 65 63 69 66 69 65 73 20 74 68 61 74 20 58 3d 59  ecifies that X=Y
9920: 2e 20 20 41 6e 79 20 73 75 63 68 20 63 6f 6e 73  .  Any such cons
9930: 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a  traints will be.
9940: 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ** identified by
9950: 20 74 68 65 20 57 4f 5f 45 51 55 49 56 20 62 69   the WO_EQUIV bi
9960: 74 20 69 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e  t in the pTerm->
9970: 65 4f 70 65 72 61 74 6f 72 20 66 69 65 6c 64 2e  eOperator field.
9980: 20 20 54 68 65 0a 2a 2a 20 61 45 71 75 69 76 5b    The.** aEquiv[
9990: 5d 20 61 72 72 61 79 20 68 6f 6c 64 73 20 58 20  ] array holds X 
99a0: 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75 69  and all its equi
99b0: 76 61 6c 65 6e 74 73 2c 20 77 69 74 68 20 65 61  valents, with ea
99c0: 63 68 20 53 51 4c 20 76 61 72 69 61 62 6c 65 0a  ch SQL variable.
99d0: 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20 74 77 6f  ** taking up two
99e0: 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76   slots in aEquiv
99f0: 5b 5d 2e 20 20 54 68 65 20 66 69 72 73 74 20 73  [].  The first s
9a00: 6c 6f 74 20 69 73 20 66 6f 72 20 74 68 65 20 63  lot is for the c
9a10: 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 2a 2a 20  ursor number.** 
9a20: 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 69  and the second i
9a30: 73 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  s for the column
9a40: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 72 65 20   number.  There 
9a50: 61 72 65 20 32 32 20 73 6c 6f 74 73 20 69 6e 20  are 22 slots in 
9a60: 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73 6f 20 74  aEquiv[].** so t
9a70: 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e  hat means we can
9a80: 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73   look for X plus
9a90: 20 75 70 20 74 6f 20 31 30 20 6f 74 68 65 72 20   up to 10 other 
9aa0: 65 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65  equivalent value
9ab0: 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61 20 73 65  s..** Hence a se
9ac0: 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c 20  arch for X will 
9ad0: 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69 66  return <expr> if
9ae0: 20 58 3d 41 31 20 61 6e 64 20 41 31 3d 41 32 20   X=A1 and A1=A2 
9af0: 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20 61 6e 64  and A2=A3.** and
9b00: 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30 20   ... and A9=A10 
9b10: 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a  and A10=<expr>..
9b20: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
9b30: 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d  re multiple term
9b40: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
9b50: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72  lause of the for
9b60: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
9b70: 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66 6f  ".** then try fo
9b80: 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 6e  r the one with n
9b90: 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f  o dependencies o
9ba0: 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74  n <expr> - in ot
9bb0: 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65 0a  her words where.
9bc0: 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  ** <expr> is a c
9bd0: 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
9be0: 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  on of some kind.
9bf0: 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e    Only return en
9c00: 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  tries of.** the 
9c10: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20  form "X <op> Y" 
9c20: 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f 6c  where Y is a col
9c30: 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 74  umn in another t
9c40: 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d 73  able if no terms
9c50: 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20   of.** the form 
9c60: 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65  "X <op> <const-e
9c70: 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20 49  xpr>" exist.   I
9c80: 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 20  f no terms with 
9c90: 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a  a constant RHS.*
9ca0: 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f 20  * exist, try to 
9cb0: 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74 68  return a term th
9cc0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
9cd0: 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 73 74 61  WO_EQUIV..*/.sta
9ce0: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66  tic WhereTerm *f
9cf0: 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65  indTerm(.  Where
9d00: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
9d10: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
9d20: 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63  ause to be searc
9d30: 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  hed */.  int iCu
9d40: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
9d50: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
9d60: 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20  of LHS */.  int 
9d70: 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  iColumn,        
9d80: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62    /* Column numb
9d90: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42  er of LHS */.  B
9da0: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
9db0: 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74       /* RHS must
9dc0: 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74   not overlap wit
9dd0: 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20  h this mask */. 
9de0: 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20   u32 op,        
9df0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
9e00: 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64  f WO_xx values d
9e10: 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74  escribing operat
9e20: 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  or */.  Index *p
9e30: 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Idx           /*
9e40: 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69   Must be compati
9e50: 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e  ble with this in
9e60: 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  dex, if not NULL
9e70: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65   */.){.  WhereTe
9e80: 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b  rm *pResult = 0;
9e90: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 3b  .  WhereTerm *p;
9ea0: 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61  .  WhereScan sca
9eb0: 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65 53  n;..  p = whereS
9ec0: 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70  canInit(&scan, p
9ed0: 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75 6d  WC, iCur, iColum
9ee0: 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20 20  n, op, pIdx);.  
9ef0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
9f00: 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 52 69  if( (p->prereqRi
9f10: 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d  ght & notReady)=
9f20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
9f30: 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d  p->prereqRight==
9f40: 30 20 26 26 20 28 70 2d 3e 65 4f 70 65 72 61 74  0 && (p->eOperat
9f50: 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 29 7b 0a  or&WO_EQ)!=0 ){.
9f60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
9f70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9f80: 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29  if( pResult==0 )
9f90: 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20   pResult = p;.  
9fa0: 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72    }.    p = wher
9fb0: 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29  eScanNext(&scan)
9fc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
9fd0: 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Result;.}../* Fo
9fe0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
9ff0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
a000: 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69  xprAnalyze(SrcLi
a010: 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65  st*, WhereClause
a020: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
a030: 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65  Call exprAnalyze
a040: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e   on all terms in
a050: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
a060: 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69    .*/.static voi
a070: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c  d exprAnalyzeAll
a080: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  (.  SrcList *pTa
a090: 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  bList,       /* 
a0a0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
a0b0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
a0c0: 20 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f 2a   *pWC         /*
a0d0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
a0e0: 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  e to be analyzed
a0f0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
a100: 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
a110: 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  rm-1; i>=0; i--)
a120: 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  {.    exprAnalyz
a130: 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43 2c  e(pTabList, pWC,
a140: 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e   i);.  }.}..#ifn
a150: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a160: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
a170: 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  N./*.** Check to
a180: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
a190: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
a1a0: 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f  a LIKE or GLOB o
a1b0: 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20  perator that.** 
a1c0: 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  can be optimized
a1d0: 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69 74   using inequalit
a1e0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  y constraints.  
a1f0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  Return TRUE if i
a200: 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66  t is.** so and f
a210: 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  alse if not..**.
a220: 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20  ** In order for 
a230: 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  the operator to 
a240: 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20  be optimizible, 
a250: 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65 20  the RHS must be 
a260: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65  a string.** lite
a270: 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ral that does no
a280: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 77  t begin with a w
a290: 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73 74  ildcard.  .*/.st
a2a0: 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65 4f  atic int isLikeO
a2b0: 72 47 6c 6f 62 28 0a 20 20 50 61 72 73 65 20 2a  rGlob(.  Parse *
a2c0: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
a2d0: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
a2e0: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
a2f0: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
a300: 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73 74  pr,      /* Test
a310: 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
a320: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 50   */.  Expr **ppP
a330: 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f 69 6e 74  refix,  /* Point
a340: 65 72 20 74 6f 20 54 4b 5f 53 54 52 49 4e 47 20  er to TK_STRING 
a350: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
a360: 70 61 74 74 65 72 6e 20 70 72 65 66 69 78 20 2a  pattern prefix *
a370: 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d 70  /.  int *pisComp
a380: 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65 20 69 66  lete, /* True if
a390: 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63 61   the only wildca
a3a0: 72 64 20 69 73 20 25 20 69 6e 20 74 68 65 20 6c  rd is % in the l
a3b0: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 2a 2f  ast character */
a3c0: 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61 73 65 20  .  int *pnoCase 
a3d0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
a3e0: 75 70 70 65 72 63 61 73 65 20 69 73 20 65 71 75  uppercase is equ
a3f0: 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65 72  ivalent to lower
a400: 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  case */.){.  con
a410: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 20  st char *z = 0; 
a420: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e          /* Strin
a430: 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c 49 4b 45  g on RHS of LIKE
a440: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45   operator */.  E
a450: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c  xpr *pRight, *pL
a460: 65 66 74 3b 20 20 20 20 20 20 2f 2a 20 52 69 67  eft;      /* Rig
a470: 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 7a 65  ht and left size
a480: 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f   of LIKE operato
a490: 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  r */.  ExprList 
a4a0: 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
a4b0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6f 70 65    /* List of ope
a4c0: 72 61 6e 64 73 20 74 6f 20 74 68 65 20 4c 49 4b  rands to the LIK
a4d0: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
a4e0: 69 6e 74 20 63 3b 20 20 20 20 20 20 20 20 20 20  int c;          
a4f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
a500: 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a  e character in z
a510: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b  [] */.  int cnt;
a520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a530: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a540: 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72 65  non-wildcard pre
a550: 66 69 78 20 63 68 61 72 61 63 74 65 72 73 20 2a  fix characters *
a560: 2f 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b 20  /.  char wc[3]; 
a570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a580: 2a 20 57 69 6c 64 63 61 72 64 20 63 68 61 72 61  * Wildcard chara
a590: 63 74 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74  cters */.  sqlit
a5a0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
a5b0: 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  >db;  /* Databas
a5c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
a5d0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
a5e0: 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  *pVal = 0;.  int
a5f0: 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
a600: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64          /* Opcod
a610: 65 20 6f 66 20 70 52 69 67 68 74 20 2a 2f 0a 0a  e of pRight */..
a620: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73    if( !sqlite3Is
a630: 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62 2c  LikeFunction(db,
a640: 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65 2c   pExpr, pnoCase,
a650: 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75   wc) ){.    retu
a660: 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66  rn 0;.  }.#ifdef
a670: 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0a 20   SQLITE_EBCDIC. 
a680: 20 69 66 28 20 2a 70 6e 6f 43 61 73 65 20 29 20   if( *pnoCase ) 
a690: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
a6a0: 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72  .  pList = pExpr
a6b0: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70 4c 65  ->x.pList;.  pLe
a6c0: 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31 5d  ft = pList->a[1]
a6d0: 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 4c  .pExpr;.  if( pL
a6e0: 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  eft->op!=TK_COLU
a6f0: 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65  MN .   || sqlite
a700: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c  3ExprAffinity(pL
a710: 65 66 74 29 21 3d 53 51 4c 49 54 45 5f 41 46 46  eft)!=SQLITE_AFF
a720: 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20 49 73 56  _TEXT .   || IsV
a730: 69 72 74 75 61 6c 28 70 4c 65 66 74 2d 3e 70 54  irtual(pLeft->pT
a740: 61 62 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  ab).  ){.    /* 
a750: 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39 34  IMP: R-02065-494
a760: 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64  65 The left-hand
a770: 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49 4b   side of the LIK
a780: 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74  E or GLOB operat
a790: 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  or must.    ** b
a7a0: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  e the name of an
a7b0: 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20   indexed column 
a7c0: 77 69 74 68 20 54 45 58 54 20 61 66 66 69 6e 69  with TEXT affini
a7d0: 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ty. */.    retur
a7e0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 0;.  }.  asser
a7f0: 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d  t( pLeft->iColum
a800: 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42 65  n!=(-1) ); /* Be
a810: 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72 20  cause IPK never 
a820: 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f 0a  has AFF_TEXT */.
a830: 0a 20 20 70 52 69 67 68 74 20 3d 20 70 4c 69 73  .  pRight = pLis
a840: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
a850: 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70   op = pRight->op
a860: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
a870: 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 6f  EGISTER ){.    o
a880: 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 32 3b  p = pRight->op2;
a890: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54  .  }.  if( op==T
a8a0: 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20  K_VARIABLE ){.  
a8b0: 20 20 56 64 62 65 20 2a 70 52 65 70 72 65 70 61    Vdbe *pReprepa
a8c0: 72 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 52 65  re = pParse->pRe
a8d0: 70 72 65 70 61 72 65 3b 0a 20 20 20 20 69 6e 74  prepare;.    int
a8e0: 20 69 43 6f 6c 20 3d 20 70 52 69 67 68 74 2d 3e   iCol = pRight->
a8f0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 56 61  iColumn;.    pVa
a900: 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  l = sqlite3VdbeG
a910: 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 70 52 65  etBoundValue(pRe
a920: 70 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53  prepare, iCol, S
a930: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b  QLITE_AFF_NONE);
a940: 0a 20 20 20 20 69 66 28 20 70 56 61 6c 20 26 26  .    if( pVal &&
a950: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
a960: 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54  ype(pVal)==SQLIT
a970: 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20  E_TEXT ){.      
a980: 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  z = (char *)sqli
a990: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
a9a0: 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Val);.    }.    
a9b0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
a9c0: 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56  rmask(pParse->pV
a9d0: 64 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  dbe, iCol);.    
a9e0: 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e  assert( pRight->
a9f0: 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
aa00: 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  || pRight->op==T
aa10: 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
aa20: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
aa30: 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a  _STRING ){.    z
aa40: 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f   = pRight->u.zTo
aa50: 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ken;.  }.  if( z
aa60: 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b   ){.    cnt = 0;
aa70: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a  .    while( (c=z
aa80: 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d  [cnt])!=0 && c!=
aa90: 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31  wc[0] && c!=wc[1
aaa0: 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b  ] && c!=wc[2] ){
aab0: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
aac0: 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21    }.    if( cnt!
aad0: 3d 30 20 26 26 20 32 35 35 21 3d 28 75 38 29 7a  =0 && 255!=(u8)z
aae0: 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20 20 20  [cnt-1] ){.     
aaf0: 20 45 78 70 72 20 2a 70 50 72 65 66 69 78 3b 0a   Expr *pPrefix;.
ab00: 20 20 20 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65        *pisComple
ab10: 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26  te = c==wc[0] &&
ab20: 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20   z[cnt+1]==0;.  
ab30: 20 20 20 20 70 50 72 65 66 69 78 20 3d 20 73 71      pPrefix = sq
ab40: 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
ab50: 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20 20 20  _STRING, z);.   
ab60: 20 20 20 69 66 28 20 70 50 72 65 66 69 78 20 29     if( pPrefix )
ab70: 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b   pPrefix->u.zTok
ab80: 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20 20 20  en[cnt] = 0;.   
ab90: 20 20 20 2a 70 70 50 72 65 66 69 78 20 3d 20 70     *ppPrefix = p
aba0: 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 69 66  Prefix;.      if
abb0: 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ( op==TK_VARIABL
abc0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62  E ){.        Vdb
abd0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
abe0: 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20 73 71  Vdbe;.        sq
abf0: 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
ac00: 61 73 6b 28 76 2c 20 70 52 69 67 68 74 2d 3e 69  ask(v, pRight->i
ac10: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
ac20: 20 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74   if( *pisComplet
ac30: 65 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a  e && pRight->u.z
ac40: 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20  Token[1] ){.    
ac50: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
ac60: 72 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20  rhs of the LIKE 
ac70: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
ac80: 76 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68  variable, and th
ac90: 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20  e current.      
aca0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
acb0: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61  the variable mea
acc0: 6e 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ns there is no n
acd0: 65 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  eed to invoke th
ace0: 65 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20  e LIKE.         
acf0: 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68   ** function, th
ad00: 65 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c  en no OP_Variabl
ad10: 65 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20  e will be added 
ad20: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
ad30: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69            ** Thi
ad40: 73 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d  s causes problem
ad50: 73 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  s for the sqlite
ad60: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
ad70: 5f 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20  _name().        
ad80: 20 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72    ** API. To wor
ad90: 6b 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64  karound them, ad
ada0: 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72  d a dummy OP_Var
adb0: 69 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20 20  iable here..    
adc0: 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20        */ .      
add0: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
ade0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
adf0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
ae00: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
ae10: 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
ae20: 70 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20 20  pRight, r1);.   
ae30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ae40: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73 71  beChangeP3(v, sq
ae50: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
ae60: 41 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20  Addr(v)-1, 0);. 
ae70: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ae80: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
ae90: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
aea0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
aeb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
aec0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
aed0: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
aee0: 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74  ree(pVal);.  ret
aef0: 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65  urn (z!=0);.}.#e
af00: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
af10: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
af20: 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64  ATION */...#ifnd
af30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
af40: 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
af50: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
af60: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
af70: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
af80: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20   form.**.**     
af90: 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48      column MATCH
afa0: 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69   expr.**.** If i
afb0: 74 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e  t is then return
afc0: 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20   TRUE.  If not, 
afd0: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f  return FALSE..*/
afe0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61  .static int isMa
aff0: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45  tchOfColumn(.  E
b000: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
b010: 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70  /* Test this exp
b020: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
b030: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
b040: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ..  if( pExpr->o
b050: 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p!=TK_FUNCTION )
b060: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
b070: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
b080: 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e  3StrICmp(pExpr->
b090: 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22  u.zToken,"match"
b0a0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
b0b0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
b0c0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
b0d0: 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  st;.  if( pList-
b0e0: 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20  >nExpr!=2 ){.   
b0f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
b100: 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d   if( pList->a[1]
b110: 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b  .pExpr->op != TK
b120: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72  _COLUMN ){.    r
b130: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
b140: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
b150: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
b160: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
b170: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ../*.** If the p
b180: 42 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  Base expression 
b190: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
b1a0: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
b1b0: 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69  ause of.** a joi
b1c0: 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  n, then transfer
b1d0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
b1e0: 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74   markings over t
b1f0: 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74  o derived..*/.st
b200: 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66  atic void transf
b210: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45  erJoinMarkings(E
b220: 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45  xpr *pDerived, E
b230: 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 70  xpr *pBase){.  p
b240: 44 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c  Derived->flags |
b250: 3d 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26  = pBase->flags &
b260: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20   EP_FromJoin;.  
b270: 70 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74  pDerived->iRight
b280: 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73  JoinTable = pBas
b290: 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  e->iRightJoinTab
b2a0: 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  le;.}..#if !defi
b2b0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b2c0: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
b2d0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
b2e0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b2f0: 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  Y)./*.** Analyze
b300: 20 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e   a term that con
b310: 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20  sists of two or 
b320: 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  more OR-connecte
b330: 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20  d.** subterms.  
b340: 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  So in:.**.**    
b350: 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35   ... WHERE  (a=5
b360: 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d  ) AND (b=7 OR c=
b370: 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28  9 OR d=13) AND (
b380: 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20  d=13).**        
b390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3a0: 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e    ^^^^^^^^^^^^^^
b3b0: 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69  ^^^^^^.**.** Thi
b3c0: 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a  s routine analyz
b3d0: 65 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73  es terms such as
b3e0: 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d   the middle term
b3f0: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78   in the above ex
b400: 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72  ample..** A Wher
b410: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69  eOrTerm object i
b420: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61  s computed and a
b430: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
b440: 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61  erm under.** ana
b450: 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73  lysis, regardles
b460: 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65  s of the outcome
b470: 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73   of the analysis
b480: 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20  .  Hence:.**.** 
b490: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74      WhereTerm.wt
b4a0: 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d  Flags   |=  TERM
b4b0: 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57  _ORINFO.**     W
b4c0: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
b4d0: 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63  fo  =  a dynamic
b4e0: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57  ally allocated W
b4f0: 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63  hereOrTerm objec
b500: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  t.**.** The term
b510: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
b520: 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72  must have two or
b530: 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e   more of OR-conn
b540: 65 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a  ected subterms..
b550: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74  ** A single subt
b560: 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73  erm might be a s
b570: 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63  et of AND-connec
b580: 74 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73  ted sub-subterms
b590: 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66  ..** Examples of
b5a0: 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61   terms under ana
b5b0: 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lysis:.**.**    
b5c0: 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32   (A)     t1.x=t2
b5d0: 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20  .y OR t1.x=t2.z 
b5e0: 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31  OR t1.y=15 OR t1
b5f0: 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20  .z=t3.a+5.**    
b600: 20 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31   (B)     x=expr1
b610: 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78   OR expr2=x OR x
b620: 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43  =expr3.**     (C
b630: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
b640: 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e  OR (t1.x=t2.z AN
b650: 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20  D t1.y=15).**   
b660: 20 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72    (D)     x=expr
b670: 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79  1 OR (y>11 AND y
b680: 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27  <22 AND z LIKE '
b690: 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20  *hello*').**    
b6a0: 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20   (E)     (p.a=1 
b6b0: 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e  AND q.b=2 AND r.
b6c0: 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41  c=3) OR (p.x=4 A
b6d0: 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a  ND q.y=5 AND r.z
b6e0: 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31  =6).**.** CASE 1
b6f0: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
b700: 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74  ubterms are of t
b710: 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72  he form T.C=expr
b720: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
b730: 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64   column of C and
b740: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62  .** a single tab
b750: 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69  le T (as shown i
b760: 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76  n example B abov
b770: 65 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  e) then create a
b780: 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20   new virtual.** 
b790: 74 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20  term that is an 
b7a0: 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78  equivalent IN ex
b7b0: 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74  pression.  In ot
b7c0: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
b7d0: 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20  e term.** being 
b7e0: 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a  analyzed is:.**.
b7f0: 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72  **      x = expr
b800: 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78  1  OR  expr2 = x
b810: 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a    OR  x = expr3.
b820: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  **.** then creat
b830: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  e a new virtual 
b840: 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a  term like this:.
b850: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
b860: 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70  (expr1,expr2,exp
b870: 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32  r3).**.** CASE 2
b880: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
b890: 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65  ubterms are inde
b8a0: 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c  xable by a singl
b8b0: 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20  e table T, then 
b8c0: 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  set.**.**     Wh
b8d0: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
b8e0: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  r              =
b8f0: 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57    WO_OR.**     W
b900: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
b910: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c  fo->indexable  |
b920: 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  =  the cursor nu
b930: 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54  mber for table T
b940: 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  .**.** A subterm
b950: 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20   is "indexable" 
b960: 69 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20  if it is of the 
b970: 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70  form.** "T.C <op
b980: 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20  > <expr>" where 
b990: 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  C is any column 
b9a0: 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a  of table T and .
b9b0: 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  ** <op> is one o
b9c0: 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22  f "=", "<", "<="
b9d0: 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53  , ">", ">=", "IS
b9e0: 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e   NULL", or "IN".
b9f0: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73  .** A subterm is
ba00: 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20   also indexable 
ba10: 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20  if it is an AND 
ba20: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  of two or more.*
ba30: 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74  * subsubterms at
ba40: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68   least one of wh
ba50: 69 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65  ich is indexable
ba60: 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44  .  Indexable AND
ba70: 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61   .** subterms ha
ba80: 76 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74  ve their eOperat
ba90: 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44  or set to WO_AND
baa0: 20 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a   and they have.*
bab0: 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74  * u.pAndInfo set
bac0: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
bad0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
bae0: 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e  eAndTerm object.
baf0: 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74  .**.** From anot
bb00: 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65  her point of vie
bb10: 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d  w, "indexable" m
bb20: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75  eans that the su
bb30: 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70  bterm could.** p
bb40: 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73  otentially be us
bb50: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
bb60: 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61   if an appropria
bb70: 74 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e  te index exists.
bb80: 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69  .** This analysi
bb90: 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69  s does not consi
bba0: 64 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e  der whether or n
bbb0: 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69  ot the index exi
bbc0: 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20  sts; that.** is 
bbd0: 64 65 63 69 64 65 64 20 65 6c 73 65 77 68 65 72  decided elsewher
bbe0: 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69  e.  This analysi
bbf0: 73 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20  s only looks at 
bc00: 77 68 65 74 68 65 72 20 73 75 62 74 65 72 6d 73  whether subterms
bc10: 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20  .** appropriate 
bc20: 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69  for indexing exi
bc30: 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78  st..**.** All ex
bc40: 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68  amples A through
bc50: 20 45 20 61 62 6f 76 65 20 73 61 74 69 73 66 79   E above satisfy
bc60: 20 63 61 73 65 20 32 2e 20 20 42 75 74 20 69 66   case 2.  But if
bc70: 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20   a term.** also 
bc80: 73 74 61 74 69 73 66 69 65 73 20 63 61 73 65 20  statisfies case 
bc90: 31 20 28 73 75 63 68 20 61 73 20 42 29 20 77 65  1 (such as B) we
bca0: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
bcb0: 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a  ptimizer will.**
bcc0: 20 61 6c 77 61 79 73 20 70 72 65 66 65 72 20 63   always prefer c
bcd0: 61 73 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61  ase 1, so in tha
bce0: 74 20 63 61 73 65 20 77 65 20 70 72 65 74 65 6e  t case we preten
bcf0: 64 20 74 68 61 74 20 63 61 73 65 20 32 20 69 73  d that case 2 is
bd00: 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65   not.** satisfie
bd10: 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68  d..**.** It migh
bd20: 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  t be the case th
bd30: 61 74 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c  at multiple tabl
bd40: 65 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65  es are indexable
bd50: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a  .  For example,.
bd60: 2a 2a 20 28 45 29 20 61 62 6f 76 65 20 69 73 20  ** (E) above is 
bd70: 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62  indexable on tab
bd80: 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e  les P, Q, and R.
bd90: 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61  .**.** Terms tha
bda0: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32  t satisfy case 2
bdb0: 20 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20   are candidates 
bdc0: 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73  for lookup by us
bdd0: 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  ing.** separate 
bde0: 69 6e 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20  indices to find 
bdf0: 72 6f 77 69 64 73 20 66 6f 72 20 65 61 63 68 20  rowids for each 
be00: 73 75 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70  subterm and comp
be10: 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69  osing.** the uni
be20: 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73  on of all rowids
be30: 20 75 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20   using a RowSet 
be40: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73  object.  This is
be50: 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22   similar.** to "
be60: 62 69 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20  bitmap indices" 
be70: 69 6e 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  in other databas
be80: 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a  e engines..**.**
be90: 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a   OTHERWISE:.**.*
bea0: 2a 20 49 66 20 6e 65 69 74 68 65 72 20 63 61 73  * If neither cas
beb0: 65 20 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61  e 1 nor case 2 a
bec0: 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65  pply, then leave
bed0: 20 74 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73   the eOperator s
bee0: 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20  et to.** zero.  
bef0: 54 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74  This term is not
bf00: 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72   useful for sear
bf10: 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ch..*/.static vo
bf20: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72  id exprAnalyzeOr
bf30: 54 65 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20  Term(.  SrcList 
bf40: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20  *pSrc,          
bf50: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
bf60: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
bf70: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
bf80: 20 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c      /* the compl
bf90: 65 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ete WHERE clause
bfa0: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72   */.  int idxTer
bfb0: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
bfc0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
bfd0: 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  OR-term to be an
bfe0: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
bff0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
c000: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20   = pWC->pWInfo; 
c010: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
c020: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
c030: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  g context */.  P
c040: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
c050: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
c060: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
c070: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
c080: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c090: 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20  se->db;         
c0a0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
c0b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
c0c0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
c0d0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
c0e0: 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65  Term];    /* The
c0f0: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
c100: 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  yzed */.  Expr *
c110: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
c120: 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
c130: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
c140: 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20  ion of the term 
c150: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
c160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c180: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
c190: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
c1a0: 70 4f 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20  pOrWc;       /* 
c1b0: 42 72 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d  Breakup of pTerm
c1c0: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
c1d0: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
c1e0: 4f 72 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a  OrTerm;       /*
c1f0: 20 41 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68   A Sub-term with
c200: 69 6e 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a  in the pOrWc */.
c210: 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70    WhereOrInfo *p
c220: 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41  OrInfo;     /* A
c230: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
c240: 61 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64  ation associated
c250: 20 77 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20   with pTerm */. 
c260: 20 42 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49   Bitmask chngToI
c270: 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  N;         /* Ta
c280: 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20  bles that might 
c290: 73 61 74 69 73 66 79 20 63 61 73 65 20 31 20 2a  satisfy case 1 *
c2a0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
c2b0: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a  xable;        /*
c2c0: 20 54 61 62 6c 65 73 20 74 68 61 74 20 61 72 65   Tables that are
c2d0: 20 69 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69   indexable, sati
c2e0: 73 66 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f  sfying case 2 */
c2f0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61  ..  /*.  ** Brea
c300: 6b 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  k the OR clause 
c310: 69 6e 74 6f 20 69 74 73 20 73 65 70 61 72 61 74  into its separat
c320: 65 20 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65  e subterms.  The
c330: 20 73 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20   subterms are.  
c340: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57  ** stored in a W
c350: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
c360: 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
c370: 77 69 74 68 69 6e 20 74 68 65 20 57 68 65 72 65  within the Where
c380: 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65  OrInfo.  ** obje
c390: 63 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63  ct that is attac
c3a0: 68 65 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69  hed to the origi
c3b0: 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65  nal OR clause te
c3c0: 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  rm..  */.  asser
c3d0: 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  t( (pTerm->wtFla
c3e0: 67 73 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d  gs & (TERM_DYNAM
c3f0: 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54  IC|TERM_ORINFO|T
c400: 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30  ERM_ANDINFO))==0
c410: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
c420: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29  xpr->op==TK_OR )
c430: 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  ;.  pTerm->u.pOr
c440: 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d  Info = pOrInfo =
c450: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
c460: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
c470: 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66  *pOrInfo));.  if
c480: 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72  ( pOrInfo==0 ) r
c490: 65 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e  eturn;.  pTerm->
c4a0: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
c4b0: 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20  ORINFO;.  pOrWc 
c4c0: 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  = &pOrInfo->wc;.
c4d0: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
c4e0: 74 28 70 4f 72 57 63 2c 20 70 57 49 6e 66 6f 29  t(pOrWc, pWInfo)
c4f0: 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 70  ;.  whereSplit(p
c500: 4f 72 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f  OrWc, pExpr, TK_
c510: 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79  OR);.  exprAnaly
c520: 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57  zeAll(pSrc, pOrW
c530: 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  c);.  if( db->ma
c540: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
c550: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
c560: 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29  OrWc->nTerm>=2 )
c570: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d  ;..  /*.  ** Com
c580: 70 75 74 65 20 74 68 65 20 73 65 74 20 6f 66 20  pute the set of 
c590: 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68  tables that migh
c5a0: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 73 20  t satisfy cases 
c5b0: 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69  1 or 2..  */.  i
c5c0: 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28 42 69 74  ndexable = ~(Bit
c5d0: 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f  mask)0;.  chngTo
c5e0: 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  IN = ~(Bitmask)0
c5f0: 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d  ;.  for(i=pOrWc-
c600: 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72  >nTerm-1, pOrTer
c610: 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30  m=pOrWc->a; i>=0
c620: 20 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69   && indexable; i
c630: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
c640: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
c650: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
c660: 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20  _SINGLE)==0 ){. 
c670: 20 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66       WhereAndInf
c680: 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20  o *pAndInfo;.   
c690: 20 20 20 61 73 73 65 72 74 28 20 28 70 4f 72 54     assert( (pOrT
c6a0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
c6b0: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52  TERM_ANDINFO|TER
c6c0: 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b  M_ORINFO))==0 );
c6d0: 0a 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20  .      chngToIN 
c6e0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 6e 64 49  = 0;.      pAndI
c6f0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
c700: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
c710: 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b  eof(*pAndInfo));
c720: 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 49  .      if( pAndI
c730: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 57  nfo ){.        W
c740: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64  hereClause *pAnd
c750: 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72  WC;.        Wher
c760: 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b  eTerm *pAndTerm;
c770: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
c780: 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
c790: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  b = 0;.        p
c7a0: 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e  OrTerm->u.pAndIn
c7b0: 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20  fo = pAndInfo;. 
c7c0: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
c7d0: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
c7e0: 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20  ANDINFO;.       
c7f0: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
c800: 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20  tor = WO_AND;.  
c810: 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d 20 26        pAndWC = &
c820: 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  pAndInfo->wc;.  
c830: 20 20 20 20 20 20 77 68 65 72 65 43 6c 61 75 73        whereClaus
c840: 65 49 6e 69 74 28 70 41 6e 64 57 43 2c 20 70 57  eInit(pAndWC, pW
c850: 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  C->pWInfo);.    
c860: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
c870: 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e  AndWC, pOrTerm->
c880: 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a  pExpr, TK_AND);.
c890: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
c8a0: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e  yzeAll(pSrc, pAn
c8b0: 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41  dWC);.        pA
c8c0: 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70  ndWC->pOuter = p
c8d0: 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  WC;.        test
c8e0: 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  case( db->malloc
c8f0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
c900: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
c910: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
c920: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41       for(j=0, pA
c930: 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61  ndTerm=pAndWC->a
c940: 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72  ; j<pAndWC->nTer
c950: 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d  m; j++, pAndTerm
c960: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
c970: 20 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72   assert( pAndTer
c980: 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  m->pExpr );.    
c990: 20 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f          if( allo
c9a0: 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e  wedOp(pAndTerm->
c9b0: 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20  pExpr->op) ){.  
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d              b |=
c9d0: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
c9e0: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64  ->sMaskSet, pAnd
c9f0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
ca00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
ca10: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ca20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
ca30: 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20  ndexable &= b;. 
ca40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
ca50: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
ca60: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
ca70: 49 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  IED ){.      /* 
ca80: 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 66  Skip this term f
ca90: 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69  or now.  We revi
caa0: 73 69 74 20 69 74 20 77 68 65 6e 20 77 65 20 70  sit it when we p
cab0: 72 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20 20  rocess the.     
cac0: 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e   ** correspondin
cad0: 67 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74  g TERM_VIRTUAL t
cae0: 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  erm */.    }else
caf0: 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
cb00: 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74  b;.      b = get
cb10: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
cb20: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
cb30: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
cb40: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
cb50: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
cb60: 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20  VIRTUAL ){.     
cb70: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
cb80: 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61  ther = &pOrWc->a
cb90: 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e  [pOrTerm->iParen
cba0: 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d  t];.        b |=
cbb0: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
cbc0: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68  ->sMaskSet, pOth
cbd0: 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b  er->leftCursor);
cbe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
cbf0: 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20  ndexable &= b;. 
cc00: 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
cc10: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
cc20: 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20 20 20 20  O_EQ)==0 ){.    
cc30: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30      chngToIN = 0
cc40: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
cc50: 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20         chngToIN 
cc60: 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &= b;.      }.  
cc70: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
cc80: 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73 65  ** Record the se
cc90: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
cca0: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e   satisfy case 2.
ccb0: 20 20 54 68 65 20 73 65 74 20 6d 69 67 68 74 20    The set might 
ccc0: 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20  be.  ** empty.. 
ccd0: 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69   */.  pOrInfo->i
cce0: 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78  ndexable = index
ccf0: 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65  able;.  pTerm->e
cd00: 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78  Operator = index
cd10: 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f  able==0 ? 0 : WO
cd20: 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  _OR;..  /*.  ** 
cd30: 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61  chngToIN holds a
cd40: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
cd50: 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69  hat *might* sati
cd60: 73 66 79 20 63 61 73 65 20 31 2e 20 20 42 75 74  sfy case 1.  But
cd70: 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f  .  ** we have to
cd80: 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f   do some additio
cd90: 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  nal checking to 
cda0: 73 65 65 20 69 66 20 63 61 73 65 20 31 20 72 65  see if case 1 re
cdb0: 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74  ally.  ** is sat
cdc0: 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  isfied..  **.  *
cdd0: 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20  * chngToIN will 
cde0: 68 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31  hold either 0, 1
cdf0: 2c 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68  , or 2 bits.  Th
ce00: 65 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61  e 0-bit case mea
ce10: 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  ns.  ** that the
ce20: 72 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69  re is no possibi
ce30: 6c 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72  lity of transfor
ce40: 6d 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75  ming the OR clau
ce50: 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20  se into an.  ** 
ce60: 49 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61  IN operator beca
ce70: 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  use one or more 
ce80: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20  terms in the OR 
ce90: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20  clause contain. 
cea0: 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74   ** something ot
ceb0: 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61  her than == on a
cec0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73   column in the s
ced0: 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68  ingle table.  Th
cee0: 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73  e 1-bit.  ** cas
cef0: 65 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65  e means that eve
cf00: 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f  ry term of the O
cf10: 52 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74  R clause is of t
cf20: 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61  he form.  ** "ta
cf30: 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22  ble.column=expr"
cf40: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
cf50: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65   table.  The one
cf60: 20 62 69 74 20 74 68 61 74 20 69 73 20 73 65 74   bit that is set
cf70: 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65  .  ** will corre
cf80: 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d  spond to the com
cf90: 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73  mon table.  We s
cfa0: 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65  till need to che
cfb0: 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20  ck to make.  ** 
cfc0: 73 75 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f  sure the same co
cfd0: 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20  lumn is used on 
cfe0: 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20  all terms.  The 
cff0: 32 2d 62 69 74 20 63 61 73 65 20 69 73 20 77 68  2-bit case is wh
d000: 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20  en.  ** the all 
d010: 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65  terms are of the
d020: 20 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f   form "table1.co
d030: 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75  lumn=table2.colu
d040: 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69  mn".  It.  ** mi
d050: 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  ght be possible 
d060: 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70  to form an IN op
d070: 65 72 61 74 6f 72 20 77 69 74 68 20 65 69 74 68  erator with eith
d080: 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e  er table1.column
d090: 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e  .  ** or table2.
d0a0: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48  column as the LH
d0b0: 53 20 69 66 20 65 69 74 68 65 72 20 69 73 20 63  S if either is c
d0c0: 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74  ommon to every t
d0d0: 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  erm of.  ** the 
d0e0: 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  OR clause..  **.
d0f0: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
d100: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
d110: 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d   "table.column1=
d120: 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28  table.column2" (
d130: 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61  the.  ** same ta
d140: 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65  ble on both size
d150: 73 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e  s of the ==) can
d160: 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  not be optimized
d170: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e  ..  */.  if( chn
d180: 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74  gToIN ){.    int
d190: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
d1a0: 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  0;     /* True i
d1b0: 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e  f the conversion
d1c0: 20 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20   to IN is valid 
d1d0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75  */.    int iColu
d1e0: 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  mn = -1;        
d1f0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78   /* Column index
d200: 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70   on lhs of IN op
d210: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e  erator */.    in
d220: 74 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20  t iCursor = -1; 
d230: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
d240: 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74   cursor common t
d250: 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20  o all terms */. 
d260: 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20     int j = 0;   
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d280: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
d290: 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66  .    /* Search f
d2a0: 6f 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63  or a table and c
d2b0: 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61  olumn that appea
d2c0: 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f  rs on one side o
d2d0: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68  r the.    ** oth
d2e0: 65 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65  er of the == ope
d2f0: 72 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73  rator in every s
d300: 75 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61  ubterm.  That ta
d310: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20  ble and column. 
d320: 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
d330: 63 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f  corded in iCurso
d340: 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20  r and iColumn.  
d350: 54 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20  There might not 
d360: 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75  be any.    ** su
d370: 63 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  ch table and col
d380: 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68  umn.  Set okToCh
d390: 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70  ngToIN if an app
d3a0: 72 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20  ropriate table. 
d3b0: 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e     ** and column
d3c0: 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65   is found but le
d3d0: 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  ave okToChngToIN
d3e0: 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f   false if not fo
d3f0: 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  und..    */.    
d400: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20  for(j=0; j<2 && 
d410: 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a  !okToChngToIN; j
d420: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65  ++){.      pOrTe
d430: 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20  rm = pOrWc->a;. 
d440: 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63       for(i=pOrWc
d450: 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  ->nTerm-1; i>=0;
d460: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
d470: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
d480: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
d490: 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
d4a0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
d4b0: 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52  >wtFlags &= ~TER
d4c0: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
d4d0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
d4e0: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f  ftCursor==iCurso
d4f0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
d500: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 32 2d  * This is the 2-
d510: 62 69 74 20 63 61 73 65 20 61 6e 64 20 77 65 20  bit case and we 
d520: 61 72 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  are on the secon
d530: 64 20 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a  d iteration and.
d540: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72            ** cur
d550: 72 65 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f  rent term is fro
d560: 6d 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  m the first iter
d570: 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20  ation.  So skip 
d580: 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  this term. */.  
d590: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d5a0: 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  j==1 );.        
d5b0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
d5c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
d5d0: 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65  ( (chngToIN & ge
d5e0: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
d5f0: 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d  MaskSet, pOrTerm
d600: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d  ->leftCursor))==
d610: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
d620: 2a 20 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74  * This term must
d630: 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   be of the form 
d640: 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65  t1.a==t2.b where
d650: 20 74 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20   t2 is in the.  
d660: 20 20 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54          ** chngT
d670: 6f 49 4e 20 73 65 74 20 62 75 74 20 74 31 20 69  oIN set but t1 i
d680: 73 20 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72  s not.  This ter
d690: 6d 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72  m will be either
d6a0: 20 70 72 65 63 65 65 64 65 64 0a 20 20 20 20 20   preceeded.     
d6b0: 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77       ** or follw
d6c0: 65 64 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65  ed by an inverte
d6d0: 64 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31  d copy (t2.b==t1
d6e0: 2e 61 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20  .a).  Skip this 
d6f0: 74 65 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20  term .          
d700: 2a 2a 20 61 6e 64 20 75 73 65 20 69 74 73 20 69  ** and use its i
d710: 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20  nversion. */.   
d720: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
d730: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
d740: 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  s & TERM_COPIED 
d750: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
d760: 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e  tcase( pOrTerm->
d770: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
d780: 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
d790: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
d7a0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
d7b0: 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d  TERM_COPIED|TERM
d7c0: 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20  _VIRTUAL) );.   
d7d0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
d7e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d7f0: 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72     iColumn = pOr
d800: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
d810: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72  mn;.        iCur
d820: 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c  sor = pOrTerm->l
d830: 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  eftCursor;.     
d840: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d850: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 30 20  }.      if( i<0 
d860: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ){.        /* No
d870: 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65   candidate table
d880: 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e  +column was foun
d890: 64 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  d.  This can onl
d8a0: 79 20 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20  y occur.        
d8b0: 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  ** on the second
d8c0: 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   iteration */.  
d8d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d        assert( j=
d8e0: 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =1 );.        as
d8f0: 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
d900: 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a  wo(chngToIN) );.
d910: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d920: 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73  chngToIN==getMas
d930: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
d940: 53 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b  Set, iCursor) );
d950: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
d960: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
d970: 73 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a  stcase( j==1 );.
d980: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76  .      /* We hav
d990: 65 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64  e found a candid
d9a0: 61 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  ate table and co
d9b0: 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20  lumn.  Check to 
d9c0: 73 65 65 20 69 66 20 74 68 61 74 0a 20 20 20 20  see if that.    
d9d0: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63    ** table and c
d9e0: 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20  olumn is common 
d9f0: 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
da00: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a   the OR clause *
da10: 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67  /.      okToChng
da20: 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20  ToIN = 1;.      
da30: 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b  for(; i>=0 && ok
da40: 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c  ToChngToIN; i--,
da50: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
da60: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
da70: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
da80: 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
da90: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
daa0: 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72  leftCursor!=iCur
dab0: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
dac0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
dad0: 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b  s &= ~TERM_OR_OK
dae0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
daf0: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  if( pOrTerm->u.l
db00: 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75  eftColumn!=iColu
db10: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
db20: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
db30: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
db40: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61  .          int a
db50: 66 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74  ffLeft, affRight
db60: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;.          /* I
db70: 66 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  f the right-hand
db80: 20 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20   side is also a 
db90: 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65  column, then the
dba0: 20 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20   affinities.    
dbb0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68        ** of both
dbc0: 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20   right and left 
dbd0: 73 69 64 65 73 20 6d 75 73 74 20 62 65 20 73 75  sides must be su
dbe0: 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a  ch that no type.
dbf0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
dc00: 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71  versions are req
dc10: 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67  uired on the rig
dc20: 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32  ht.  (Ticket #22
dc30: 34 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  49).          */
dc40: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 52 69  .          affRi
dc50: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
dc60: 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72  rAffinity(pOrTer
dc70: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
dc80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  );.          aff
dc90: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
dca0: 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65  prAffinity(pOrTe
dcb0: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  rm->pExpr->pLeft
dcc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
dcd0: 20 61 66 66 52 69 67 68 74 21 3d 30 20 26 26 20   affRight!=0 && 
dce0: 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66  affRight!=affLef
dcf0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
dd00: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
dd10: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
dd20: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
dd30: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
dd40: 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a   |= TERM_OR_OK;.
dd50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
dd60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
dd70: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
dd80: 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43  his point, okToC
dd90: 68 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20  hngToIN is true 
dda0: 69 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72  if original pTer
ddb0: 6d 20 73 61 74 69 73 66 69 65 73 0a 20 20 20 20  m satisfies.    
ddc0: 2a 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74  ** case 1.  In t
ddd0: 68 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72  hat case, constr
dde0: 75 63 74 20 61 20 6e 65 77 20 76 69 72 74 75 61  uct a new virtua
ddf0: 6c 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a  l term that is .
de00: 20 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e      ** pTerm con
de10: 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49  verted into an I
de20: 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20  N operator..    
de30: 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43  */.    if( okToC
de40: 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20  hngToIN ){.     
de50: 20 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20   Expr *pDup;    
de60: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61          /* A tra
de70: 6e 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65  nsient duplicate
de80: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
de90: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
dea0: 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54  List = 0;   /* T
deb0: 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
dec0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
ded0: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
dee0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65   0;       /* The
def0: 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
df00: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
df10: 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20   Expr *pNew;    
df20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
df30: 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61  omplete IN opera
df40: 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f  tor */..      fo
df50: 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  r(i=pOrWc->nTerm
df60: 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57  -1, pOrTerm=pOrW
df70: 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  c->a; i>=0; i--,
df80: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
df90: 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
dfa0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
dfb0: 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f  M_OR_OK)==0 ) co
dfc0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
dfd0: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
dfe0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
dff0: 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EQ );.        as
e000: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c  sert( pOrTerm->l
e010: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73  eftCursor==iCurs
e020: 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  or );.        as
e030: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75  sert( pOrTerm->u
e040: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  .leftColumn==iCo
e050: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
e060: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
e070: 70 72 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72  prDup(db, pOrTer
e080: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
e090: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  , 0);.        pL
e0a0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
e0b0: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 57 49 6e  rListAppend(pWIn
e0c0: 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73  fo->pParse, pLis
e0d0: 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  t, pDup);.      
e0e0: 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54 65 72    pLeft = pOrTer
e0f0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  m->pExpr->pLeft;
e100: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
e110: 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20  ssert( pLeft!=0 
e120: 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20  );.      pDup = 
e130: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
e140: 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  b, pLeft, 0);.  
e150: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
e160: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
e170: 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20  TK_IN, pDup, 0, 
e180: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  0);.      if( pN
e190: 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ew ){.        in
e1a0: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
e1b0: 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61    transferJoinMa
e1c0: 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78  rkings(pNew, pEx
e1d0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  pr);.        ass
e1e0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
e1f0: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78  perty(pNew, EP_x
e200: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
e210: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69       pNew->x.pLi
e220: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  st = pList;.    
e230: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
e240: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
e250: 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56  WC, pNew, TERM_V
e260: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
e270: 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65  MIC);.        te
e280: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
e290: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  0 );.        exp
e2a0: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
e2b0: 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20  WC, idxNew);.   
e2c0: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
e2d0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
e2e0: 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64         pWC->a[id
e2f0: 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20  xNew].iParent = 
e300: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  idxTerm;.       
e310: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
e320: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
e330: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e340: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
e350: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  b, pList);.     
e360: 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e   }.      pTerm->
e370: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e  eOperator = WO_N
e380: 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20 31 20  OOP;  /* case 1 
e390: 74 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f  trumps case 2 */
e3a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
e3b0: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
e3c0: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
e3d0: 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  ION && !SQLITE_O
e3e0: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
e3f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  ./*.** The input
e400: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
e410: 20 69 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d   is an WhereTerm
e420: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
e430: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78  only the.** "pEx
e440: 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64  pr" field filled
e450: 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66   in.  The job of
e460: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
e470: 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a   to analyze the.
e480: 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
e490: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c   and populate al
e4a0: 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c  l the other fiel
e4b0: 64 73 20 6f 66 20 74 68 65 20 57 68 65 72 65 54  ds of the WhereT
e4c0: 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  erm.** structure
e4d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
e4e0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
e4f0: 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e  the form "<expr>
e500: 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73   <op> X" it gets
e510: 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20   commuted.** to 
e520: 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72  the standard for
e530: 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78  m of "X <op> <ex
e540: 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pr>"..**.** If t
e550: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
e560: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
e570: 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f  <op> Y" where bo
e580: 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a  th X and Y are.*
e590: 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  * columns, then 
e5a0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70  the original exp
e5b0: 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61  ression is uncha
e5c0: 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76  nged and a new v
e5d0: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f  irtual.** term o
e5e0: 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f  f the form "Y <o
e5f0: 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74  p> X" is added t
e600: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
e610: 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a  se and.** analyz
e620: 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20  ed separately.  
e630: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  The original ter
e640: 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  m is marked with
e650: 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20   TERM_COPIED.** 
e660: 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d  and the new term
e670: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
e680: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65  TERM_DYNAMIC (be
e690: 63 61 75 73 65 20 69 74 27 73 20 70 45 78 70 72  cause it's pExpr
e6a0: 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
e6b0: 66 72 65 65 64 20 77 69 74 68 20 74 68 65 20 57  freed with the W
e6c0: 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20  hereClause) and 
e6d0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65  TERM_VIRTUAL (be
e6e0: 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61  cause it.** is a
e6f0: 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f   commuted copy o
e700: 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29  f a prior term.)
e710: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
e720: 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31  erm has nChild=1
e730: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79  .** and the copy
e740: 20 68 61 73 20 69 64 78 50 61 72 65 6e 74 20 73   has idxParent s
e750: 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
e760: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
e770: 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  term..*/.static 
e780: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
e790: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
e7a0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
e7b0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
e7c0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
e7d0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
e7e0: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
e7f0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
e800: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
e810: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
e820: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
e830: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
e840: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
e850: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20   = pWC->pWInfo; 
e860: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
e870: 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65  processing conte
e880: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
e890: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
e8a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e8b0: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
e8c0: 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  zed */.  WhereMa
e8d0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
e8e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
e8f0: 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65 78 20   of table index 
e900: 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20  masks */.  Expr 
e910: 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  *pExpr;         
e920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e930: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
e940: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
e950: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
e960: 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20  Left;           
e970: 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69     /* Prerequesi
e980: 74 65 73 20 6f 66 20 74 68 65 20 70 45 78 70 72  tes of the pExpr
e990: 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74  ->pLeft */.  Bit
e9a0: 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20  mask prereqAll; 
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e9c0: 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f   Prerequesites o
e9d0: 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42 69 74  f pExpr */.  Bit
e9e0: 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68 74 20  mask extraRight 
e9f0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
ea00: 20 45 78 74 72 61 20 64 65 70 65 6e 64 65 6e 63   Extra dependenc
ea10: 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e  ies on LEFT JOIN
ea20: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74 72   */.  Expr *pStr
ea30: 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
ea40: 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66         /* RHS of
ea50: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
ea60: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  tor */.  int isC
ea70: 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 20  omplete = 0;    
ea80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53            /* RHS
ea90: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e   of LIKE/GLOB en
eaa0: 64 73 20 77 69 74 68 20 77 69 6c 64 63 61 72 64  ds with wildcard
eab0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65   */.  int noCase
eac0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
ead0: 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 2f 47         /* LIKE/G
eae0: 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73 68 65  LOB distinguishe
eaf0: 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  s case */.  int 
eb00: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
eb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eb20: 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74  Top-level operat
eb30: 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a  or.  pExpr->op *
eb40: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
eb50: 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
eb60: 73 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  se;  /* Parsing 
eb70: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
eb80: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
eb90: 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 2f 2a  e->db;        /*
eba0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
ebb0: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64  tion */..  if( d
ebc0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ebd0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
ebe0: 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57   }.  pTerm = &pW
ebf0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
ec00: 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49   pMaskSet = &pWI
ec10: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20  nfo->sMaskSet;. 
ec20: 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e   pExpr = pTerm->
ec30: 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  pExpr;.  assert(
ec40: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
ec50: 53 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d  S && pExpr->op!=
ec60: 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20  TK_COLLATE );.  
ec70: 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70  prereqLeft = exp
ec80: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
ec90: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  kSet, pExpr->pLe
eca0: 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70  ft);.  op = pExp
ecb0: 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  r->op;.  if( op=
ecc0: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73  =TK_IN ){.    as
ecd0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
ece0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ght==0 );.    if
ecf0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
ed00: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
ed10: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
ed20: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
ed30: 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54  ht = exprSelectT
ed40: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
ed50: 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  et, pExpr->x.pSe
ed60: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
ed70: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
ed80: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
ed90: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
eda0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
edb0: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
edc0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
edd0: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
ede0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
edf0: 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ight = 0;.  }els
ee00: 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  e{.    pTerm->pr
ee10: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
ee20: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
ee30: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Set, pExpr->pRig
ee40: 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65  ht);.  }.  prere
ee50: 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65  qAll = exprTable
ee60: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
ee70: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78  pExpr);.  if( Ex
ee80: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
ee90: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
eea0: 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  ) ){.    Bitmask
eeb0: 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   x = getMask(pMa
eec0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52  skSet, pExpr->iR
eed0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a  ightJoinTable);.
eee0: 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d      prereqAll |=
eef0: 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67   x;.    extraRig
ef00: 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e  ht = x-1;  /* ON
ef10: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61   clause terms ma
ef20: 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69  y not be used wi
ef30: 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20  th an index.    
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef50: 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61     ** on left ta
ef60: 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ble of a LEFT JO
ef70: 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  IN.  Ticket #301
ef80: 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d  5 */.  }.  pTerm
ef90: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
efa0: 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d  ereqAll;.  pTerm
efb0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d  ->leftCursor = -
efc0: 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  1;.  pTerm->iPar
efd0: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  ent = -1;.  pTer
efe0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30  m->eOperator = 0
eff0: 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f  ;.  if( allowedO
f000: 70 28 6f 70 29 20 29 7b 0a 20 20 20 20 45 78 70  p(op) ){.    Exp
f010: 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r *pLeft = sqlit
f020: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
f030: 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  e(pExpr->pLeft);
f040: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
f050: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  t = sqlite3ExprS
f060: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72  kipCollate(pExpr
f070: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 75  ->pRight);.    u
f080: 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65  16 opMask = (pTe
f090: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
f0a0: 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30  & prereqLeft)==0
f0b0: 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45   ? WO_ALL : WO_E
f0c0: 51 55 49 56 3b 0a 20 20 20 20 69 66 28 20 70 4c  QUIV;.    if( pL
f0d0: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
f0e0: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  MN ){.      pTer
f0f0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
f100: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
f110: 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65       pTerm->u.le
f120: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
f130: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
f140: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
f150: 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  r = operatorMask
f160: 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20  (op) & opMask;. 
f170: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69     }.    if( pRi
f180: 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f  ght && pRight->o
f190: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
f1a0: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
f1b0: 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70  *pNew;.      Exp
f1c0: 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 75  r *pDup;.      u
f1d0: 31 36 20 65 45 78 74 72 61 4f 70 20 3d 20 30 3b  16 eExtraOp = 0;
f1e0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
f1f0: 20 62 69 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e   bits for pNew->
f200: 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20  eOperator */.   
f210: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
f220: 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20  ftCursor>=0 ){. 
f230: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
f240: 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  w;.        pDup 
f250: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
f260: 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
f270: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
f280: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
f290: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f2a0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
f2b0: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20  pDup);.         
f2c0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
f2d0: 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65   }.        idxNe
f2e0: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
f2f0: 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c  nsert(pWC, pDup,
f300: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
f310: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
f320: 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d       if( idxNew=
f330: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
f340: 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43       pNew = &pWC
f350: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
f360: 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65       pNew->iPare
f370: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
f380: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
f390: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
f3a0: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e          pTerm->n
f3b0: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
f3c0: 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
f3d0: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
f3e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
f3f0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20  xpr->op==TK_EQ. 
f400: 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72          && !Expr
f410: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
f420: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
f430: 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69           && Opti
f440: 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
f450: 64 62 2c 20 53 51 4c 49 54 45 5f 54 72 61 6e 73  db, SQLITE_Trans
f460: 69 74 69 76 65 29 0a 20 20 20 20 20 20 20 20 29  itive).        )
f470: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72  {.          pTer
f480: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c 3d 20  m->eOperator |= 
f490: 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20  WO_EQUIV;.      
f4a0: 20 20 20 20 65 45 78 74 72 61 4f 70 20 3d 20 57      eExtraOp = W
f4b0: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20  O_EQUIV;.       
f4c0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
f4d0: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70          pDup = p
f4e0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e  Expr;.        pN
f4f0: 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  ew = pTerm;.    
f500: 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f    }.      exprCo
f510: 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44  mmute(pParse, pD
f520: 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74  up);.      pLeft
f530: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
f540: 69 70 43 6f 6c 6c 61 74 65 28 70 44 75 70 2d 3e  ipCollate(pDup->
f550: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 70 4e  pLeft);.      pN
f560: 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  ew->leftCursor =
f570: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
f580: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65        pNew->u.le
f590: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
f5a0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
f5b0: 20 74 65 73 74 63 61 73 65 28 20 28 70 72 65 72   testcase( (prer
f5c0: 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69  eqLeft | extraRi
f5d0: 67 68 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65  ght) != prereqLe
f5e0: 66 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ft );.      pNew
f5f0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
f600: 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74  prereqLeft | ext
f610: 72 61 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70  raRight;.      p
f620: 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  New->prereqAll =
f630: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20   prereqAll;.    
f640: 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f    pNew->eOperato
f650: 72 20 3d 20 28 6f 70 65 72 61 74 6f 72 4d 61 73  r = (operatorMas
f660: 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45  k(pDup->op) + eE
f670: 78 74 72 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b  xtraOp) & opMask
f680: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
f690: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f6a0: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
f6b0: 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20  ATION.  /* If a 
f6c0: 74 65 72 6d 20 69 73 20 74 68 65 20 42 45 54 57  term is the BETW
f6d0: 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72  EEN operator, cr
f6e0: 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72  eate two new vir
f6f0: 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20  tual terms.  ** 
f700: 74 68 61 74 20 64 65 66 69 6e 65 20 74 68 65 20  that define the 
f710: 72 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 42  range that the B
f720: 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74  ETWEEN implement
f730: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
f740: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
f750: 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20  a BETWEEN b AND 
f760: 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63  c.  **.  ** is c
f770: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20  onverted into:. 
f780: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28 61   **.  **      (a
f790: 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63   BETWEEN b AND c
f7a0: 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44  ) AND (a>=b) AND
f7b0: 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a   (a<=c).  **.  *
f7c0: 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74 65  * The two new te
f7d0: 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f 6e  rms are added on
f7e0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
f7f0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
f800: 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e  ject..  ** The n
f810: 65 77 20 74 65 72 6d 73 20 61 72 65 20 22 64 79  ew terms are "dy
f820: 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20 63  namic" and are c
f830: 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20 6f  hildren of the o
f840: 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a  riginal BETWEEN.
f850: 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61 74    ** term.  That
f860: 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74   means that if t
f870: 68 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  he BETWEEN term 
f880: 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63 68  is coded, the ch
f890: 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20  ildren are.  ** 
f8a0: 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69 66  skipped.  Or, if
f8b0: 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72   the children ar
f8c0: 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20 61  e satisfied by a
f8d0: 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 69  n index, the ori
f8e0: 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45  ginal.  ** BETWE
f8f0: 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70 70  EN term is skipp
f900: 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
f910: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
f920: 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57 43  K_BETWEEN && pWC
f930: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
f940: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
f950: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
f960: 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  List;.    int i;
f970: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
f980: 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b  t u8 ops[] = {TK
f990: 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20  _GE, TK_LE};.   
f9a0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
f9b0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
f9c0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32   pList->nExpr==2
f9d0: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
f9e0: 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
f9f0: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
fa00: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e  ;.      int idxN
fa10: 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78  ew;.      pNewEx
fa20: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
fa30: 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d  r(pParse, ops[i]
fa40: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa60: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
fa70: 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
fa80: 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
fa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faa0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
fab0: 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
fac0: 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a  .pExpr, 0), 0);.
fad0: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
fae0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
faf0: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
fb00: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
fb10: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
fb20: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
fb30: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ew==0 );.      e
fb40: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
fb50: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20   pWC, idxNew);. 
fb60: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
fb70: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
fb80: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
fb90: 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  ew].iParent = id
fba0: 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  xTerm;.    }.   
fbb0: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
fbc0: 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   2;.  }.#endif /
fbd0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45  * SQLITE_OMIT_BE
fbe0: 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49  TWEEN_OPTIMIZATI
fbf0: 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  ON */..#if !defi
fc00: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
fc10: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
fc20: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
fc30: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
fc40: 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  Y).  /* Analyze 
fc50: 61 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 63  a term that is c
fc60: 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f  omposed of two o
fc70: 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73 20  r more subterms 
fc80: 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 2a  connected by.  *
fc90: 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72  * an OR operator
fca0: 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
fcb0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
fcc0: 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OR ){.    assert
fcd0: 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  ( pWC->op==TK_AN
fce0: 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  D );.    exprAna
fcf0: 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72 63 2c  lyzeOrTerm(pSrc,
fd00: 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a   pWC, idxTerm);.
fd10: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
fd20: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
fd30: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
fd40: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
fd50: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e  IZATION */..#ifn
fd60: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fd70: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
fd80: 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74  N.  /* Add const
fd90: 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65  raints to reduce
fda0: 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
fdb0: 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47  e on a LIKE or G
fdc0: 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  LOB.  ** operato
fdd0: 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c  r..  **.  ** A l
fde0: 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66 20 74  ike pattern of t
fdf0: 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20  he form "x LIKE 
fe00: 27 61 62 63 25 27 22 20 69 73 20 63 68 61 6e 67  'abc%'" is chang
fe10: 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69  ed into constrai
fe20: 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  nts.  **.  **   
fe30: 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63 27 20         x>='abc' 
fe40: 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e 44 20  AND x<'abd' AND 
fe50: 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a 20 20  x LIKE 'abc%'.  
fe60: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73 74  **.  ** The last
fe70: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
fe80: 65 20 70 72 65 66 69 78 20 22 61 62 63 22 20 69  e prefix "abc" i
fe90: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f  s incremented to
fea0: 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74   form the.  ** t
feb0: 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69  ermination condi
fec0: 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f  tion "abd"..  */
fed0: 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d  .  if( pWC->op==
fee0: 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20 69 73  TK_AND .   && is
fef0: 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72 73  LikeOrGlob(pPars
ff00: 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74 72 31  e, pExpr, &pStr1
ff10: 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26  , &isComplete, &
ff20: 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20 20 20  noCase).  ){.   
ff30: 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20   Expr *pLeft;   
ff40: 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49      /* LHS of LI
ff50: 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  KE/GLOB operator
ff60: 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 53   */.    Expr *pS
ff70: 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f  tr2;       /* Co
ff80: 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20 52 48  py of pStr1 - RH
ff90: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f  S of LIKE/GLOB o
ffa0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45  perator */.    E
ffb0: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a  xpr *pNewExpr1;.
ffc0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
ffd0: 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  pr2;.    int idx
ffe0: 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20 69 64  New1;.    int id
fff0: 78 4e 65 77 32 3b 0a 20 20 20 20 54 6f 6b 65 6e  xNew2;.    Token
10000 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20   sCollSeqName;  
10010 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  /* Name of colla
10020 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f  ting sequence */
10030 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45  ..    pLeft = pE
10040 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
10050 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53  1].pExpr;.    pS
10060 74 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  tr2 = sqlite3Exp
10070 72 44 75 70 28 64 62 2c 20 70 53 74 72 31 2c 20  rDup(db, pStr1, 
10080 30 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d  0);.    if( !db-
10090 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
100a0 0a 20 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43  .      u8 c, *pC
100b0 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  ;       /* Last 
100c0 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65  character before
100d0 20 74 68 65 20 66 69 72 73 74 20 77 69 6c 64 63   the first wildc
100e0 61 72 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20  ard */.      pC 
100f0 3d 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75  = (u8*)&pStr2->u
10100 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53  .zToken[sqlite3S
10110 74 72 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75  trlen30(pStr2->u
10120 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20  .zToken)-1];.   
10130 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20     c = *pC;.    
10140 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a    if( noCase ){.
10150 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
10160 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65  oint is to incre
10170 6d 65 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68  ment the last ch
10180 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74  aracter before t
10190 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20  he first.       
101a0 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42   ** wildcard.  B
101b0 75 74 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65  ut if we increme
101c0 6e 74 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c  nt '@', that wil
101d0 6c 20 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74  l push it into t
101e0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  he.        ** al
101f0 70 68 61 62 65 74 69 63 20 72 61 6e 67 65 20 77  phabetic range w
10200 68 65 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72  here case conver
10210 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20  sions will mess 
10220 75 70 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  up the .        
10230 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  ** inequality.  
10240 54 6f 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d  To avoid this, m
10250 61 6b 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f  ake sure to also
10260 20 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20   run the full.  
10270 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e        ** LIKE on
10280 20 61 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65   all candidate e
10290 78 70 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c  xpressions by cl
102a0 65 61 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d  earing the isCom
102b0 70 6c 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20  plete flag.     
102c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
102d0 28 20 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43  ( c=='A'-1 ) isC
102e0 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20  omplete = 0;.   
102f0 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
10300 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b  UpperToLower[c];
10310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
10320 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20  pC = c + 1;.    
10330 7d 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61  }.    sCollSeqNa
10340 6d 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20  me.z = noCase ? 
10350 22 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41  "NOCASE" : "BINA
10360 52 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65  RY";.    sCollSe
10370 71 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20  qName.n = 6;.   
10380 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c   pNewExpr1 = sql
10390 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
103a0 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70  pLeft, 0);.    p
103b0 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74  NewExpr1 = sqlit
103c0 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
103d0 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20 20  TK_GE, .        
103e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64     sqlite3ExprAd
103f0 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50  dCollateToken(pP
10400 61 72 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 26  arse,pNewExpr1,&
10410 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20  sCollSeqName),. 
10420 20 20 20 20 20 20 20 20 20 20 70 53 74 72 31 2c            pStr1,
10430 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31   0);.    idxNew1
10440 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
10450 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
10460 70 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  pr1, TERM_VIRTUA
10470 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
10480 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
10490 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20  dxNew1==0 );.   
104a0 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
104b0 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29  c, pWC, idxNew1)
104c0 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20  ;.    pNewExpr2 
104d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
104e0 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a  (db, pLeft, 0);.
104f0 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20      pNewExpr2 = 
10500 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
10510 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20  rse, TK_LT,.    
10520 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
10530 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65  prAddCollateToke
10540 6e 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70  n(pParse,pNewExp
10550 72 32 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65  r2,&sCollSeqName
10560 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  ),.           pS
10570 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 69 64 78  tr2, 0);.    idx
10580 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61 75  New2 = whereClau
10590 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
105a0 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56 49  ewExpr2, TERM_VI
105b0 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
105c0 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  IC);.    testcas
105d0 65 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b  e( idxNew2==0 );
105e0 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
105f0 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
10600 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  ew2);.    pTerm 
10610 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
10620 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f  m];.    if( isCo
10630 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  mplete ){.      
10640 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e  pWC->a[idxNew1].
10650 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
10660 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  m;.      pWC->a[
10670 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74  idxNew2].iParent
10680 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
10690 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
106a0 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = 2;.    }.  }.#
106b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
106c0 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
106d0 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64  ZATION */..#ifnd
106e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
106f0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a  IRTUALTABLE.  /*
10700 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20   Add a WO_MATCH 
10710 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74  auxiliary term t
10720 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  o the constraint
10730 20 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a   set if the.  **
10740 20 63 75 72 72 65 6e 74 20 65 78 70 72 65 73 73   current express
10750 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
10760 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43  rm:  column MATC
10770 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69  H expr..  ** Thi
10780 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
10790 20 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65   used by the xBe
107a0 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20  stIndex methods 
107b0 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  of.  ** virtual 
107c0 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74  tables.  The nat
107d0 69 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69  ive query optimi
107e0 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74  zer does not att
107f0 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20  empt.  ** to do 
10800 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41  anything with MA
10810 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20  TCH functions.. 
10820 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63   */.  if( isMatc
10830 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29  hOfColumn(pExpr)
10840 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e   ){.    int idxN
10850 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  ew;.    Expr *pR
10860 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20  ight, *pLeft;.  
10870 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65    WhereTerm *pNe
10880 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61  wTerm;.    Bitma
10890 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c  sk prereqColumn,
108a0 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20   prereqExpr;..  
108b0 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72    pRight = pExpr
108c0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ->x.pList->a[0].
108d0 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74  pExpr;.    pLeft
108e0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
108f0 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
10900 20 20 20 70 72 65 72 65 71 45 78 70 72 20 3d 20     prereqExpr = 
10910 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
10920 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74 29  MaskSet, pRight)
10930 3b 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c 75  ;.    prereqColu
10940 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  mn = exprTableUs
10950 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c  age(pMaskSet, pL
10960 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28 70  eft);.    if( (p
10970 72 65 72 65 71 45 78 70 72 20 26 20 70 72 65 72  rereqExpr & prer
10980 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a  eqColumn)==0 ){.
10990 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
109a0 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  Expr;.      pNew
109b0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
109c0 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d  xpr(pParse, TK_M
109d0 41 54 43 48 2c 20 0a 20 20 20 20 20 20 20 20 20  ATCH, .         
109e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109f0 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 45       0, sqlite3E
10a00 78 70 72 44 75 70 28 64 62 2c 20 70 52 69 67 68  xprDup(db, pRigh
10a10 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20  t, 0), 0);.     
10a20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
10a30 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
10a40 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f   pNewExpr, TERM_
10a50 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
10a60 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73  AMIC);.      tes
10a70 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30  tcase( idxNew==0
10a80 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   );.      pNewTe
10a90 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
10aa0 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  New];.      pNew
10ab0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
10ac0 74 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a  t = prereqExpr;.
10ad0 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
10ae0 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
10af0 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
10b00 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65    pNewTerm->u.le
10b10 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
10b20 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
10b30 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72   pNewTerm->eOper
10b40 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b  ator = WO_MATCH;
10b50 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
10b60 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  >iParent = idxTe
10b70 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  rm;.      pTerm 
10b80 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
10b90 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  m];.      pTerm-
10ba0 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20  >nChild = 1;.   
10bb0 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
10bc0 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
10bd0 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
10be0 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54  ->prereqAll = pT
10bf0 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a  erm->prereqAll;.
10c00 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
10c10 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
10c20 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
10c30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10c40 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 2f 2a  NABLE_STAT4.  /*
10c50 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61   When sqlite_sta
10c60 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  t3 histogram dat
10c70 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61  a is available a
10c80 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68  n operator of th
10c90 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49  e.  ** form "x I
10ca0 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20  S NOT NULL" can 
10cb0 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61  sometimes be eva
10cc0 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69  luated more effi
10cd0 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20  ciently.  ** as 
10ce0 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73  "x>NULL" if x is
10cf0 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
10d00 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f  PRIMARY KEY.  So
10d10 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a   construct a.  *
10d20 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f  * virtual term o
10d30 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a  f that form..  *
10d40 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  *.  ** Note that
10d50 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 65 72   the virtual ter
10d60 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67 65 64  m must be tagged
10d70 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c   with TERM_VNULL
10d80 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52  .  This.  ** TER
10d90 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c  M_VNULL tag will
10da0 20 73 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f   suppress the no
10db0 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20  t-null check at 
10dc0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  the beginning.  
10dd0 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  ** of the loop. 
10de0 20 57 69 74 68 6f 75 74 20 74 68 65 20 54 45 52   Without the TER
10df0 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68  M_VNULL flag, th
10e00 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b  e not-null check
10e10 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61   at.  ** the sta
10e20 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77  rt of the loop w
10e30 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20  ill prevent any 
10e40 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69  results from bei
10e50 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a  ng returned..  *
10e60 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  /.  if( pExpr->o
10e70 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20  p==TK_NOTNULL.  
10e80 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   && pExpr->pLeft
10e90 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
10ea0 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65     && pExpr->pLe
10eb0 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20  ft->iColumn>=0. 
10ec0 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
10ed0 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
10ee0 49 54 45 5f 53 74 61 74 33 29 0a 20 20 29 7b 0a  ITE_Stat3).  ){.
10ef0 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
10f00 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  pr;.    Expr *pL
10f10 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
10f20 66 74 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e  ft;.    int idxN
10f30 65 77 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  ew;.    WhereTer
10f40 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20  m *pNewTerm;..  
10f50 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
10f60 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
10f70 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20  , TK_GT,.       
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f90 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
10fa0 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30  Dup(db, pLeft, 0
10fb0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
10fd0 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
10fe0 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20  se, TK_NULL, 0, 
10ff0 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20  0, 0), 0);..    
11000 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
11010 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
11020 70 4e 65 77 45 78 70 72 2c 0a 20 20 20 20 20 20  pNewExpr,.      
11030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11040 20 20 20 20 20 20 20 20 54 45 52 4d 5f 56 49 52          TERM_VIR
11050 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
11060 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20  C|TERM_VNULL);. 
11070 20 20 20 69 66 28 20 69 64 78 4e 65 77 20 29 7b     if( idxNew ){
11080 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20  .      pNewTerm 
11090 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
110a0 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  ];.      pNewTer
110b0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
110c0 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   0;.      pNewTe
110d0 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
110e0 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
110f0 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
11100 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
11110 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
11120 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65       pNewTerm->e
11130 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54  Operator = WO_GT
11140 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
11150 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ->iParent = idxT
11160 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
11170 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
11180 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  rm];.      pTerm
11190 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
111a0 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
111b0 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
111c0 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  D;.      pNewTer
111d0 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
111e0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b  Term->prereqAll;
111f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
11200 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
11210 4c 45 5f 53 54 41 54 20 2a 2f 0a 0a 20 20 2f 2a  LE_STAT */..  /*
11220 20 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75   Prevent ON clau
11230 73 65 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45  se terms of a LE
11240 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69  FT JOIN from bei
11250 6e 67 20 75 73 65 64 20 74 6f 20 64 72 69 76 65  ng used to drive
11260 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66  .  ** an index f
11270 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  or tables to the
11280 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69   left of the joi
11290 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d  n..  */.  pTerm-
112a0 3e 70 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20  >prereqRight |= 
112b0 65 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f  extraRight;.}../
112c0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
112d0 6f 6e 20 73 65 61 72 63 68 65 73 20 70 4c 69 73  on searches pLis
112e0 74 20 66 6f 72 20 61 20 65 6e 74 72 79 20 74 68  t for a entry th
112f0 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69  at matches the i
11300 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a  Col-th column.**
11310 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a   of index pIdx..
11320 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e  **.** If such an
11330 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
11340 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20  ound, its index 
11350 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73  in pList->a[] is
11360 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a   returned. If.**
11370 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69   no expression i
11380 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72  s found, -1 is r
11390 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
113a0 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78  ic int findIndex
113b0 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Col(.  Parse *pP
113c0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
113d0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
113e0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
113f0 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11410 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  Expression list 
11420 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
11430 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20  nt iBase,       
11440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11450 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62  * Cursor for tab
11460 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
11470 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64  th pIdx */.  Ind
11480 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
11490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
114a0 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63  Index to match c
114b0 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e  olumn of */.  in
114c0 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20  t iCol          
114d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
114e0 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   Column of index
114f0 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a   to match */.){.
11500 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
11510 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
11520 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c  Idx->azColl[iCol
11530 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ];..  for(i=0; i
11540 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
11550 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
11560 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
11570 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d  ipCollate(pList-
11580 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
11590 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
115a0 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70  COLUMN.     && p
115b0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d  ->iColumn==pIdx-
115c0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a  >aiColumn[iCol].
115d0 20 20 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c       && p->iTabl
115e0 65 3d 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a  e==iBase.    ){.
115f0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
11600 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
11610 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
11620 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
11630 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
11640 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 26 26  ALWAYS(pColl) &&
11650 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
11660 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
11670 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
11680 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20     return i;.   
11690 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
116a0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
116b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
116c0 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
116d0 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73  T expression-lis
116e0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
116f0 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a 2a  third argument.*
11700 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 0a  * is redundant..
11710 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e 43 54  **.** A DISTINCT
11720 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e 64 61   list is redunda
11730 6e 74 20 69 66 20 74 68 65 20 64 61 74 61 62 61  nt if the databa
11740 73 65 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  se contains some
11750 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 63 6f   subset of.** co
11760 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 75  lumns that are u
11770 6e 69 71 75 65 20 61 6e 64 20 6e 6f 6e 2d 6e 75  nique and non-nu
11780 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
11790 74 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75  t isDistinctRedu
117a0 6e 64 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  ndant(.  Parse *
117b0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
117c0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
117d0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
117e0 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
117f0 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
11800 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
11810 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
11820 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
11830 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
11840 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69  ExprList *pDisti
11850 6e 63 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65  nct       /* The
11860 20 72 65 73 75 6c 74 20 73 65 74 20 74 68 61 74   result set that
11870 20 6e 65 65 64 73 20 74 6f 20 62 65 20 44 49 53   needs to be DIS
11880 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61  TINCT */.){.  Ta
11890 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64  ble *pTab;.  Ind
118a0 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20  ex *pIdx;.  int 
118b0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
118c0 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69              .  i
118d0 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20  nt iBase;..  /* 
118e0 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65  If there is more
118f0 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20   than one table 
11900 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e  or sub-select in
11910 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
11920 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75   of.  ** this qu
11930 65 72 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  ery, then it wil
11940 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  l not be possibl
11950 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74  e to show that t
11960 68 65 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a  he DISTINCT .  *
11970 2a 20 63 6c 61 75 73 65 20 69 73 20 72 65 64 75  * clause is redu
11980 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ndant. */.  if( 
11990 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d  pTabList->nSrc!=
119a0 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
119b0 69 42 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74  iBase = pTabList
119c0 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a  ->a[0].iCursor;.
119d0 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
119e0 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20  t->a[0].pTab;.. 
119f0 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68   /* If any of th
11a00 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73  e expressions is
11a10 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f   an IPK column o
11a20 6e 20 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74  n table iBase, t
11a30 68 65 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a  hen return .  **
11a40 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65   true. Note: The
11a50 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61   (p->iTable==iBa
11a60 73 65 29 20 70 61 72 74 20 6f 66 20 74 68 69 73  se) part of this
11a70 20 74 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c   test may be fal
11a80 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63  se if the.  ** c
11a90 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73  urrent SELECT is
11aa0 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
11ab0 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  b-query..  */.  
11ac0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74  for(i=0; i<pDist
11ad0 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  inct->nExpr; i++
11ae0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
11af0 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
11b00 43 6f 6c 6c 61 74 65 28 70 44 69 73 74 69 6e 63  Collate(pDistinc
11b10 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
11b20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
11b30 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69  K_COLUMN && p->i
11b40 54 61 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20  Table==iBase && 
11b50 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72  p->iColumn<0 ) r
11b60 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
11b70 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
11b80 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74  all indices on t
11b90 68 65 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69  he table, checki
11ba0 6e 67 20 65 61 63 68 20 74 6f 20 73 65 65 20 69  ng each to see i
11bb0 66 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20  f it makes.  ** 
11bc0 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61  the DISTINCT qua
11bd0 6c 69 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74  lifier redundant
11be0 2e 20 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a  . It does so if:
11bf0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20  .  **.  **   1. 
11c00 54 68 65 20 69 6e 64 65 78 20 69 73 20 69 74 73  The index is its
11c10 65 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a  elf UNIQUE, and.
11c20 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41    **.  **   2. A
11c30 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ll of the column
11c40 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61  s in the index a
11c50 72 65 20 65 69 74 68 65 72 20 70 61 72 74 20 6f  re either part o
11c60 66 20 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a  f the pDistinct.
11c70 20 20 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20    **      list, 
11c80 6f 72 20 65 6c 73 65 20 74 68 65 20 57 48 45 52  or else the WHER
11c90 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
11ca0 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20  s a term of the 
11cb0 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20  form "col=X",.  
11cc0 2a 2a 20 20 20 20 20 20 77 68 65 72 65 20 58 20  **      where X 
11cd0 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61  is a constant va
11ce0 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69  lue. The collati
11cf0 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20  on sequences of 
11d00 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f  the.  **      co
11d10 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c  mparison and sel
11d20 65 63 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73  ect-list express
11d30 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20  ions must match 
11d40 74 68 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64  those of the ind
11d50 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ex..  **.  **   
11d60 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20  3. All of those 
11d70 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f  index columns fo
11d80 72 20 77 68 69 63 68 20 74 68 65 20 57 48 45 52  r which the WHER
11d90 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f  E clause does no
11da0 74 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74  t.  **      cont
11db0 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65  ain a "col=X" te
11dc0 72 6d 20 61 72 65 20 73 75 62 6a 65 63 74 20 74  rm are subject t
11dd0 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e  o a NOT NULL con
11de0 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20  straint..  */.  
11df0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
11e00 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
11e10 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
11e20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
11e30 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29  Error==OE_None )
11e40 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
11e50 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
11e60 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
11e70 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
11e80 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
11e90 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ];.      if( 0==
11ea0 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42  findTerm(pWC, iB
11eb0 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74  ase, iCol, ~(Bit
11ec0 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70  mask)0, WO_EQ, p
11ed0 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Idx) ){.        
11ee0 69 6e 74 20 69 49 64 78 43 6f 6c 20 3d 20 66 69  int iIdxCol = fi
11ef0 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61 72 73  ndIndexCol(pPars
11f00 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20 69 42  e, pDistinct, iB
11f10 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3b 0a 20  ase, pIdx, i);. 
11f20 20 20 20 20 20 20 20 69 66 28 20 69 49 64 78 43         if( iIdxC
11f30 6f 6c 3c 30 20 7c 7c 20 70 54 61 62 2d 3e 61 43  ol<0 || pTab->aC
11f40 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  ol[pIdx->aiColum
11f50 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  n[i]].notNull==0
11f60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
11f70 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
11f80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11f90 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 43   if( i==pIdx->nC
11fa0 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 2f  olumn ){.      /
11fb0 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70  * This index imp
11fc0 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 44 49  lies that the DI
11fd0 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
11fe0 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
11ff0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  /.      return 1
12000 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
12010 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a  eturn 0;.}../* .
12020 2a 2a 20 46 69 6e 64 20 28 61 6e 20 61 70 70 72  ** Find (an appr
12030 6f 78 69 6d 61 74 65 29 20 73 75 6d 20 6f 66 20  oximate) sum of 
12040 74 77 6f 20 57 68 65 72 65 43 6f 73 74 73 2e 20  two WhereCosts. 
12050 20 54 68 69 73 20 63 6f 6d 70 75 74 61 74 69 6f   This computatio
12060 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 61 20 73 69  n is.** not a si
12070 6d 70 6c 65 20 22 2b 22 20 6f 70 65 72 61 74 6f  mple "+" operato
12080 72 20 62 65 63 61 75 73 65 20 57 68 65 72 65 43  r because WhereC
12090 6f 73 74 20 69 73 20 73 74 6f 72 65 64 20 61 73  ost is stored as
120a0 20 61 20 6c 6f 67 61 72 69 74 68 6d 69 63 0a 2a   a logarithmic.*
120b0 2a 20 76 61 6c 75 65 2e 0a 2a 2a 20 0a 2a 2f 0a  * value..** .*/.
120c0 73 74 61 74 69 63 20 57 68 65 72 65 43 6f 73 74  static WhereCost
120d0 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 57 68   whereCostAdd(Wh
120e0 65 72 65 43 6f 73 74 20 61 2c 20 57 68 65 72 65  ereCost a, Where
120f0 43 6f 73 74 20 62 29 7b 0a 20 20 73 74 61 74 69  Cost b){.  stati
12100 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
12110 20 63 68 61 72 20 78 5b 5d 20 3d 20 7b 0a 20 20   char x[] = {.  
12120 20 20 20 31 30 2c 20 31 30 2c 20 20 20 20 20 20     10, 10,      
12130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12140 20 20 20 2f 2a 20 30 2c 31 20 2a 2f 0a 20 20 20     /* 0,1 */.   
12150 20 20 20 39 2c 20 39 2c 20 20 20 20 20 20 20 20     9, 9,        
12160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12170 20 20 2f 2a 20 32 2c 33 20 2a 2f 0a 20 20 20 20    /* 2,3 */.    
12180 20 20 38 2c 20 38 2c 20 20 20 20 20 20 20 20 20    8, 8,         
12190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121a0 20 2f 2a 20 34 2c 35 20 2a 2f 0a 20 20 20 20 20   /* 4,5 */.     
121b0 20 37 2c 20 37 2c 20 37 2c 20 20 20 20 20 20 20   7, 7, 7,       
121c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121d0 2f 2a 20 36 2c 37 2c 38 20 2a 2f 0a 20 20 20 20  /* 6,7,8 */.    
121e0 20 20 36 2c 20 36 2c 20 36 2c 20 20 20 20 20 20    6, 6, 6,      
121f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12200 20 2f 2a 20 39 2c 31 30 2c 31 31 20 2a 2f 0a 20   /* 9,10,11 */. 
12210 20 20 20 20 20 35 2c 20 35 2c 20 35 2c 20 20 20       5, 5, 5,   
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 31 32 2d 31 34 20 2a 2f 0a      /* 12-14 */.
12240 20 20 20 20 20 20 34 2c 20 34 2c 20 34 2c 20 34        4, 4, 4, 4
12250 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12260 20 20 20 20 20 2f 2a 20 31 35 2d 31 38 20 2a 2f       /* 15-18 */
12270 0a 20 20 20 20 20 20 33 2c 20 33 2c 20 33 2c 20  .      3, 3, 3, 
12280 33 2c 20 33 2c 20 33 2c 20 20 20 20 20 20 20 20  3, 3, 3,        
12290 20 20 20 20 20 20 2f 2a 20 31 39 2d 32 34 20 2a        /* 19-24 *
122a0 2f 0a 20 20 20 20 20 20 32 2c 20 32 2c 20 32 2c  /.      2, 2, 2,
122b0 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 20 20 20   2, 2, 2, 2,    
122c0 20 20 20 20 20 20 20 2f 2a 20 32 35 2d 33 31 20         /* 25-31 
122d0 2a 2f 0a 20 20 7d 3b 0a 20 20 69 66 28 20 61 3e  */.  };.  if( a>
122e0 3d 62 20 29 7b 0a 20 20 20 20 69 66 28 20 61 3e  =b ){.    if( a>
122f0 62 2b 34 39 20 29 20 72 65 74 75 72 6e 20 61 3b  b+49 ) return a;
12300 0a 20 20 20 20 69 66 28 20 61 3e 62 2b 33 31 20  .    if( a>b+31 
12310 29 20 72 65 74 75 72 6e 20 61 2b 31 3b 0a 20 20  ) return a+1;.  
12320 20 20 72 65 74 75 72 6e 20 61 2b 78 5b 61 2d 62    return a+x[a-b
12330 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
12340 69 66 28 20 62 3e 61 2b 34 39 20 29 20 72 65 74  if( b>a+49 ) ret
12350 75 72 6e 20 62 3b 0a 20 20 20 20 69 66 28 20 62  urn b;.    if( b
12360 3e 61 2b 33 31 20 29 20 72 65 74 75 72 6e 20 62  >a+31 ) return b
12370 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62  +1;.    return b
12380 2b 78 5b 62 2d 61 5d 3b 0a 20 20 7d 0a 7d 0a 0a  +x[b-a];.  }.}..
12390 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e  /*.** Convert an
123a0 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
123b0 57 68 65 72 65 43 6f 73 74 2e 20 20 49 6e 20 6f  WhereCost.  In o
123c0 74 68 65 72 20 77 6f 72 64 73 2c 20 63 6f 6d 70  ther words, comp
123d0 75 74 65 20 61 0a 2a 2a 20 67 6f 6f 64 20 61 70  ute a.** good ap
123e0 70 72 6f 78 69 6d 61 74 61 74 69 6f 6e 20 66 6f  proximatation fo
123f0 72 20 31 30 2a 6c 6f 67 32 28 78 29 2e 0a 2a 2f  r 10*log2(x)..*/
12400 0a 73 74 61 74 69 63 20 57 68 65 72 65 43 6f 73  .static WhereCos
12410 74 20 77 68 65 72 65 43 6f 73 74 28 74 52 6f 77  t whereCost(tRow
12420 63 6e 74 20 78 29 7b 0a 20 20 73 74 61 74 69 63  cnt x){.  static
12430 20 57 68 65 72 65 43 6f 73 74 20 61 5b 5d 20 3d   WhereCost a[] =
12440 20 7b 20 30 2c 20 32 2c 20 33 2c 20 35 2c 20 36   { 0, 2, 3, 5, 6
12450 2c 20 37 2c 20 38 2c 20 39 20 7d 3b 0a 20 20 57  , 7, 8, 9 };.  W
12460 68 65 72 65 43 6f 73 74 20 79 20 3d 20 34 30 3b  hereCost y = 40;
12470 0a 20 20 69 66 28 20 78 3c 38 20 29 7b 0a 20 20  .  if( x<8 ){.  
12480 20 20 69 66 28 20 78 3c 32 20 29 20 72 65 74 75    if( x<2 ) retu
12490 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28  rn 0;.    while(
124a0 20 78 3c 38 20 29 7b 20 20 79 20 2d 3d 20 31 30   x<8 ){  y -= 10
124b0 3b 20 78 20 3c 3c 3d 20 31 3b 20 7d 0a 20 20 7d  ; x <<= 1; }.  }
124c0 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
124d0 20 78 3e 32 35 35 20 29 7b 20 79 20 2b 3d 20 34   x>255 ){ y += 4
124e0 30 3b 20 78 20 3e 3e 3d 20 34 3b 20 7d 0a 20 20  0; x >>= 4; }.  
124f0 20 20 77 68 69 6c 65 28 20 78 3e 31 35 20 29 7b    while( x>15 ){
12500 20 20 79 20 2b 3d 20 31 30 3b 20 78 20 3e 3e 3d    y += 10; x >>=
12510 20 31 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75   1; }.  }.  retu
12520 72 6e 20 61 5b 78 26 37 5d 20 2b 20 79 20 2d 20  rn a[x&7] + y - 
12530 31 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  10;.}..#ifndef S
12540 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
12550 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 6f  ALTABLE./*.** Co
12560 6e 76 65 72 74 20 61 20 64 6f 75 62 6c 65 20 28  nvert a double (
12570 61 73 20 72 65 63 65 69 76 65 64 20 66 72 6f 6d  as received from
12580 20 78 42 65 73 74 49 6e 64 65 78 20 6f 66 20 61   xBestIndex of a
12590 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 29 0a   virtual table).
125a0 2a 2a 20 69 6e 74 6f 20 61 20 57 68 65 72 65 43  ** into a WhereC
125b0 6f 73 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ost.  In other w
125c0 6f 72 64 73 2c 20 63 6f 6d 70 75 74 65 20 61 6e  ords, compute an
125d0 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 66   approximation f
125e0 6f 72 0a 2a 2a 20 31 30 2a 6c 6f 67 32 28 78 29  or.** 10*log2(x)
125f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
12600 65 43 6f 73 74 20 77 68 65 72 65 43 6f 73 74 46  eCost whereCostF
12610 72 6f 6d 44 6f 75 62 6c 65 28 64 6f 75 62 6c 65  romDouble(double
12620 20 78 29 7b 0a 20 20 75 36 34 20 61 3b 0a 20 20   x){.  u64 a;.  
12630 57 68 65 72 65 43 6f 73 74 20 65 3b 0a 20 20 61  WhereCost e;.  a
12640 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29  ssert( sizeof(x)
12650 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 61 29  ==8 && sizeof(a)
12660 3d 3d 38 20 29 3b 0a 20 20 69 66 28 20 78 3c 3d  ==8 );.  if( x<=
12670 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
12680 69 66 28 20 78 3c 3d 32 30 30 30 30 30 30 30 30  if( x<=200000000
12690 30 20 29 20 72 65 74 75 72 6e 20 77 68 65 72 65  0 ) return where
126a0 43 6f 73 74 28 28 74 52 6f 77 63 6e 74 29 78 29  Cost((tRowcnt)x)
126b0 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61 2c 20 26  ;.  memcpy(&a, &
126c0 78 2c 20 38 29 3b 0a 20 20 65 20 3d 20 28 61 3e  x, 8);.  e = (a>
126d0 3e 35 32 29 20 2d 20 31 30 32 32 3b 0a 20 20 72  >52) - 1022;.  r
126e0 65 74 75 72 6e 20 65 2a 31 30 3b 0a 7d 0a 23 65  eturn e*10;.}.#e
126f0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
12700 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
12710 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d   */../*.** Estim
12720 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69 74 68  ate the logarith
12730 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76  m of the input v
12740 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32 2e 0a  alue to base 2..
12750 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 43  */.static WhereC
12760 6f 73 74 20 65 73 74 4c 6f 67 28 57 68 65 72 65  ost estLog(Where
12770 43 6f 73 74 20 4e 29 7b 0a 20 20 57 68 65 72 65  Cost N){.  Where
12780 43 6f 73 74 20 78 20 3d 20 77 68 65 72 65 43 6f  Cost x = whereCo
12790 73 74 28 4e 29 3b 0a 20 20 72 65 74 75 72 6e 20  st(N);.  return 
127a0 78 3e 33 33 20 3f 20 78 20 2d 20 33 33 20 3a 20  x>33 ? x - 33 : 
127b0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20  0;.}../*.** Two 
127c0 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69  routines for pri
127d0 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  nting the conten
127e0 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f  t of an sqlite3_
127f0 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74  index_info.** st
12800 72 75 63 74 75 72 65 2e 20 20 55 73 65 64 20 66  ructure.  Used f
12810 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
12820 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20  ebugging only.  
12830 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51  If neither.** SQ
12840 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c  LITE_TEST or SQL
12850 49 54 45 5f 44 45 42 55 47 20 61 72 65 20 64 65  ITE_DEBUG are de
12860 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73  fined, then thes
12870 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72  e routines.** ar
12880 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66  e no-ops..*/.#if
12890 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
128a0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
128b0 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 57  LE) && defined(W
128c0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
128d0 44 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54  D).static void T
128e0 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
128f0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
12900 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  fo *p){.  int i;
12910 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57  .  if( !sqlite3W
12920 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75  hereTrace ) retu
12930 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
12940 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
12950 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
12960 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
12970 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a   constraint[%d]:
12980 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25   col=%d termid=%
12990 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d  d op=%d usabled=
129a0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
129b0 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
129c0 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d  traint[i].iColum
129d0 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  n,.       p->aCo
129e0 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72  nstraint[i].iTer
129f0 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20  mOffset,.       
12a00 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
12a10 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e  ].op,.       p->
12a20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75  aConstraint[i].u
12a30 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f  sable);.  }.  fo
12a40 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64  r(i=0; i<p->nOrd
12a50 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
12a60 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
12a70 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64  tf("  orderby[%d
12a80 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25  ]: col=%d desc=%
12a90 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
12aa0 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72         p->aOrder
12ab0 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20  By[i].iColumn,. 
12ac0 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42        p->aOrderB
12ad0 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a  y[i].desc);.  }.
12ae0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52  }.static void TR
12af0 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
12b00 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
12b10 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  fo *p){.  int i;
12b20 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57  .  if( !sqlite3W
12b30 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75  hereTrace ) retu
12b40 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
12b50 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
12b60 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
12b70 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
12b80 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76   usage[%d]: argv
12b90 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e  Idx=%d omit=%d\n
12ba0 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
12bb0 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
12bc0 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49  ntUsage[i].argvI
12bd0 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e  ndex,.       p->
12be0 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
12bf0 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20  [i].omit);.  }. 
12c00 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
12c10 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64  ntf("  idxNum=%d
12c20 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b  \n", p->idxNum);
12c30 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
12c40 72 69 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d  rintf("  idxStr=
12c50 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72  %s\n", p->idxStr
12c60 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
12c70 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72  gPrintf("  order
12c80 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22  ByConsumed=%d\n"
12c90 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  , p->orderByCons
12ca0 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  umed);.  sqlite3
12cb0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65  DebugPrintf("  e
12cc0 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c  stimatedCost=%g\
12cd0 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64  n", p->estimated
12ce0 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  Cost);.}.#else.#
12cf0 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
12d00 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69  _INPUTS(A).#defi
12d10 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  ne TRACE_IDX_OUT
12d20 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a  PUTS(A).#endif..
12d30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12d40 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
12d50 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  DEX./*.** Return
12d60 20 54 52 55 45 20 69 66 20 74 68 65 20 57 48 45   TRUE if the WHE
12d70 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  RE clause term p
12d80 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72  Term is of a for
12d90 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f  m where it.** co
12da0 75 6c 64 20 62 65 20 75 73 65 64 20 77 69 74 68  uld be used with
12db0 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63   an index to acc
12dc0 65 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69  ess pSrc, assumi
12dd0 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ng an appropriat
12de0 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74  e.** index exist
12df0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
12e00 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  t termCanDriveIn
12e10 64 65 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d  dex(.  WhereTerm
12e20 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *pTerm,        
12e30 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63        /* WHERE c
12e40 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68  lause term to ch
12e50 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  eck */.  struct 
12e60 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
12e70 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  rc,     /* Table
12e80 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
12e90 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69  o access */.  Bi
12ea0 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20  tmask notReady  
12eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12ec0 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20  Tables in outer 
12ed0 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69  loops of the joi
12ee0 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61  n */.){.  char a
12ef0 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d  ff;.  if( pTerm-
12f00 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72  >leftCursor!=pSr
12f10 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74  c->iCursor ) ret
12f20 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54  urn 0;.  if( (pT
12f30 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
12f40 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20 72 65 74   WO_EQ)==0 ) ret
12f50 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54  urn 0;.  if( (pT
12f60 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
12f70 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
12f80 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
12f90 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  ( pTerm->u.leftC
12fa0 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e  olumn<0 ) return
12fb0 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63   0;.  aff = pSrc
12fc0 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65  ->pTab->aCol[pTe
12fd0 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
12fe0 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66  ].affinity;.  if
12ff0 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
13000 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d  ffinityOk(pTerm-
13010 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72  >pExpr, aff) ) r
13020 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
13030 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 1;.}.#endif...
13040 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13050 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
13060 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  DEX./*.** Genera
13070 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74  te code to const
13080 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f  ruct the Index o
13090 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74  bject for an aut
130a0 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20  omatic index.** 
130b0 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74 68  and to set up th
130c0 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a  e WhereLevel obj
130d0 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68  ect pLevel so th
130e0 61 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  at the code gene
130f0 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75  rator.** makes u
13100 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61  se of the automa
13110 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  tic index..*/.st
13120 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72  atic void constr
13130 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  uctAutomaticInde
13140 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
13150 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
13160 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
13170 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
13180 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
13190 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
131a0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
131b0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
131c0 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a  _item *pSrc,  /*
131d0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
131e0 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65   term to get the
131f0 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20   next index */. 
13200 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
13210 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
13220 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  Mask of cursors 
13230 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61  that are not ava
13240 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72  ilable */.  Wher
13250 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20  eLevel *pLevel  
13260 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
13270 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65 20   new index here 
13280 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c  */.){.  int nCol
13290 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  umn;            
132a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
132b0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
132c0 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65  constructed inde
132d0 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  x */.  WhereTerm
132e0 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
132f0 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
13300 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
13310 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
13320 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20  reTerm *pWCEnd; 
13330 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
13340 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20  of pWC->a[] */. 
13350 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
13360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13370 42 79 74 65 20 6f 66 20 6d 65 6d 6f 72 79 20 6e  Byte of memory n
13380 65 65 64 65 64 20 66 6f 72 20 70 49 64 78 20 2a  eeded for pIdx *
13390 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
133a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133b0 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69  /* Object descri
133c0 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65  bing the transie
133d0 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64  nt index */.  Vd
133e0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
133f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
13400 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
13410 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
13420 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  on */.  int addr
13430 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
13440 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
13450 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  f the initializa
13460 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70  tion bypass jump
13470 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
13480 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
13490 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62    /* The table b
134a0 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a  eing indexed */.
134b0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 69    KeyInfo *pKeyi
134c0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nfo;          /*
134d0 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   Key information
134e0 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a   for the index *
134f0 2f 20 20 20 0a 20 20 69 6e 74 20 61 64 64 72 54  /   .  int addrT
13500 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
13510 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
13520 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70   index fill loop
13530 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
13540 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ord;            
13550 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
13560 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72  lding an index r
13570 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecord */.  int n
13580 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13590 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
135a0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
135b0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
135c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
135d0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
135e0 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20  nt mxBitCol;    
135f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
13600 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20  ximum column in 
13610 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f  pSrc->colUsed */
13620 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
13630 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
13640 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
13650 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c  ence to on a col
13660 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  umn */.  WhereLo
13670 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
13680 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70       /* The Loop
13690 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 42 69 74   object */.  Bit
136a0 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20  mask idxCols;   
136b0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d           /* Bitm
136c0 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73  ap of columns us
136d0 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20  ed for indexing 
136e0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74  */.  Bitmask ext
136f0 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20  raCols;         
13700 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64   /* Bitmap of ad
13710 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73  ditional columns
13720 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57 61 72   */.  u8 sentWar
13730 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20  ning = 0;       
13740 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 77    /* True if a w
13750 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65 65 6e  arnning has been
13760 20 69 73 73 75 65 64 20 2a 2f 0a 0a 20 20 2f 2a   issued */..  /*
13770 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
13780 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20  o skip over the 
13790 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69  creation and ini
137a0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
137b0 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e  he.  ** transien
137c0 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61  t index on 2nd a
137d0 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 69 74  nd subsequent it
137e0 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  erations of the 
137f0 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70  loop. */.  v = p
13800 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
13810 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
13820 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c    addrInit = sql
13830 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
13840 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  rse);..  /* Coun
13850 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
13860 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c  columns that wil
13870 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  l be added to th
13880 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64  e index.  ** and
13890 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20 57   used to match W
138a0 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
138b0 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 43 6f  traints */.  nCo
138c0 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 70 54 61 62  lumn = 0;.  pTab
138d0 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  le = pSrc->pTab;
138e0 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43  .  pWCEnd = &pWC
138f0 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b  ->a[pWC->nTerm];
13900 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
13910 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 64 78  l->pWLoop;.  idx
13920 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Cols = 0;.  for(
13930 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
13940 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72  erm<pWCEnd; pTer
13950 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65  m++){.    if( te
13960 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
13970 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74  pTerm, pSrc, not
13980 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20  Ready) ){.      
13990 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d  int iCol = pTerm
139a0 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
139b0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d        Bitmask cM
139c0 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20  ask = iCol>=BMS 
139d0 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  ? MASKBIT(BMS-1)
139e0 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29   : MASKBIT(iCol)
139f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13a00 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ( iCol==BMS );. 
13a10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
13a20 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
13a30 20 20 20 20 69 66 28 20 21 73 65 6e 74 57 61 72      if( !sentWar
13a40 6e 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  ning ){.        
13a50 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
13a60 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49  TE_WARNING_AUTOI
13a70 4e 44 45 58 2c 0a 20 20 20 20 20 20 20 20 20 20  NDEX,.          
13a80 20 20 22 61 75 74 6f 6d 61 74 69 63 20 69 6e 64    "automatic ind
13a90 65 78 20 6f 6e 20 25 73 28 25 73 29 22 2c 20 70  ex on %s(%s)", p
13aa0 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  Table->zName,.  
13ab0 20 20 20 20 20 20 20 20 20 20 70 54 61 62 6c 65            pTable
13ac0 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
13ad0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6e  me);.        sen
13ae0 74 57 61 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20  tWarning = 1;.  
13af0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
13b00 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b  (idxCols & cMask
13b10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
13b20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
13b30 69 7a 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ize(pParse->db, 
13b40 70 4c 6f 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2b 31  pLoop, nColumn+1
13b50 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ) ) return;.    
13b60 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
13b70 6d 5b 6e 43 6f 6c 75 6d 6e 2b 2b 5d 20 3d 20 70  m[nColumn++] = p
13b80 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 64  Term;.        id
13b90 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a  xCols |= cMask;.
13ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13bb0 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c  }.  assert( nCol
13bc0 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70  umn>0 );.  pLoop
13bd0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
13be0 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
13bf0 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 4c 6f 6f 70  nColumn;.  pLoop
13c00 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
13c10 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48  E_COLUMN_EQ | WH
13c20 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57  ERE_IDX_ONLY | W
13c30 48 45 52 45 5f 49 4e 44 45 58 45 44 0a 20 20 20  HERE_INDEXED.   
13c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c50 20 20 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f 49    | WHERE_AUTO_I
13c60 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  NDEX;..  /* Coun
13c70 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
13c80 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
13c90 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65  ns needed to cre
13ca0 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72  ate a.  ** cover
13cb0 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63  ing index.  A "c
13cc0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69  overing index" i
13cd0 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  s an index that 
13ce0 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a  contains all.  *
13cf0 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61  * columns that a
13d00 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  re needed by the
13d10 20 71 75 65 72 79 2e 20 20 57 69 74 68 20 61 20   query.  With a 
13d20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20  covering index, 
13d30 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61  the.  ** origina
13d40 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65  l table never ne
13d50 65 64 73 20 74 6f 20 62 65 20 61 63 63 65 73 73  eds to be access
13d60 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69  ed.  Automatic i
13d70 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a  ndices must.  **
13d80 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69   be a covering i
13d90 6e 64 65 78 20 62 65 63 61 75 73 65 20 74 68 65  ndex because the
13da0 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20   index will not 
13db0 62 65 20 75 70 64 61 74 65 64 20 69 66 20 74 68  be updated if th
13dc0 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  e.  ** original 
13dd0 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e  table changes an
13de0 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  d the index and 
13df0 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74  table cannot bot
13e00 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69  h be used.  ** i
13e10 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66  f they go out of
13e20 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78   sync..  */.  ex
13e30 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e  traCols = pSrc->
13e40 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43  colUsed & (~idxC
13e50 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d  ols | MASKBIT(BM
13e60 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f  S-1));.  mxBitCo
13e70 6c 20 3d 20 28 70 54 61 62 6c 65 2d 3e 6e 43 6f  l = (pTable->nCo
13e80 6c 20 3e 3d 20 42 4d 53 2d 31 29 20 3f 20 42 4d  l >= BMS-1) ? BM
13e90 53 2d 31 20 3a 20 70 54 61 62 6c 65 2d 3e 6e 43  S-1 : pTable->nC
13ea0 6f 6c 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  ol;.  testcase( 
13eb0 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d  pTable->nCol==BM
13ec0 53 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73  S-1 );.  testcas
13ed0 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d  e( pTable->nCol=
13ee0 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28  =BMS-2 );.  for(
13ef0 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b  i=0; i<mxBitCol;
13f00 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65   i++){.    if( e
13f10 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42  xtraCols & MASKB
13f20 49 54 28 69 29 20 29 20 6e 43 6f 6c 75 6d 6e 2b  IT(i) ) nColumn+
13f30 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72  +;.  }.  if( pSr
13f40 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53  c->colUsed & MAS
13f50 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20  KBIT(BMS-1) ){. 
13f60 20 20 20 6e 43 6f 6c 75 6d 6e 20 2b 3d 20 70 54     nColumn += pT
13f70 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53  able->nCol - BMS
13f80 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 6f 6f   + 1;.  }.  pLoo
13f90 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  p->wsFlags |= WH
13fa0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20  ERE_COLUMN_EQ | 
13fb0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
13fc0 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
13fd0 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
13fe0 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 69   to describe thi
13ff0 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 6e 42 79  s index */.  nBy
14000 74 65 20 3d 20 73 69 7a 65 6f 66 28 49 6e 64 65  te = sizeof(Inde
14010 78 29 3b 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e  x);.  nByte += n
14020 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 69 6e  Column*sizeof(in
14030 74 29 3b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  t);     /* Index
14040 2e 61 69 43 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 6e  .aiColumn */.  n
14050 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a  Byte += nColumn*
14060 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 3b 20 20  sizeof(char*);  
14070 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c   /* Index.azColl
14080 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e   */.  nByte += n
14090 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
140a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
140b0 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20  .aSortOrder */. 
140c0 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 44   pIdx = sqlite3D
140d0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
140e0 73 65 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a  se->db, nByte);.
140f0 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20    if( pIdx==0 ) 
14100 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 6f 70 2d  return;.  pLoop-
14110 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
14120 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e  = pIdx;.  pIdx->
14130 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a  azColl = (char**
14140 29 26 70 49 64 78 5b 31 5d 3b 0a 20 20 70 49 64  )&pIdx[1];.  pId
14150 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69  x->aiColumn = (i
14160 6e 74 2a 29 26 70 49 64 78 2d 3e 61 7a 43 6f 6c  nt*)&pIdx->azCol
14170 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49  l[nColumn];.  pI
14180 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  dx->aSortOrder =
14190 20 28 75 38 2a 29 26 70 49 64 78 2d 3e 61 69 43   (u8*)&pIdx->aiC
141a0 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a  olumn[nColumn];.
141b0 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20    pIdx->zName = 
141c0 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20 20  "auto-index";.  
141d0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20  pIdx->nColumn = 
141e0 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 49 64 78 2d  nColumn;.  pIdx-
141f0 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65  >pTable = pTable
14200 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78  ;.  n = 0;.  idx
14210 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Cols = 0;.  for(
14220 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
14230 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72  erm<pWCEnd; pTer
14240 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65  m++){.    if( te
14250 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
14260 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74  pTerm, pSrc, not
14270 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20  Ready) ){.      
14280 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d  int iCol = pTerm
14290 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
142a0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d        Bitmask cM
142b0 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20  ask = iCol>=BMS 
142c0 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  ? MASKBIT(BMS-1)
142d0 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29   : MASKBIT(iCol)
142e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
142f0 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ( iCol==BMS-1 );
14300 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14310 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20   iCol==BMS );.  
14320 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73      if( (idxCols
14330 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   & cMask)==0 ){.
14340 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58          Expr *pX
14350 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
14360 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73  .        idxCols
14370 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20   |= cMask;.     
14380 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
14390 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  n[n] = pTerm->u.
143a0 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
143b0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
143c0 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
143d0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
143e0 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70  pX->pLeft, pX->p
143f0 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
14400 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
14410 3d 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20  = ALWAYS(pColl) 
14420 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a  ? pColl->zName :
14430 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20   "BINARY";.     
14440 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     n++;.      }.
14450 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
14460 72 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f  rt( (u32)n==pLoo
14470 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29  p->u.btree.nEq )
14480 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69  ;..  /* Add addi
14490 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e  tional columns n
144a0 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68  eeded to make th
144b0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
144c0 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f  x into.  ** a co
144d0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  vering index */.
144e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42    for(i=0; i<mxB
144f0 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  itCol; i++){.   
14500 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26   if( extraCols &
14510 20 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20   MASKBIT(i) ){. 
14520 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
14530 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[n] = i;.    
14540 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
14550 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  ] = "BINARY";.  
14560 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
14570 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
14580 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
14590 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66  (BMS-1) ){.    f
145a0 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54  or(i=BMS-1; i<pT
145b0 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  able->nCol; i++)
145c0 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69  {.      pIdx->ai
145d0 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20  Column[n] = i;. 
145e0 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
145f0 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b  l[n] = "BINARY";
14600 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
14610 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
14620 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20  n==nColumn );.. 
14630 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 61   /* Create the a
14640 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a  utomatic index *
14650 2f 0a 20 20 70 4b 65 79 69 6e 66 6f 20 3d 20 73  /.  pKeyinfo = s
14660 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
14670 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
14680 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 76  ;.  assert( pLev
14690 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29  el->iIdxCur>=0 )
146a0 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ;.  pLevel->iIdx
146b0 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Cur = pParse->nT
146c0 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56  ab++;.  sqlite3V
146d0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
146e0 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70  OpenAutoindex, p
146f0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20  Level->iIdxCur, 
14700 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c 0a 20 20  nColumn+1, 0,.  
14710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14720 20 20 28 63 68 61 72 2a 29 70 4b 65 79 69 6e 66    (char*)pKeyinf
14730 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
14740 4e 44 4f 46 46 29 3b 0a 20 20 56 64 62 65 43 6f  NDOFF);.  VdbeCo
14750 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72 20 25  mment((v, "for %
14760 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  s", pTable->zNam
14770 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  e));..  /* Fill 
14780 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
14790 64 65 78 20 77 69 74 68 20 63 6f 6e 74 65 6e 74  dex with content
147a0 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20   */.  addrTop = 
147b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
147c0 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
147d0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29  pLevel->iTabCur)
147e0 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20  ;.  regRecord = 
147f0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
14800 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
14810 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
14820 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 64  xKey(pParse, pId
14830 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  x, pLevel->iTabC
14840 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 31  ur, regRecord, 1
14850 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
14860 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14870 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65  IdxInsert, pLeve
14880 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52  l->iIdxCur, regR
14890 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
148a0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
148b0 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
148c0 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65  ESULT);.  sqlite
148d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
148e0 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e  P_Next, pLevel->
148f0 69 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70  iTabCur, addrTop
14900 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  +1);.  sqlite3Vd
14910 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
14920 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
14930 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71  AUTOINDEX);.  sq
14940 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
14950 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  e(v, addrTop);. 
14960 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
14970 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
14980 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20  egRecord);.  .  
14990 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65  /* Jump here whe
149a0 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  n skipping the i
149b0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f  nitialization */
149c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
149d0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e  mpHere(v, addrIn
149e0 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  it);.}.#endif /*
149f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
14a00 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
14a10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14a20 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
14a30 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  E./*.** Allocate
14a40 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e   and populate an
14a50 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
14a60 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49  nfo structure. I
14a70 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
14a80 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
14a90 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
14aa0 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20  ntually release 
14ab0 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  the structure.**
14ac0 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20   by passing the 
14ad0 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
14ae0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
14af0 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65  n to sqlite3_fre
14b00 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  e()..*/.static s
14b10 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
14b20 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78  o *allocateIndex
14b30 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70  Info(.  Parse *p
14b40 50 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c  Parse,.  WhereCl
14b50 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 73 74 72  ause *pWC,.  str
14b60 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
14b70 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69   *pSrc,.  ExprLi
14b80 73 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a  st *pOrderBy.){.
14b90 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
14ba0 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63  t nTerm;.  struc
14bb0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
14bc0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78  constraint *pIdx
14bd0 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
14be0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
14bf0 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42  erby *pIdxOrderB
14c00 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  y;.  struct sqli
14c10 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
14c20 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
14c30 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ge;.  WhereTerm 
14c40 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f  *pTerm;.  int nO
14c50 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65  rderBy;.  sqlite
14c60 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
14c70 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f  dxInfo;..  /* Co
14c80 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
14c90 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45  f possible WHERE
14ca0 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
14cb0 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20  nts referring.  
14cc0 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74 75  ** to this virtu
14cd0 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f  al table */.  fo
14ce0 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65  r(i=nTerm=0, pTe
14cf0 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
14d00 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
14d10 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
14d20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
14d30 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  r != pSrc->iCurs
14d40 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  or ) continue;. 
14d50 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77     assert( IsPow
14d60 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65  erOfTwo(pTerm->e
14d70 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45  Operator & ~WO_E
14d80 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73  QUIV) );.    tes
14d90 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
14da0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
14db0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
14dc0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
14dd0 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
14de0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
14df0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
14e00 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e  ISNULL) ) contin
14e10 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
14e20 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
14e30 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
14e40 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b  ue;.    nTerm++;
14e50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
14e60 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
14e70 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
14e80 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63  columns in the c
14e90 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72  urrent .  ** vir
14ea0 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20  tual table then 
14eb0 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
14ec0 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79 20  or the aOrderBy 
14ed0 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65  part of.  ** the
14ee0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
14ef0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20  nfo structure.. 
14f00 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   */.  nOrderBy =
14f10 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72   0;.  if( pOrder
14f20 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  By ){.    int n 
14f30 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
14f40 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  r;.    for(i=0; 
14f50 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
14f60 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
14f70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
14f80 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
14f90 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
14fa0 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  UMN || pExpr->iT
14fb0 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72  able!=pSrc->iCur
14fc0 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
14fd0 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 29   }.    if( i==n)
14fe0 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79  {.      nOrderBy
14ff0 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = n;.    }.  }.
15000 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  /* Allocate t
15010 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
15020 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  _info structure.
15030 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20    */.  pIdxInfo 
15040 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
15050 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
15060 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e  , sizeof(*pIdxIn
15070 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo).            
15080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
15090 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f   (sizeof(*pIdxCo
150a0 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55  ns) + sizeof(*pU
150b0 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20  sage))*nTerm.   
150c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150d0 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66          + sizeof
150e0 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e  (*pIdxOrderBy)*n
150f0 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66 28  OrderBy );.  if(
15100 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a   pIdxInfo==0 ){.
15110 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
15120 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74  Msg(pParse, "out
15130 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20   of memory");.  
15140 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
15150 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
15160 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20   the structure. 
15170 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
15180 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
15190 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20  e contains.  ** 
151a0 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74  many fields that
151b0 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22 63   are declared "c
151c0 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74  onst" to prevent
151d0 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d   xBestIndex from
151e0 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74  .  ** changing t
151f0 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f  hem.  We have to
15200 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63   do some funky c
15210 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20  asting in order 
15220 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  to.  ** initiali
15230 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e  ze those fields.
15240 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73  .  */.  pIdxCons
15250 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
15260 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
15270 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31  int*)&pIdxInfo[1
15280 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79  ];.  pIdxOrderBy
15290 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
152a0 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
152b0 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72  *)&pIdxCons[nTer
152c0 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28  m];.  pUsage = (
152d0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
152e0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
152f0 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65  usage*)&pIdxOrde
15300 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20  rBy[nOrderBy];. 
15310 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66   *(int*)&pIdxInf
15320 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->nConstraint =
15330 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a   nTerm;.  *(int*
15340 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64  )&pIdxInfo->nOrd
15350 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b  erBy = nOrderBy;
15360 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
15370 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
15380 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
15390 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  ->aConstraint = 
153a0 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74  pIdxCons;.  *(st
153b0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
153c0 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49  ex_orderby**)&pI
153d0 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79  dxInfo->aOrderBy
153e0 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a   = pIdxOrderBy;.
153f0 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
15400 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
15410 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64  int_usage**)&pId
15420 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
15430 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20  ntUsage =.      
15440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15470 20 20 20 20 20 20 20 20 20 20 20 20 20 70 55 73               pUs
15480 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d  age;..  for(i=j=
15490 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
154a0 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
154b0 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
154c0 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 69 66 28    u8 op;.    if(
154d0 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
154e0 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72  or != pSrc->iCur
154f0 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  sor ) continue;.
15500 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f      assert( IsPo
15510 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e  werOfTwo(pTerm->
15520 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f  eOperator & ~WO_
15530 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65  EQUIV) );.    te
15540 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
15550 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
15560 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
15570 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
15580 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
15590 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
155a0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
155b0 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69  _ISNULL) ) conti
155c0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
155d0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
155e0 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  RM_VNULL ) conti
155f0 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  nue;.    pIdxCon
15600 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  s[j].iColumn = p
15610 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
15620 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  mn;.    pIdxCons
15630 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20  [j].iTermOffset 
15640 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75  = i;.    op = (u
15650 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  8)pTerm->eOperat
15660 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20  or & WO_ALL;.   
15670 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29   if( op==WO_IN )
15680 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20   op = WO_EQ;.   
15690 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20   pIdxCons[j].op 
156a0 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65  = op;.    /* The
156b0 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65   direct assignme
156c0 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  nt in the previo
156d0 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69  us line is possi
156e0 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65  ble only because
156f0 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20  .    ** the WO_ 
15700 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  and SQLITE_INDEX
15710 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64  _CONSTRAINT_ cod
15720 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  es are identical
15730 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f  .  The.    ** fo
15740 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
15750 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74  verify this fact
15760 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
15770 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49   WO_EQ==SQLITE_I
15780 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
15790 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
157a0 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_LT==SQLITE_
157b0 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
157c0 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LT );.    asser
157d0 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45  t( WO_LE==SQLITE
157e0 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
157f0 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65  T_LE );.    asse
15800 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54  rt( WO_GT==SQLIT
15810 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
15820 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73  NT_GT );.    ass
15830 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49  ert( WO_GE==SQLI
15840 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
15850 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73  INT_GE );.    as
15860 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d  sert( WO_MATCH==
15870 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
15880 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b  STRAINT_MATCH );
15890 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
158a0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
158b0 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f  (WO_IN|WO_EQ|WO_
158c0 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
158d0 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29  O_GE|WO_MATCH) )
158e0 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    j++;.  }. 
158f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
15900 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
15910 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
15920 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
15930 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  pr;.    pIdxOrde
15940 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  rBy[i].iColumn =
15950 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
15960 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
15970 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65  [i].desc = pOrde
15980 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
15990 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
159a0 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a  rn pIdxInfo;.}..
159b0 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  /*.** The table 
159c0 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65  object reference
159d0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
159e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
159f0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  o this function.
15a00 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e  ** must represen
15a10 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
15a20 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
15a30 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65   invokes the xBe
15a40 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74  stIndex().** met
15a50 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
15a60 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  al table with th
15a70 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
15a80 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  info object that
15a90 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20  .** comes in as 
15aa0 74 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74  the 3rd argument
15ab0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
15ac0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  n..**.** If an e
15ad0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61  rror occurs, pPa
15ae0 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64  rse is populated
15af0 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d   with an error m
15b00 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20  essage and a.** 
15b10 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
15b20 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
15b30 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
15b40 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74  rned and the out
15b50 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74  put.** part of t
15b60 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
15b70 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
15b80 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65  is left populate
15b90 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  d..**.** Whether
15ba0 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   or not an error
15bb0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
15bc0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
15bd0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
15be0 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
15bf0 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64  ually free p->id
15c00 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54  xStr if p->needT
15c10 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69  oFreeIdxStr indi
15c20 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68  cates.** that th
15c30 69 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  is is required..
15c40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74  */.static int vt
15c50 61 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73  abBestIndex(Pars
15c60 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
15c70 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f   *pTab, sqlite3_
15c80 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
15c90 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
15ca0 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47  pVtab = sqlite3G
15cb0 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d  etVTable(pParse-
15cc0 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61  >db, pTab)->pVta
15cd0 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
15ce0 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49  t rc;..  TRACE_I
15cf0 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20  DX_INPUTS(p);.  
15d00 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  rc = pVtab->pMod
15d10 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28  ule->xBestIndex(
15d20 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41  pVtab, p);.  TRA
15d30 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70  CE_IDX_OUTPUTS(p
15d40 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
15d50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
15d60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
15d70 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MEM ){.      pPa
15d80 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
15d90 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  ailed = 1;.    }
15da0 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d  else if( !pVtab-
15db0 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
15dc0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15dd0 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
15de0 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
15df0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
15e00 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
15e10 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
15e20 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ", pVtab->zErrMs
15e30 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
15e40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
15e50 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
15e60 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
15e70 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
15e80 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
15e90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
15ea0 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  !p->aConstraint[
15eb0 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e  i].usable && p->
15ec0 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
15ed0 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
15ee0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15ef0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15f00 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62   .          "tab
15f10 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65  le %s: xBestInde
15f20 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e  x returned an in
15f30 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61  valid plan", pTa
15f40 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
15f50 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
15f60 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23  Parse->nErr;.}.#
15f70 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
15f80 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
15f90 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
15fa0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
15fb0 4e 41 42 4c 45 5f 53 54 41 54 34 0a 2f 2a 0a 2a  NABLE_STAT4./*.*
15fc0 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c  * Estimate the l
15fd0 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72  ocation of a par
15fe0 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e  ticular key amon
15ff0 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e  g all keys in an
16000 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72  .** index.  Stor
16010 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
16020 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77   aStat as follow
16030 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61  s:.**.**    aSta
16040 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[0]      Est. n
16050 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65  umber of rows le
16060 73 73 20 74 68 61 6e 20 70 56 61 6c 0a 2a 2a 20  ss than pVal.** 
16070 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20     aStat[1]     
16080 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
16090 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70 56  rows equal to pV
160a0 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  al.**.** Return 
160b0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
160c0 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cess..*/.static 
160d0 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74 61 74  int whereKeyStat
160e0 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
160f0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
16100 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
16110 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  nection */.  Ind
16120 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
16130 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
16140 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f  x to consider do
16150 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55 6e 70  main of */.  Unp
16160 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65  ackedRecord *pRe
16170 63 2c 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74  c,       /* Vect
16180 6f 72 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20  or of values to 
16190 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69 6e  consider */.  in
161a0 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20 20  t roundUp,      
161b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 75            /* Rou
161c0 6e 64 20 75 70 20 69 66 20 74 72 75 65 2e 20 20  nd up if true.  
161d0 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20 66 61  Round down if fa
161e0 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  lse */.  tRowcnt
161f0 20 2a 61 53 74 61 74 20 20 20 20 20 20 20 20 20   *aStat         
16200 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74 61       /* OUT: sta
16210 74 73 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ts written here 
16220 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53 61 6d  */.){.  IndexSam
16230 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70  ple *aSample = p
16240 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20  Idx->aSample;.  
16250 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52 65 63 2d  int iCol = pRec-
16260 3e 6e 46 69 65 6c 64 2d 31 3b 20 20 2f 2a 20 49  >nField-1;  /* I
16270 6e 64 65 78 20 6f 66 20 72 65 71 75 69 72 65 64  ndex of required
16280 20 73 74 61 74 73 20 69 6e 20 61 6e 45 71 5b 5d   stats in anEq[]
16290 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   etc. */.  int i
162a0 4d 69 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Min = 0;        
162b0 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65         /* Smalle
162c0 73 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20 79 65  st sample not ye
162d0 74 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e  t tested */.  in
162e0 74 20 69 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d  t i = pIdx->nSam
162f0 70 6c 65 3b 20 20 20 20 20 20 2f 2a 20 53 6d 61  ple;      /* Sma
16300 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c 61 72  llest sample lar
16310 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ger than or equa
16320 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 69  l to pRec */.  i
16330 6e 74 20 69 54 65 73 74 3b 20 20 20 20 20 20 20  nt iTest;       
16340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
16350 78 74 20 73 61 6d 70 6c 65 20 74 6f 20 74 65 73  xt sample to tes
16360 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20  t */.  int res; 
16370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16380 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
16390 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
163a0 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tion */..  asser
163b0 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  t( pIdx->nSample
163c0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
163d0 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20 26  pRec->nField>0 &
163e0 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f  & iCol<pIdx->nCo
163f0 6c 75 6d 6e 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  lumn );.  do{.  
16400 20 20 69 54 65 73 74 20 3d 20 28 69 4d 69 6e 2b    iTest = (iMin+
16410 69 29 2f 32 3b 0a 20 20 20 20 72 65 73 20 3d 20  i)/2;.    res = 
16420 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
16430 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
16440 5b 69 54 65 73 74 5d 2e 6e 2c 20 61 53 61 6d 70  [iTest].n, aSamp
16450 6c 65 5b 69 54 65 73 74 5d 2e 70 2c 20 70 52 65  le[iTest].p, pRe
16460 63 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c  c);.    if( res<
16470 30 20 29 7b 0a 20 20 20 20 20 20 69 4d 69 6e 20  0 ){.      iMin 
16480 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d  = iTest+1;.    }
16490 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 20 3d 20  else{.      i = 
164a0 69 54 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  iTest;.    }.  }
164b0 77 68 69 6c 65 28 20 72 65 73 20 26 26 20 69 4d  while( res && iM
164c0 69 6e 3c 69 20 29 3b 0a 0a 23 69 66 64 65 66 20  in<i );..#ifdef 
164d0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
164e0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
164f0 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
16500 73 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  s check that the
16510 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 63   binary search c
16520 6f 64 65 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66  ode.  ** above f
16530 6f 75 6e 64 20 74 68 65 20 72 69 67 68 74 20 61  ound the right a
16540 6e 73 77 65 72 2e 20 54 68 69 73 20 62 6c 6f 63  nswer. This bloc
16550 6b 20 73 65 72 76 65 73 20 6e 6f 20 70 75 72 70  k serves no purp
16560 6f 73 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74  ose other.  ** t
16570 68 61 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  han to invoke th
16580 65 20 61 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20  e asserts.  */. 
16590 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
165a0 20 20 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30     /* If (res==0
165b0 29 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  ) is true, then 
165c0 73 61 6d 70 6c 65 20 24 69 20 6d 75 73 74 20 62  sample $i must b
165d0 65 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20  e equal to pRec 
165e0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
165f0 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29  <pIdx->nSample )
16600 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 3d  ;.    assert( 0=
16610 3d 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f  =sqlite3VdbeReco
16620 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
16630 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  e[i].n, aSample[
16640 69 5d 2e 70 2c 20 70 52 65 63 29 20 29 3b 0a 20  i].p, pRec) );. 
16650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
16660 74 68 65 72 77 69 73 65 2c 20 70 52 65 63 20 6d  therwise, pRec m
16670 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20 74  ust be smaller t
16680 68 61 6e 20 73 61 6d 70 6c 65 20 24 69 20 61 6e  han sample $i an
16690 64 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20 20  d larger than.  
166a0 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24 69 2d    ** sample ($i-
166b0 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  1).  */.    asse
166c0 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61  rt( i==pIdx->nSa
166d0 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 7c  mple .         |
166e0 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  | sqlite3VdbeRec
166f0 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
16700 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  le[i].n, aSample
16710 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30 20 29  [i].p, pRec)>0 )
16720 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d  ;.    assert( i=
16730 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 73  =0.         || s
16740 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
16750 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
16760 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  i-1].n, aSample[
16770 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30 20  i-1].p, pRec)<0 
16780 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
16790 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45   ifdef SQLITE_DE
167a0 42 55 47 20 2a 2f 0a 0a 20 20 2f 2a 20 41 74 20  BUG */..  /* At 
167b0 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 53 61 6d  this point, aSam
167c0 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66 69  ple[i] is the fi
167d0 72 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 20  rst sample that 
167e0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  is greater than.
167f0 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20 74 6f    ** or equal to
16800 20 70 56 61 6c 2e 20 20 4f 72 20 69 66 20 69 3d   pVal.  Or if i=
16810 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20  =pIdx->nSample, 
16820 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73  then all samples
16830 20 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a 20 74   are less.  ** t
16840 68 61 6e 20 70 56 61 6c 2e 20 20 49 66 20 61 53  han pVal.  If aS
16850 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c 2c 20  ample[i]==pVal, 
16860 74 68 65 6e 20 72 65 73 3d 3d 30 2e 0a 20 20 2a  then res==0..  *
16870 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29  /.  if( res==0 )
16880 7b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d  {.    aStat[0] =
16890 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74   aSample[i].anLt
168a0 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61  [iCol];.    aSta
168b0 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[1] = aSample[i
168c0 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anEq[iCol];.  
168d0 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f 77 63  }else{.    tRowc
168e0 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70 70 65  nt iLower, iUppe
168f0 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66 28  r, iGap;.    if(
16900 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69   i==0 ){.      i
16910 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  Lower = 0;.     
16920 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c   iUpper = aSampl
16930 65 5b 30 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b  e[0].anLt[iCol];
16940 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16950 20 20 69 55 70 70 65 72 20 3d 20 69 3e 3d 70 49    iUpper = i>=pI
16960 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20 70 49  dx->nSample ? pI
16970 64 78 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20  dx->aiRowEst[0] 
16980 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c  : aSample[i].anL
16990 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69  t[iCol];.      i
169a0 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b  Lower = aSample[
169b0 69 2d 31 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 20  i-1].anEq[iCol] 
169c0 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 61  + aSample[i-1].a
169d0 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d  nLt[iCol];.    }
169e0 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
169f0 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f  pIdx->aAvgEq[iCo
16a00 6c 5d 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 77  l];.    if( iLow
16a10 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20  er>=iUpper ){.  
16a20 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20      iGap = 0;.  
16a30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
16a40 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69  Gap = iUpper - i
16a50 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Lower;.    }.   
16a60 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a   if( roundUp ){.
16a70 20 20 20 20 20 20 69 47 61 70 20 3d 20 28 69 47        iGap = (iG
16a80 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c  ap*2)/3;.    }el
16a90 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d  se{.      iGap =
16aa0 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20   iGap/3;.    }. 
16ab0 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c     aStat[0] = iL
16ac0 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d  ower + iGap;.  }
16ad0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16ae0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
16af0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
16b00 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  TAT4 */../*.** T
16b10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
16b20 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65  used to estimate
16b30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
16b40 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
16b50 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73   visited.** by s
16b60 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78  canning an index
16b70 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20   for a range of 
16b80 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67  values. The rang
16b90 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70  e may have an up
16ba0 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20  per.** bound, a 
16bb0 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20  lower bound, or 
16bc0 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45 20  both. The WHERE 
16bd0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61  clause terms tha
16be0 74 20 73 65 74 20 74 68 65 20 75 70 70 65 72 0a  t set the upper.
16bf0 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75  ** and lower bou
16c00 6e 64 73 20 61 72 65 20 72 65 70 72 65 73 65 6e  nds are represen
16c10 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e  ted by pLower an
16c20 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74  d pUpper respect
16c30 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78  ively. For.** ex
16c40 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20  ample, assuming 
16c50 74 68 61 74 20 69 6e 64 65 78 20 70 20 69 73 20  that index p is 
16c60 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20  on t1(a):.**.** 
16c70 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
16c80 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20  ERE a > ? AND a 
16c90 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  < ? ....**      
16ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f                |_
16cb0 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a  ____|   |_____|.
16cc0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16cd0 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
16ce0 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
16cf0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77              pLow
16d00 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a  er    pUpper.**.
16d10 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  ** If either of 
16d20 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77  the upper or low
16d30 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20  er bound is not 
16d40 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55  present, then NU
16d50 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a  LL is passed in.
16d60 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20  ** place of the 
16d70 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68  corresponding Wh
16d80 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54  ereTerm..**.** T
16d90 68 65 20 76 61 6c 75 65 20 69 6e 20 28 70 42 75  he value in (pBu
16da0 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
16db0 74 72 65 65 2e 6e 45 71 29 20 69 73 20 74 68 65  tree.nEq) is the
16dc0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 69 6e   index of the in
16dd0 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75  dex.** column su
16de0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72 61 6e  bject to the ran
16df0 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f  ge constraint. O
16e00 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c  r, equivalently,
16e10 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
16e20 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  * equality const
16e30 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64  raints optimized
16e40 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64   by the proposed
16e50 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72   index scan. For
16e60 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73   example,.** ass
16e70 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73  uming index p is
16e80 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e   on t1(a, b), an
16e90 64 20 74 68 65 20 53 51 4c 20 71 75 65 72 79 20  d the SQL query 
16ea0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
16eb0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
16ec0 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e  = ? AND b > ? AN
16ed0 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a  D b < ? ....**.*
16ee0 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65  * then nEq is se
16ef0 74 20 74 6f 20 31 20 28 61 73 20 74 68 65 20 72  t to 1 (as the r
16f00 61 6e 67 65 20 72 65 73 74 72 69 63 74 65 64 20  ange restricted 
16f10 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68  column, b, is th
16f20 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66  e second .** lef
16f30 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
16f40 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c   the index). Or,
16f50 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
16f60 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
16f70 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20  OM t1 WHERE a > 
16f80 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a  ? AND a < ? ....
16f90 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69  **.** then nEq i
16fa0 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  s set to 0..**.*
16fb0 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
16fc0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
16fd0 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f  *pnOut is set to
16fe0 20 74 68 65 20 77 68 65 72 65 43 6f 73 74 28 29   the whereCost()
16ff0 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65   of the.** numbe
17000 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 74  r of rows that t
17010 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20 69 73  he index scan is
17020 20 65 78 70 65 63 74 65 64 20 74 6f 20 76 69 73   expected to vis
17030 69 74 20 77 69 74 68 6f 75 74 20 0a 2a 2a 20 63  it without .** c
17040 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65 20 72  onsidering the r
17050 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
17060 2e 20 49 66 20 6e 45 71 20 69 73 20 30 2c 20 74  . If nEq is 0, t
17070 68 69 73 20 69 73 20 74 68 65 20 6e 75 6d 62 65  his is the numbe
17080 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e  r of .** rows in
17090 20 74 68 65 20 69 6e 64 65 78 2e 20 41 73 73 75   the index. Assu
170a0 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63  ming no error oc
170b0 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20  curs, *pnOut is 
170c0 61 64 6a 75 73 74 65 64 20 28 72 65 64 75 63 65  adjusted (reduce
170d0 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74  d).** to account
170e0 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65 20 63   for the range c
170f0 6f 6e 74 72 61 69 6e 74 73 20 70 4c 6f 77 65 72  ontraints pLower
17100 20 61 6e 64 20 70 55 70 70 65 72 2e 0a 2a 2a 20   and pUpper..** 
17110 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e  .** In the absen
17120 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61  ce of sqlite_sta
17130 74 34 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c  t4 ANALYZE data,
17140 20 6f 72 20 69 66 20 73 75 63 68 20 64 61 74 61   or if such data
17150 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73   cannot be.** us
17160 65 64 2c 20 65 61 63 68 20 72 61 6e 67 65 20 69  ed, each range i
17170 6e 65 71 75 61 6c 69 74 79 20 72 65 64 75 63 65  nequality reduce
17180 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  s the search spa
17190 63 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f  ce by a factor o
171a0 66 20 34 2e 20 0a 2a 2a 20 48 65 6e 63 65 20 61  f 4. .** Hence a
171b0 20 70 61 69 72 20 6f 66 20 63 6f 6e 73 74 72 61   pair of constra
171c0 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c  ints (x>? AND x<
171d0 3f 29 20 72 65 64 75 63 65 73 20 74 68 65 20 65  ?) reduces the e
171e0 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f  xpected number o
171f0 66 0a 2a 2a 20 72 6f 77 73 20 76 69 73 69 74 65  f.** rows visite
17200 64 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66  d by a factor of
17210 20 31 36 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   16..*/.static i
17220 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 63 61  nt whereRangeSca
17230 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
17240 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
17250 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
17260 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
17270 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
17280 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
17290 72 2c 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  r,.  WhereTerm *
172a0 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77  pLower,   /* Low
172b0 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
172c0 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32  range. ex: "x>12
172d0 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  3" Might be NULL
172e0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
172f0 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70  *pUpper,   /* Up
17300 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  per bound on the
17310 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34   range. ex: "x<4
17320 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  55" Might be NUL
17330 4c 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  L */.  WhereCost
17340 20 2a 70 6e 4f 75 74 20 20 20 20 20 2f 2a 20 49   *pnOut     /* I
17350 4e 2f 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66  N/OUT: Number of
17360 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 2a 2f   rows visited */
17370 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
17380 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
17390 6e 4f 75 74 20 3d 20 28 69 6e 74 29 2a 70 6e 4f  nOut = (int)*pnO
173a0 75 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ut;..#ifdef SQLI
173b0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a  TE_ENABLE_STAT4.
173c0 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75    Index *p = pBu
173d0 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
173e0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
173f0 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64 65  nt nEq = pBuilde
17400 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
17410 2e 6e 45 71 3b 0a 0a 20 20 69 66 28 20 6e 45 71  .nEq;..  if( nEq
17420 3d 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  ==pBuilder->nRec
17430 56 61 6c 69 64 20 0a 20 20 20 26 26 20 70 2d 3e  Valid .   && p->
17440 6e 53 61 6d 70 6c 65 20 0a 20 20 20 26 26 20 4f  nSample .   && O
17450 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
17460 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  ed(pParse->db, S
17470 51 4c 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20  QLITE_Stat3) .  
17480 29 7b 0a 20 20 20 20 55 6e 70 61 63 6b 65 64 52  ){.    UnpackedR
17490 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42  ecord *pRec = pB
174a0 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20  uilder->pRec;.  
174b0 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72    tRowcnt iLower
174c0 20 3d 20 30 3b 0a 20 20 20 20 74 52 6f 77 63 6e   = 0;.    tRowcn
174d0 74 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 61 69  t iUpper = p->ai
174e0 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 74  RowEst[0];.    t
174f0 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20  Rowcnt a[2];.   
17500 20 75 38 20 61 66 66 20 3d 20 70 2d 3e 70 54 61   u8 aff = p->pTa
17510 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43  ble->aCol[p->aiC
17520 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69  olumn[0]].affini
17530 74 79 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 77  ty;.    if( pLow
17540 65 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  er ){.      int 
17550 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  bOk;            
17560 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
17570 69 66 20 76 61 6c 75 65 20 69 73 20 65 78 74 72  if value is extr
17580 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72  acted from pExpr
17590 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
175a0 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e  pExpr = pLower->
175b0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
175c0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
175d0 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  ower->eOperator 
175e0 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29  & (WO_GT|WO_GE))
175f0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  !=0 );.      rc 
17600 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72  = sqlite3Stat4Pr
17610 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72  obeSetValue(pPar
17620 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45  se, p, &pRec, pE
17630 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26  xpr, aff, nEq, &
17640 62 4f 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  bOk);.      if( 
17650 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17660 20 62 4f 6b 0a 20 20 20 20 20 20 20 26 26 20 77   bOk.       && w
17670 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
17680 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
17690 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   a)==SQLITE_OK. 
176a0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
176b0 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20  iLower = a[0];. 
176c0 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 77         if( (pLow
176d0 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
176e0 57 4f 5f 47 54 29 21 3d 30 20 29 20 69 4c 6f 77  WO_GT)!=0 ) iLow
176f0 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20 20  er += a[1];.    
17700 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
17710 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17720 26 26 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20  && pUpper ){.   
17730 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20     int bOk;     
17740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17750 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65 20  * True if value 
17760 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
17770 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20  m pExpr */.     
17780 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
17790 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Upper->pExpr->pR
177a0 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65  ight;.      asse
177b0 72 74 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70  rt( (pUpper->eOp
177c0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c  erator & (WO_LT|
177d0 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20  WO_LE))!=0 );.  
177e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
177f0 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c  Stat4ProbeSetVal
17800 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70  ue(pParse, p, &p
17810 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c  Rec, pExpr, aff,
17820 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20   nEq, &bOk);.   
17830 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17840 45 5f 4f 4b 20 26 26 20 62 4f 6b 0a 20 20 20 20  E_OK && bOk.    
17850 20 20 20 26 26 20 77 68 65 72 65 4b 65 79 53 74     && whereKeySt
17860 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
17870 52 65 63 2c 20 31 2c 20 61 29 3d 3d 53 51 4c 49  Rec, 1, a)==SQLI
17880 54 45 5f 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20  TE_OK.      ){. 
17890 20 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20         iUpper = 
178a0 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  a[0];.        if
178b0 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72  ( (pUpper->eOper
178c0 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30  ator & WO_LE)!=0
178d0 20 29 20 69 55 70 70 65 72 20 2b 3d 20 61 5b 31   ) iUpper += a[1
178e0 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
178f0 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70  .    pBuilder->p
17900 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20 20  Rec = pRec;.    
17910 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17920 4b 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  K ){.      Where
17930 43 6f 73 74 20 6e 4e 65 77 3b 0a 20 20 20 20 20  Cost nNew;.     
17940 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77   if( iUpper>iLow
17950 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4e  er ){.        nN
17960 65 77 20 3d 20 77 68 65 72 65 43 6f 73 74 28 69  ew = whereCost(i
17970 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b  Upper - iLower);
17980 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17990 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 77 68 65        nNew = whe
179a0 72 65 43 6f 73 74 28 32 29 3b 20 20 20 20 20 20  reCost(2);      
179b0 2f 2a 20 53 6d 61 6c 6c 20 6e 75 6d 62 65 72 20  /* Small number 
179c0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
179d0 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29   if( nNew<nOut )
179e0 7b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d  {.        nOut =
179f0 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20   nNew;.      }. 
17a00 20 20 20 20 20 2a 70 6e 4f 75 74 20 3d 20 28 57       *pnOut = (W
17a10 68 65 72 65 43 6f 73 74 29 6e 4f 75 74 3b 0a 20  hereCost)nOut;. 
17a20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
17a30 30 78 31 30 30 2c 20 28 22 72 61 6e 67 65 20 73  0x100, ("range s
17a40 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e  can regions: %u.
17a50 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a  .%u  est=%d\n",.
17a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a70 20 20 20 20 20 20 20 20 20 28 75 33 32 29 69 4c           (u32)iL
17a80 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70 70 65  ower, (u32)iUppe
17a90 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20  r, nOut));.     
17aa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17ab0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  K;.    }.  }.#el
17ac0 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
17ad0 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20  METER(pParse);. 
17ae0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
17af0 52 28 70 42 75 69 6c 64 65 72 29 3b 0a 23 65 6e  R(pBuilder);.#en
17b00 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 4c  dif.  assert( pL
17b10 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20 29  ower || pUpper )
17b20 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20  ;.  /* TUNING:  
17b30 45 61 63 68 20 69 6e 65 71 75 61 6c 69 74 79 20  Each inequality 
17b40 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 64 75 63  constraint reduc
17b50 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70  es the search sp
17b60 61 63 65 20 34 2d 66 6f 6c 64 2e 0a 20 20 2a 2a  ace 4-fold..  **
17b70 20 41 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61   A BETWEEN opera
17b80 74 6f 72 2c 20 74 68 65 72 65 66 6f 72 65 2c 20  tor, therefore, 
17b90 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72  reduces the sear
17ba0 63 68 20 73 70 61 63 65 20 31 36 2d 66 6f 6c 64  ch space 16-fold
17bb0 20 2a 2f 0a 20 20 69 66 28 20 70 4c 6f 77 65 72   */.  if( pLower
17bc0 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e 77 74 46   && (pLower->wtF
17bd0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
17be0 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f 75  L)==0 ){.    nOu
17bf0 74 20 2d 3d 20 32 30 3b 20 20 20 20 20 20 20 20  t -= 20;        
17c00 61 73 73 65 72 74 28 20 32 30 3d 3d 77 68 65 72  assert( 20==wher
17c10 65 43 6f 73 74 28 34 29 20 29 3b 0a 20 20 7d 0a  eCost(4) );.  }.
17c20 20 20 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a    if( pUpper ){.
17c30 20 20 20 20 6e 4f 75 74 20 2d 3d 20 32 30 3b 20      nOut -= 20; 
17c40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 32         assert( 2
17c50 30 3d 3d 77 68 65 72 65 43 6f 73 74 28 34 29 20  0==whereCost(4) 
17c60 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 75  );.  }.  if( nOu
17c70 74 3c 31 30 20 29 20 6e 4f 75 74 20 3d 20 31 30  t<10 ) nOut = 10
17c80 3b 0a 20 20 2a 70 6e 4f 75 74 20 3d 20 28 57 68  ;.  *pnOut = (Wh
17c90 65 72 65 43 6f 73 74 29 6e 4f 75 74 3b 0a 20 20  ereCost)nOut;.  
17ca0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
17cb0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
17cc0 4c 45 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45  LE_STAT4./*.** E
17cd0 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
17ce0 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
17cf0 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
17d00 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20   based on.** an 
17d10 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
17d20 69 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20  int x=VALUE and 
17d30 77 68 65 72 65 20 74 68 61 74 20 56 41 4c 55 45  where that VALUE
17d40 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68   occurs in.** th
17d50 65 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  e histogram data
17d60 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72  .  This only wor
17d70 6b 73 20 77 68 65 6e 20 78 20 69 73 20 74 68 65  ks when x is the
17d80 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f   left-most.** co
17d90 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78  lumn of an index
17da0 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74   and sqlite_stat
17db0 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  3 histogram data
17dc0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a   is available.**
17dd0 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e   for that index.
17de0 20 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55    When pExpr==NU
17df0 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  LL that means th
17e00 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a  e constraint is.
17e10 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69  ** "x IS NULL" i
17e20 6e 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c  nstead of "x=VAL
17e30 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  UE"..**.** Write
17e40 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72   the estimated r
17e50 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70  ow count into *p
17e60 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20  nRow and return 
17e70 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49  SQLITE_OK. .** I
17e80 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  f unable to make
17e90 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65   an estimate, le
17ea0 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61  ave *pnRow uncha
17eb0 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  nged and return.
17ec0 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a  ** non-zero..**.
17ed0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17ee0 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69  can fail if it i
17ef0 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64  s unable to load
17f00 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
17f10 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65  uence.** require
17f20 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d  d for string com
17f30 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75  parison, or if u
17f40 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
17f50 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20  e memory.** for 
17f60 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e  a UTF conversion
17f70 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f   required for co
17f80 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65  mparison.  The e
17f90 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a  rror is stored.*
17fa0 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  * in the pParse 
17fb0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
17fc0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 45 71  atic int whereEq
17fd0 75 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61  ualScanEst(.  Pa
17fe0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
17ff0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
18000 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
18010 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
18020 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
18030 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20  Builder,.  Expr 
18040 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
18050 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f  /* Expression fo
18060 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78  r VALUE in the x
18070 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e  =VALUE constrain
18080 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a  t */.  tRowcnt *
18090 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57  pnRow       /* W
180a0 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
180b0 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
180c0 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
180d0 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e   *p = pBuilder->
180e0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
180f0 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20  ndex;.  int nEq 
18100 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
18110 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
18120 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
18130 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72  *pRec = pBuilder
18140 2d 3e 70 52 65 63 3b 0a 20 20 75 38 20 61 66 66  ->pRec;.  u8 aff
18150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18160 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66      /* Column af
18170 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20  finity */.  int 
18180 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
18190 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63        /* Subfunc
181a0 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65  tion return code
181b0 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b   */.  tRowcnt a[
181c0 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  2];             
181d0 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f  /* Statistics */
181e0 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61  .  int bOk;..  a
181f0 73 73 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b  ssert( nEq>=1 );
18200 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d  .  assert( nEq<=
18210 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 20 29  (p->nColumn+1) )
18220 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
18230 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61  Sample!=0 );.  a
18240 73 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c  ssert( p->nSampl
18250 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
18260 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
18270 61 6c 69 64 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f  alid<nEq );..  /
18280 2a 20 49 66 20 76 61 6c 75 65 73 20 61 72 65 20  * If values are 
18290 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  not available fo
182a0 72 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20  r all fields of 
182b0 74 68 65 20 69 6e 64 65 78 20 74 6f 20 74 68 65  the index to the
182c0 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68   left.  ** of th
182d0 69 73 20 6f 6e 65 2c 20 6e 6f 20 65 73 74 69 6d  is one, no estim
182e0 61 74 65 20 63 61 6e 20 62 65 20 6d 61 64 65 2e  ate can be made.
182f0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   Return SQLITE_N
18300 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69 66  OTFOUND. */.  if
18310 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  ( pBuilder->nRec
18320 56 61 6c 69 64 3c 28 6e 45 71 2d 31 29 20 29 7b  Valid<(nEq-1) ){
18330 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
18340 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d  TE_NOTFOUND;.  }
18350 0a 0a 20 20 69 66 28 20 6e 45 71 3e 70 2d 3e 6e  ..  if( nEq>p->n
18360 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a 70  Column ){.    *p
18370 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65  nRow = 1;.    re
18380 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18390 20 20 7d 0a 0a 20 20 61 66 66 20 3d 20 70 2d 3e    }..  aff = p->
183a0 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e  pTable->aCol[p->
183b0 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d  aiColumn[nEq-1]]
183c0 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 72 63 20  .affinity;.  rc 
183d0 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72  = sqlite3Stat4Pr
183e0 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72  obeSetValue(pPar
183f0 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45  se, p, &pRec, pE
18400 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c  xpr, aff, nEq-1,
18410 20 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64   &bOk);.  pBuild
18420 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b  er->pRec = pRec;
18430 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18440 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
18450 3b 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29  ;.  if( bOk==0 )
18460 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
18470 4f 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c  OTFOUND;.  pBuil
18480 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d  der->nRecValid =
18490 20 6e 45 71 3b 0a 0a 20 20 72 63 20 3d 20 77 68   nEq;..  rc = wh
184a0 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
184b0 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20  se, p, pRec, 0, 
184c0 61 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  a);.  if( rc==SQ
184d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 57  LITE_OK ){.    W
184e0 48 45 52 45 54 52 41 43 45 28 30 78 31 30 30 2c  HERETRACE(0x100,
184f0 28 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20  ("equality scan 
18500 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20  regions: %d\n", 
18510 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 20  (int)a[1]));.   
18520 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a   *pnRow = a[1];.
18530 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20    }.  .  return 
18540 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
18550 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
18560 4e 41 42 4c 45 5f 53 54 41 54 34 29 20 2a 2f 0a  NABLE_STAT4) */.
18570 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18580 4e 41 42 4c 45 5f 53 54 41 54 34 0a 2f 2a 0a 2a  NABLE_STAT4./*.*
18590 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * Estimate the n
185a0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
185b0 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
185c0 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ned based on.** 
185d0 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  an IN constraint
185e0 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74   where the right
185f0 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
18600 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  e IN operator.**
18610 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61   is a list of va
18620 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a  lues.  Example:.
18630 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45  **.**        WHE
18640 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34  RE x IN (1,2,3,4
18650 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ).**.** Write th
18660 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20  e estimated row 
18670 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f  count into *pnRo
18680 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  w and return SQL
18690 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75  ITE_OK. .** If u
186a0 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e  nable to make an
186b0 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65   estimate, leave
186c0 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65   *pnRow unchange
186d0 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  d and return.** 
186e0 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
186f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
18700 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75   fail if it is u
18710 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20  nable to load a 
18720 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
18730 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66  ce.** required f
18740 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  or string compar
18750 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62  ison, or if unab
18760 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
18770 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55  emory.** for a U
18780 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65  TF conversion re
18790 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61  quired for compa
187a0 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f  rison.  The erro
187b0 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  r is stored.** i
187c0 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
187d0 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
187e0 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61  c int whereInSca
187f0 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
18800 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
18810 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
18820 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
18830 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
18840 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
18850 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  r,.  ExprList *p
18860 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  List,     /* The
18870 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74   value list on t
18880 68 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20  he RHS of "x IN 
18890 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20  (v1,v2,v3,...)" 
188a0 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e  */.  tRowcnt *pn
188b0 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69  Row       /* Wri
188c0 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
188d0 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
188e0 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
188f0 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
18900 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
18910 65 78 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56 61  ex;.  int nRecVa
18920 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  lid = pBuilder->
18930 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74  nRecValid;.  int
18940 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18950 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
18960 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
18970 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73  */.  tRowcnt nEs
18980 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
18990 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66  Number of rows f
189a0 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  or a single term
189b0 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52   */.  tRowcnt nR
189c0 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a  owEst = 0;    /*
189d0 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66   New estimate of
189e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
189f0 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ows */.  int i; 
18a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a10 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
18a20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
18a30 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a  ->aSample!=0 );.
18a40 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
18a50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c  QLITE_OK && i<pL
18a60 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
18a70 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 70 2d 3e  {.    nEst = p->
18a80 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20  aiRowEst[0];.   
18a90 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c   rc = whereEqual
18aa0 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
18ab0 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d  pBuilder, pList-
18ac0 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45  >a[i].pExpr, &nE
18ad0 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74  st);.    nRowEst
18ae0 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 42   += nEst;.    pB
18af0 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
18b00 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20  d = nRecValid;. 
18b10 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
18b20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
18b30 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d 3e  f( nRowEst > p->
18b40 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e 52  aiRowEst[0] ) nR
18b50 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77  owEst = p->aiRow
18b60 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e 52  Est[0];.    *pnR
18b70 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20  ow = nRowEst;.  
18b80 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
18b90 30 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69  00,("IN row esti
18ba0 6d 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e 22 2c  mate: est=%g\n",
18bb0 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a   nRowEst));.  }.
18bc0 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64    assert( pBuild
18bd0 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e  er->nRecValid==n
18be0 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65  RecValid );.  re
18bf0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
18c00 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
18c10 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
18c20 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61  ) */../*.** Disa
18c30 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68  ble a term in th
18c40 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
18c50 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20   Except, do not 
18c60 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d  disable the term
18c70 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f  .** if it contro
18c80 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  ls a LEFT OUTER 
18c90 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20  JOIN and it did 
18ca0 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e  not originate in
18cb0 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53   the ON.** or US
18cc0 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ING clause of th
18cd0 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43  at join..**.** C
18ce0 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d  onsider the term
18cf0 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68   t2.z='ok' in th
18d00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
18d10 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  ies:.**.**   (1)
18d20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
18d30 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
18d40 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45  ON t1.a=t2.x WHE
18d50 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20  RE t2.z='ok'.** 
18d60 20 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20    (2)  SELECT * 
18d70 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
18d80 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
18d90 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
18da0 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54  **   (3)  SELECT
18db0 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57   * FROM t1, t2 W
18dc0 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41  HERE t1.a=t2.x A
18dd0 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a  ND t2.z='ok'.**.
18de0 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27  ** The t2.z='ok'
18df0 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
18e00 74 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75  the in (2) becau
18e10 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73  se it originates
18e20 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c  .** in the ON cl
18e30 61 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20  ause.  The term 
18e40 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  is disabled in (
18e50 33 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73  3) because it is
18e60 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20   not part.** of 
18e70 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
18e80 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20  N.  In (1), the 
18e90 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61  term is not disa
18ea0 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61  bled..**.** Disa
18eb0 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75  bling a term cau
18ec0 73 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f  ses that term to
18ed0 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69   not be tested i
18ee0 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  n the inner loop
18ef0 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  .** of the join.
18f00 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61    Disabling is a
18f10 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
18f20 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20   When terms are 
18f30 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20  satisfied.** by 
18f40 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73 61  indices, we disa
18f50 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76  ble them to prev
18f60 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65  ent redundant te
18f70 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72  sts in the inner
18f80 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f  .** loop.  We wo
18f90 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72  uld get the corr
18fa0 65 63 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e  ect results if n
18fb0 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76 65 72  othing were ever
18fc0 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75   disabled,.** bu
18fd0 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75  t joins might ru
18fe0 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65  n a little slowe
18ff0 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69 73  r.  The trick is
19000 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d   to disable as m
19010 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e  uch.** as we can
19020 20 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69   without disabli
19030 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66  ng too much.  If
19040 20 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20   we disabled in 
19050 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a  (1), we'd get.**
19060 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65   the wrong answe
19070 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  r.  See ticket #
19080 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  813..*/.static v
19090 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28  oid disableTerm(
190a0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
190b0 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70  el, WhereTerm *p
190c0 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65  Term){.  if( pTe
190d0 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54 65  rm.      && (pTe
190e0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
190f0 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20  RM_CODED)==0.   
19100 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69     && (pLevel->i
19110 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45  LeftJoin==0 || E
19120 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
19130 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
19140 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a  FromJoin)).  ){.
19150 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
19160 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
19170 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
19180 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20  >iParent>=0 ){. 
19190 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
191a0 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d  pOther = &pTerm-
191b0 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69  >pWC->a[pTerm->i
191c0 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69  Parent];.      i
191d0 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43  f( (--pOther->nC
191e0 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  hild)==0 ){.    
191f0 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
19200 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b  pLevel, pOther);
19210 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19220 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
19230 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79 20   an OP_Affinity 
19240 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79 20  opcode to apply 
19250 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  the column affin
19260 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66 0a  ity string zAff.
19270 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67 69  ** to the n regi
19280 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
19290 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41  t base. .**.** A
192a0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
192b0 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  n, SQLITE_AFF_NO
192c0 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68 69 63  NE entries (whic
192d0 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74  h are no-ops) at
192e0 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e   the.** beginnin
192f0 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66  g and end of zAf
19300 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20 20  f are ignored.  
19310 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  If all entries i
19320 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53 51  n zAff are.** SQ
19330 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74  LITE_AFF_NONE, t
19340 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74 73  hen no code gets
19350 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a   generated..**.*
19360 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
19370 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f 70  akes its own cop
19380 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68 61  y of zAff so tha
19390 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  t the caller is 
193a0 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66  free.** to modif
193b0 79 20 7a 41 66 66 20 61 66 74 65 72 20 74 68 69  y zAff after thi
193c0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
193d0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
193e0 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e  d codeApplyAffin
193f0 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ity(Parse *pPars
19400 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e 74  e, int base, int
19410 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29 7b   n, char *zAff){
19420 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
19430 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
19440 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20  ( zAff==0 ){.   
19450 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
19460 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
19470 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d );.    return;
19480 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 76  .  }.  assert( v
19490 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a  !=0 );..  /* Adj
194a0 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20 74  ust base and n t
194b0 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c 49  o skip over SQLI
194c0 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72  TE_AFF_NONE entr
194d0 69 65 73 20 61 74 20 74 68 65 20 62 65 67 69 6e  ies at the begin
194e0 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e  ning.  ** and en
194f0 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69 74  d of the affinit
19500 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20  y string..  */. 
19510 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a   while( n>0 && z
19520 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41  Aff[0]==SQLITE_A
19530 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e  FF_NONE ){.    n
19540 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a  --;.    base++;.
19550 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a      zAff++;.  }.
19560 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20    while( n>1 && 
19570 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54  zAff[n-1]==SQLIT
19580 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
19590 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    n--;.  }..  /*
195a0 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66 66   Code the OP_Aff
195b0 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66 20  inity opcode if 
195c0 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69 6e  there is anythin
195d0 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f  g left to do. */
195e0 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
195f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19600 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op2(v, OP_Affini
19610 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20  ty, base, n);.  
19620 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
19630 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66  ngeP4(v, -1, zAf
19640 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  f, n);.    sqlit
19650 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
19660 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
19670 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a  , base, n);.  }.
19680 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
19690 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69  te code for a si
196a0 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65  ngle equality te
196b0 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
196c0 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61  clause.  An equa
196d0 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e  lity.** term can
196e0 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78 70   be either X=exp
196f0 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e  r or X IN (...).
19700 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65 20     pTerm is the 
19710 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63  term to be .** c
19720 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oded..**.** The 
19730 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f  current value fo
19740 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  r the constraint
19750 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69   is left in regi
19760 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a  ster iReg..**.**
19770 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e   For a constrain
19780 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d  t of the form X=
19790 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65 73  expr, the expres
197a0 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65  sion is evaluate
197b0 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73  d and its.** res
197c0 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74  ult is left on t
197d0 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63  he stack.  For c
197e0 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68  onstraints of th
197f0 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e  e form X IN (...
19800 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ).** this routin
19810 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70  e sets up a loop
19820 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61   that will itera
19830 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75  te over all valu
19840 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74  es of X..*/.stat
19850 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61 6c  ic int codeEqual
19860 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ityTerm(.  Parse
19870 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
19880 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
19890 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
198a0 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f  Term *pTerm,   /
198b0 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68  * The term of th
198c0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
198d0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
198e0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
198f0 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76 65 6c  el, /* The level
19900 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
19910 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b 69  use we are worki
19920 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ng on */.  int i
19930 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  Eq,            /
19940 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 65  * Index of the e
19950 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77 69 74  quality term wit
19960 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c 20 2a  hin this level *
19970 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20  /.  int bRev,   
19980 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
19990 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72 64 65  for reverse-orde
199a0 72 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e 73 20  r IN operations 
199b0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65 74  */.  int iTarget
199c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 65           /* Atte
199d0 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65 73  mpt to leave res
199e0 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65 67  ults in this reg
199f0 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78  ister */.){.  Ex
19a00 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
19a10 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76  pExpr;.  Vdbe *v
19a20 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
19a30 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20  ;.  int iReg;   
19a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19a50 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
19a60 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20  ng results */.. 
19a70 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65 74   assert( iTarget
19a80 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e  >0 );.  if( pX->
19a90 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20  op==TK_EQ ){.   
19aa0 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45   iReg = sqlite3E
19ab0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
19ac0 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
19ad0 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 65  , iTarget);.  }e
19ae0 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d  lse if( pX->op==
19af0 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  TK_ISNULL ){.   
19b00 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b   iReg = iTarget;
19b10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19b20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
19b30 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69 66  l, 0, iReg);.#if
19b40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19b50 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73  _SUBQUERY.  }els
19b60 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65  e{.    int eType
19b70 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a  ;.    int iTab;.
19b80 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f      struct InLoo
19b90 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68 65 72  p *pIn;.    Wher
19ba0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70  eLoop *pLoop = p
19bb0 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a  Level->pWLoop;..
19bc0 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
19bd0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
19be0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
19bf0 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d  .      && pLoop-
19c00 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
19c10 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f  =0.      && pLoo
19c20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
19c30 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 45  x->aSortOrder[iE
19c40 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q].    ){.      
19c50 74 65 73 74 63 61 73 65 28 20 69 45 71 3d 3d 30  testcase( iEq==0
19c60 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
19c70 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20  se( bRev );.    
19c80 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a    bRev = !bRev;.
19c90 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
19ca0 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  ( pX->op==TK_IN 
19cb0 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54  );.    iReg = iT
19cc0 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70 65  arget;.    eType
19cd0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
19ce0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 58  Index(pParse, pX
19cf0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 65 54  , 0);.    if( eT
19d00 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype==IN_INDEX_IN
19d10 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20  DEX_DESC ){.    
19d20 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76    testcase( bRev
19d30 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d   );.      bRev =
19d40 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20   !bRev;.    }.  
19d50 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61    iTab = pX->iTa
19d60 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ble;.    sqlite3
19d70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52  VdbeAddOp2(v, bR
19d80 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f  ev ? OP_Last : O
19d90 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20  P_Rewind, iTab, 
19da0 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
19db0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
19dc0 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
19dd0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f  )==0 );.    pLoo
19de0 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  p->wsFlags |= WH
19df0 45 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20 20  ERE_IN_ABLE;.   
19e00 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69   if( pLevel->u.i
19e10 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  n.nIn==0 ){.    
19e20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78    pLevel->addrNx
19e30 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
19e40 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
19e50 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75   }.    pLevel->u
19e60 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70  .in.nIn++;.    p
19e70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
19e80 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c  oop =.       sql
19e90 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
19ea0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
19eb0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
19ec0 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  Loop,.          
19ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ee0 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65      sizeof(pLeve
19ef0 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b  l->u.in.aInLoop[
19f00 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  0])*pLevel->u.in
19f10 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d  .nIn);.    pIn =
19f20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
19f30 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70  nLoop;.    if( p
19f40 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20  In ){.      pIn 
19f50 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  += pLevel->u.in.
19f60 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70  nIn - 1;.      p
19f70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b  In->iCur = iTab;
19f80 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
19f90 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
19fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d   ){.        pIn-
19fb0 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c  >addrInTop = sql
19fc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19fd0 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62  , OP_Rowid, iTab
19fe0 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  , iReg);.      }
19ff0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49  else{.        pI
1a000 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73  n->addrInTop = s
1a010 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1a020 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
1a030 54 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20  Tab, 0, iReg);. 
1a040 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
1a050 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62  ->eEndLoopOp = b
1a060 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20  Rev ? OP_Prev : 
1a070 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  OP_Next;.      s
1a080 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
1a090 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69  (v, OP_IsNull, i
1a0a0 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Reg);.    }else{
1a0b0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75  .      pLevel->u
1a0c0 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20  .in.nIn = 0;.   
1a0d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
1a0e0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1a0f0 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72 65  el, pTerm);.  re
1a100 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a  turn iReg;.}../*
1a110 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1a120 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
1a130 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20  uate all == and 
1a140 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66  IN constraints f
1a150 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a  or an.** index..
1a160 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1a170 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c  e, consider tabl
1a180 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66  e t1(a,b,c,d,e,f
1a190 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31 28  ) with index i1(
1a1a0 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f  a,b,c)..** Suppo
1a1b0 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  se the WHERE cla
1a1c0 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d  use is this:  a=
1a1d0 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32  =5 AND b IN (1,2
1a1e0 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20  ,3) AND c>5 AND 
1a1f0 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65  c<10.** The inde
1a200 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73  x has as many as
1a210 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79 20   three equality 
1a220 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74  constraints, but
1a230 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d   in this.** exam
1a240 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20 22  ple, the third "
1a250 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69  c" value is an i
1a260 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f  nequality.  So o
1a270 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73  nly two .** cons
1a280 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65  traints are code
1a290 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
1a2a0 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63   will generate c
1a2b0 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a  ode to evaluate.
1a2c0 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e  ** a==5 and b IN
1a2d0 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63   (1,2,3).  The c
1a2e0 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f  urrent values fo
1a2f0 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62  r a and b will b
1a300 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63  e stored.** in c
1a310 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73  onsecutive regis
1a320 74 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64  ters and the ind
1a330 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ex of the first 
1a340 72 65 67 69 73 74 65 72 20 69 73 20 72 65 74 75  register is retu
1a350 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  rned..**.** In t
1a360 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
1a370 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68   nEq==2.  But th
1a380 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f  is subroutine wo
1a390 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75  rks for any valu
1a3a0 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c  e.** of nEq incl
1a3b0 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71  uding 0.  If nEq
1a3c0 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ==0, this routin
1a3d0 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f  e is nearly a no
1a3e0 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  -op..** The only
1a3f0 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69   thing it does i
1a400 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70  s allocate the p
1a410 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f  Level->iMem memo
1a420 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63  ry cell and.** c
1a430 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66 69 6e  ompute the affin
1a440 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ity string..**.*
1a450 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1a460 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73 20  lways allocates 
1a470 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d  at least one mem
1a480 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 74  ory cell and ret
1a490 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65  urns.** the inde
1a4a0 78 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72 79  x of that memory
1a4b0 20 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65 20   cell. The code 
1a4c0 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68  that.** calls th
1a4d0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
1a4e0 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20  use that memory 
1a4f0 63 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74 68  cell to store th
1a500 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a  e termination.**
1a510 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68   key value of th
1a520 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20  e loop.  If one 
1a530 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61  or more IN opera
1a540 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68 65  tors appear, the
1a550 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
1a560 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61  e allocates an a
1a570 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65  dditional nEq me
1a580 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69  mory cells for i
1a590 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a  nternal.** use..
1a5a0 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
1a5b0 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20 69  urning, *pzAff i
1a5c0 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
1a5d0 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
1a5e0 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79 20  ining a.** copy 
1a5f0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66  of the column af
1a600 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f 66  finity string of
1a610 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f 63   the index alloc
1a620 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71  ated using.** sq
1a630 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e  lite3DbMalloc().
1a640 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69 65 73   Except, entries
1a650 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f 66 20   in the copy of 
1a660 74 68 65 20 73 74 72 69 6e 67 20 61 73 73 6f 63  the string assoc
1a670 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 65 71  iated.** with eq
1a680 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1a690 74 73 20 74 68 61 74 20 75 73 65 20 4e 4f 4e 45  ts that use NONE
1a6a0 20 61 66 66 69 6e 69 74 79 20 61 72 65 20 73 65   affinity are se
1a6b0 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  t to.** SQLITE_A
1a6c0 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69 73  FF_NONE. This is
1a6d0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 51   to deal with SQ
1a6e0 4c 20 73 75 63 68 20 61 73 20 74 68 65 20 66 6f  L such as the fo
1a6f0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
1a700 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
1a710 28 61 20 54 45 58 54 20 50 52 49 4d 41 52 59 20  (a TEXT PRIMARY 
1a720 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45  KEY, b);.**   SE
1a730 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
1a740 20 41 53 20 74 32 2c 20 74 31 20 57 48 45 52 45   AS t2, t1 WHERE
1a750 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a   t1.a = t2.b;.**
1a760 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70  .** In the examp
1a770 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 69 6e  le above, the in
1a780 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68 61 73  dex on t1(a) has
1a790 20 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20   TEXT affinity. 
1a7a0 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65  But since.** the
1a7b0 20 72 69 67 68 74 20 68 61 6e 64 20 73 69 64 65   right hand side
1a7c0 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74 79   of the equality
1a7d0 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74 32 2e   constraint (t2.
1a7e0 62 29 20 68 61 73 20 4e 4f 4e 45 20 61 66 66 69  b) has NONE affi
1a7f0 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76  nity,.** no conv
1a800 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  ersion should be
1a810 20 61 74 74 65 6d 70 74 65 64 20 62 65 66 6f 72   attempted befor
1a820 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62 20 76  e using a t2.b v
1a830 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f 66 0a  alue as part of.
1a840 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65 61 72  ** a key to sear
1a850 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20 48 65  ch the index. He
1a860 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 62 79  nce the first by
1a870 74 65 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  te in the return
1a880 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73  ed affinity.** s
1a890 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20 65 78  tring in this ex
1a8a0 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65 20 73  ample would be s
1a8b0 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41 46 46  et to SQLITE_AFF
1a8c0 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  _NONE..*/.static
1a8d0 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75 61   int codeAllEqua
1a8e0 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72  lityTerms(.  Par
1a8f0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1a900 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1a910 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
1a920 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20  Level *pLevel,  
1a930 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64   /* Which nested
1a940 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f   loop of the FRO
1a950 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20  M we are coding 
1a960 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20  */.  int bRev,  
1a970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1a980 76 65 72 73 65 20 74 68 65 20 6f 72 64 65 72 20  verse the order 
1a990 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  of IN operators 
1a9a0 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52  */.  int nExtraR
1a9b0 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  eg,        /* Nu
1a9c0 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
1a9d0 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63  gisters to alloc
1a9e0 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ate */.  char **
1a9f0 70 7a 41 66 66 20 20 20 20 20 20 20 20 20 20 2f  pzAff          /
1aa00 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 70 6f  * OUT: Set to po
1aa10 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74 79 20  int to affinity 
1aa20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  string */.){.  i
1aa30 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20  nt nEq;         
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1aa50 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d  The number of ==
1aa60 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   or IN constrain
1aa70 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20  ts to code */.  
1aa80 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1aa90 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
1aaa0 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f   The vm under co
1aab0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1aac0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aae0 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   The index being
1aaf0 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c   used for this l
1ab00 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  oop */.  WhereTe
1ab10 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
1ab20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
1ab30 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  le constraint te
1ab40 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  rm */.  WhereLoo
1ab50 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
1ab60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
1ab70 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
1ab80 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
1ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aba0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1abb0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
1abc0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1abd0 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
1abe0 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ster */.  int nR
1abf0 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
1ac00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ac10 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  r of registers t
1ac20 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
1ac30 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20  char *zAff;     
1ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ac50 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   Affinity string
1ac60 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20   to return */.. 
1ac70 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20   /* This module 
1ac80 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f  is only called o
1ac90 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68  n query plans th
1aca0 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e  at use an index.
1acb0 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c   */.  pLoop = pL
1acc0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
1acd0 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
1ace0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1acf0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
1ad00 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f   );.  nEq = pLoo
1ad10 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
1ad20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
1ad30 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
1ad40 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
1ad50 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  0 );..  /* Figur
1ad60 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d  e out how many m
1ad70 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77  emory cells we w
1ad80 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c  ill need then al
1ad90 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a  locate them..  *
1ada0 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50  /.  regBase = pP
1adb0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
1adc0 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e    nReg = pLoop->
1add0 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45  u.btree.nEq + nE
1ade0 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73  xtraReg;.  pPars
1adf0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
1ae00 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74  ..  zAff = sqlit
1ae10 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73  e3DbStrDup(pPars
1ae20 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33 49 6e  e->db, sqlite3In
1ae30 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76  dexAffinityStr(v
1ae40 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66 28 20  , pIdx));.  if( 
1ae50 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70 50 61  !zAff ){.    pPa
1ae60 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1ae70 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a  ailed = 1;.  }..
1ae80 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
1ae90 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
1aea0 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73  raints.  */.  as
1aeb0 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
1aec0 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f  umn>=nEq );.  fo
1aed0 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b  r(j=0; j<nEq; j+
1aee0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a  +){.    int r1;.
1aef0 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
1af00 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20  p->aLTerm[j];.  
1af10 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
1af20 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 );.    /* The
1af30 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 72 75 65 20   following true 
1af40 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74 68  for indices with
1af50 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d   redundant colum
1af60 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20  ns. .    ** Ex: 
1af70 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
1af80 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53 45  ON t1(a,b,a); SE
1af90 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1afa0 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d 30  HERE a=0 AND b=0
1afb0 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73  ; */.    testcas
1afc0 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  e( (pTerm->wtFla
1afd0 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
1afe0 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
1aff0 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
1b000 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1b010 41 4c 20 29 3b 0a 20 20 20 20 72 31 20 3d 20 63  AL );.    r1 = c
1b020 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
1b030 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
1b040 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20  Level, j, bRev, 
1b050 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
1b060 69 66 28 20 72 31 21 3d 72 65 67 42 61 73 65 2b  if( r1!=regBase+
1b070 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  j ){.      if( n
1b080 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Reg==1 ){.      
1b090 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1b0a0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1b0b0 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20 20  regBase);.      
1b0c0 20 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b 0a    regBase = r1;.
1b0d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b0e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b0f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
1b100 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b  py, r1, regBase+
1b110 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j);.      }.    
1b120 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
1b130 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1b140 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
1b150 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1b160 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1b170 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66   WO_IN );.    if
1b180 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
1b190 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c  tor & (WO_ISNULL
1b1a0 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20  |WO_IN))==0 ){. 
1b1b0 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
1b1c0 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  t = pTerm->pExpr
1b1d0 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
1b1e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1b1f0 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69  sNullJump(v, pRi
1b200 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20  ght, regBase+j, 
1b210 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
1b220 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66 66  ;.      if( zAff
1b230 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1b240 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1b250 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a  finity(pRight, z
1b260 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f  Aff[j])==SQLITE_
1b270 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
1b280 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20        zAff[j] = 
1b290 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1b2a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b2b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1b2c0 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
1b2d0 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
1b2e0 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  zAff[j]) ){.    
1b2f0 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20        zAff[j] = 
1b300 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1b310 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b320 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a   }.    }.  }.  *
1b330 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20  pzAff = zAff;.  
1b340 72 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a  return regBase;.
1b350 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1b360 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
1b370 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b380 65 20 69 73 20 61 20 68 65 6c 70 65 72 20 66 6f  e is a helper fo
1b390 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61  r explainIndexRa
1b3a0 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a  nge() below.**.*
1b3b0 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74 68 65  * pStr holds the
1b3c0 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78 70 72   text of an expr
1b3d0 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65 20 61  ession that we a
1b3e0 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70 20 6f  re building up o
1b3f0 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20  ne term.** at a 
1b400 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f 75 74  time.  This rout
1b410 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77 20 74  ine adds a new t
1b420 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  erm to the end o
1b430 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1b440 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65 20 73  ..** Terms are s
1b450 65 70 61 72 61 74 65 64 20 62 79 20 41 4e 44 20  eparated by AND 
1b460 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e 44 22  so add the "AND"
1b470 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f 6e 64   text for second
1b480 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0a   and subsequent.
1b490 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a  ** terms only..*
1b4a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
1b4b0 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
1b4c0 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70 53 74  .  StrAccum *pSt
1b4d0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
1b4e0 2a 20 54 68 65 20 74 65 78 74 20 65 78 70 72 65  * The text expre
1b4f0 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c  ssion being buil
1b500 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d  t */.  int iTerm
1b510 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b520 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
1b530 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72 73 74  his term.  First
1b540 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f   is zero */.  co
1b550 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
1b560 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  n,        /* Nam
1b570 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
1b580 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1b590 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20 20 20  *zOp            
1b5a0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1b5b0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20  operator */.){. 
1b5c0 20 69 66 28 20 69 54 65 72 6d 20 29 20 73 71 6c   if( iTerm ) sql
1b5d0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
1b5e0 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22  nd(pStr, " AND "
1b5f0 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  , 5);.  sqlite3S
1b600 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
1b610 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31 29  tr, zColumn, -1)
1b620 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
1b630 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
1b640 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  zOp, 1);.  sqlit
1b650 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
1b660 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a  (pStr, "?", 1);.
1b670 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
1b680 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72 69 62  t pLevel describ
1b690 65 73 20 61 20 73 74 72 61 74 65 67 79 20 66 6f  es a strategy fo
1b6a0 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65  r scanning table
1b6b0 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20   pTab. This .** 
1b6c0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1b6d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1b6e0 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 63 6f  string buffer co
1b6f0 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73 63 72  ntaining a descr
1b700 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  iption.** of the
1b710 20 73 75 62 73 65 74 20 6f 66 20 74 61 62 6c 65   subset of table
1b720 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79   rows scanned by
1b730 20 74 68 65 20 73 74 72 61 74 65 67 79 20 69 6e   the strategy in
1b740 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 0a   the form of an.
1b750 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f  ** SQL expressio
1b760 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72 6f  n. Or, if all ro
1b770 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64 2c 20  ws are scanned, 
1b780 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
1b790 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1b7a0 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72  ple, if the quer
1b7b0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  y:.**.**   SELEC
1b7c0 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
1b7d0 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a  E a=1 AND b>2;.*
1b7e0 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64 20  *.** is run and 
1b7f0 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65  there is an inde
1b800 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65  x on (a, b), the
1b810 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1b820 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72  returns a.** str
1b830 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a  ing similar to:.
1b840 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44  **.**   "a=? AND
1b850 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20   b>?".**.** The 
1b860 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72  returned pointer
1b870 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f 72   points to memor
1b880 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
1b890 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
1b8a0 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  )..** It is the 
1b8b0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
1b8c0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
1b8d0 66 72 65 65 20 74 68 65 20 62 75 66 66 65 72 20  free the buffer 
1b8e0 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e 6f  when it is.** no
1b8f0 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64   longer required
1b900 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
1b910 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61   *explainIndexRa
1b920 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  nge(sqlite3 *db,
1b930 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
1b940 70 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  p, Table *pTab){
1b950 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
1b960 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
1b970 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20  e.pIndex;.  int 
1b980 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  nEq = pLoop->u.b
1b990 74 72 65 65 2e 6e 45 71 3b 0a 20 20 69 6e 74 20  tree.nEq;.  int 
1b9a0 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  i, j;.  Column *
1b9b0 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  aCol = pTab->aCo
1b9c0 6c 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f 6c 75  l;.  int *aiColu
1b9d0 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43  mn = pIndex->aiC
1b9e0 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75  olumn;.  StrAccu
1b9f0 6d 20 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e 45  m txt;..  if( nE
1ba00 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e  q==0 && (pLoop->
1ba10 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
1ba20 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45  _BTM_LIMIT|WHERE
1ba30 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20  _TOP_LIMIT))==0 
1ba40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1ba50 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
1ba60 72 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74 2c  rAccumInit(&txt,
1ba70 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41   0, 0, SQLITE_MA
1ba80 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78 74  X_LENGTH);.  txt
1ba90 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69  .db = db;.  sqli
1baa0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
1bab0 64 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32 29  d(&txt, " (", 2)
1bac0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
1bad0 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 65 78  Eq; i++){.    ex
1bae0 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
1baf0 26 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61 69  &txt, i, aCol[ai
1bb00 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65  Column[i]].zName
1bb10 2c 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a  , "=");.  }..  j
1bb20 20 3d 20 69 3b 0a 20 20 69 66 28 20 70 4c 6f 6f   = i;.  if( pLoo
1bb30 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45  p->wsFlags&WHERE
1bb40 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
1bb50 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d    char *z = (j==
1bb60 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
1bb70 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43  ) ? "rowid" : aC
1bb80 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  ol[aiColumn[j]].
1bb90 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61  zName;.    expla
1bba0 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78  inAppendTerm(&tx
1bbb0 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b  t, i++, z, ">");
1bbc0 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70  .  }.  if( pLoop
1bbd0 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
1bbe0 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  TOP_LIMIT ){.   
1bbf0 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70   char *z = (j==p
1bc00 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
1bc10 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f   ? "rowid" : aCo
1bc20 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  l[aiColumn[j]].z
1bc30 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69  Name;.    explai
1bc40 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
1bc50 2c 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20  , i, z, "<");.  
1bc60 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  }.  sqlite3StrAc
1bc70 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20  cumAppend(&txt, 
1bc80 22 29 22 2c 20 31 29 3b 0a 20 20 72 65 74 75 72  ")", 1);.  retur
1bc90 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  n sqlite3StrAccu
1bca0 6d 46 69 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d  mFinish(&txt);.}
1bcb0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1bcc0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
1bcd0 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74 6c   unless currentl
1bce0 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20  y processing an 
1bcf0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
1bd00 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49  AN.** command. I
1bd10 66 20 74 68 65 20 71 75 65 72 79 20 62 65 69 6e  f the query bein
1bd20 67 20 63 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e  g compiled is an
1bd30 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
1bd40 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  LAN, a single.**
1bd50 20 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64   record is added
1bd60 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74   to the output t
1bd70 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74  o describe the t
1bd80 61 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65  able scan strate
1bd90 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c  gy in .** pLevel
1bda0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1bdb0 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
1bdc0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1bdd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1bde0 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
1bdf0 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
1be00 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
1be10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1be20 65 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70  e list this loop
1be30 20 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20   refers to */.  
1be40 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
1be50 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
1be60 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65  /* Scan to write
1be70 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f   OP_Explain opco
1be80 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  de for */.  int 
1be90 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  iLevel,         
1bea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1beb0 61 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22  alue for "level"
1bec0 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75   column of outpu
1bed0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
1bee0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1bef0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1bf00 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d  for "from" colum
1bf10 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20  n of output */. 
1bf20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20   u16 wctrlFlags 
1bf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf40 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
1bf50 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
1bf60 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20  Begin() */.){.  
1bf70 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
1bf80 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 73 74  ain==2 ){.    st
1bf90 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1bfa0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
1bfb0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
1bfc0 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65  iFrom];.    Vdbe
1bfd0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1bfe0 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20  dbe;      /* VM 
1bff0 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
1c000 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  d */.    sqlite3
1c010 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1c020 62 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61  b;     /* Databa
1c030 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20  se handle */.   
1c040 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20   char *zMsg;    
1c050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c060 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20 74 6f  * Text to add to
1c070 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20   EQP output */. 
1c080 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 50 61     int iId = pPa
1c090 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20  rse->iSelectId; 
1c0a0 20 2f 2a 20 53 65 6c 65 63 74 20 69 64 20 28 6c   /* Select id (l
1c0b0 65 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20  eft-most output 
1c0c0 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69  column) */.    i
1c0d0 6e 74 20 69 73 53 65 61 72 63 68 3b 20 20 20 20  nt isSearch;    
1c0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c0f0 54 72 75 65 20 66 6f 72 20 61 20 53 45 41 52 43  True for a SEARC
1c100 48 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 43 41  H. False for SCA
1c110 4e 2e 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c  N. */.    WhereL
1c120 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  oop *pLoop;     
1c130 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1c140 6f 6e 74 72 6f 6c 6c 69 6e 67 20 57 68 65 72 65  ontrolling Where
1c150 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Loop object */. 
1c160 20 20 20 75 33 32 20 66 6c 61 67 73 3b 20 20 20     u32 flags;   
1c170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c180 20 2f 2a 20 46 6c 61 67 73 20 74 68 61 74 20 64   /* Flags that d
1c190 65 73 63 72 69 62 65 20 74 68 69 73 20 6c 6f 6f  escribe this loo
1c1a0 70 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70 20  p */..    pLoop 
1c1b0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
1c1c0 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 70 4c  ;.    flags = pL
1c1d0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  oop->wsFlags;.  
1c1e0 20 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45    if( (flags&WHE
1c1f0 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20  RE_MULTI_OR) || 
1c200 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  (wctrlFlags&WHER
1c210 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
1c220 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20   ) return;..    
1c230 69 73 53 65 61 72 63 68 20 3d 20 28 66 6c 61 67  isSearch = (flag
1c240 73 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  s&(WHERE_BTM_LIM
1c250 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  IT|WHERE_TOP_LIM
1c260 49 54 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  IT))!=0.        
1c270 20 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 26 57      || ((flags&W
1c280 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1c290 45 29 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d  E)==0 && (pLoop-
1c2a0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3e 30 29 29  >u.btree.nEq>0))
1c2b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
1c2c0 28 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45  (wctrlFlags&(WHE
1c2d0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57  RE_ORDERBY_MIN|W
1c2e0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
1c2f0 29 29 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d 20  ));..    zMsg = 
1c300 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
1c310 62 2c 20 22 25 73 22 2c 20 69 73 53 65 61 72 63  b, "%s", isSearc
1c320 68 3f 22 53 45 41 52 43 48 22 3a 22 53 43 41 4e  h?"SEARCH":"SCAN
1c330 22 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ");.    if( pIte
1c340 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
1c350 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1c360 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1c370 4d 73 67 2c 20 22 25 73 20 53 55 42 51 55 45 52  Msg, "%s SUBQUER
1c380 59 20 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74 65  Y %d", zMsg,pIte
1c390 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20  m->iSelectId);. 
1c3a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c3b0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1c3c0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1c3d0 20 22 25 73 20 54 41 42 4c 45 20 25 73 22 2c 20   "%s TABLE %s", 
1c3e0 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  zMsg, pItem->zNa
1c3f0 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  me);.    }..    
1c400 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  if( pItem->zAlia
1c410 73 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20  s ){.      zMsg 
1c420 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1c430 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
1c440 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49  AS %s", zMsg, pI
1c450 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1c460 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61    }.    if( (fla
1c470 67 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c  gs & (WHERE_IPK|
1c480 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
1c490 4c 45 29 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  LE))==0.     && 
1c4a0 41 4c 57 41 59 53 28 70 4c 6f 6f 70 2d 3e 75 2e  ALWAYS(pLoop->u.
1c4b0 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 29  btree.pIndex!=0)
1c4c0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68  .    ){.      ch
1c4d0 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 65 78 70  ar *zWhere = exp
1c4e0 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 64  lainIndexRange(d
1c4f0 62 2c 20 70 4c 6f 6f 70 2c 20 70 49 74 65 6d 2d  b, pLoop, pItem-
1c500 3e 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d  >pTab);.      zM
1c510 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1c520 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 0a 20  endf(db, zMsg,. 
1c530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
1c540 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  flags & WHERE_AU
1c550 54 4f 5f 49 4e 44 45 58 29 20 3f 20 0a 20 20 20  TO_INDEX) ? .   
1c560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c570 22 25 73 20 55 53 49 4e 47 20 41 55 54 4f 4d 41  "%s USING AUTOMA
1c580 54 49 43 20 25 73 49 4e 44 45 58 25 2e 30 73 25  TIC %sINDEX%.0s%
1c590 73 22 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20  s" :.           
1c5a0 20 20 20 20 20 20 20 20 22 25 73 20 55 53 49 4e          "%s USIN
1c5b0 47 20 25 73 49 4e 44 45 58 20 25 73 25 73 22 29  G %sINDEX %s%s")
1c5c0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1c5d0 20 20 7a 4d 73 67 2c 20 28 28 66 6c 61 67 73 20    zMsg, ((flags 
1c5e0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
1c5f0 29 20 3f 20 22 43 4f 56 45 52 49 4e 47 20 22 20  ) ? "COVERING " 
1c600 3a 20 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20  : ""),.         
1c610 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62        pLoop->u.b
1c620 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61  tree.pIndex->zNa
1c630 6d 65 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20  me, zWhere);.   
1c640 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1c650 28 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20  (db, zWhere);.  
1c660 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61    }else if( (fla
1c670 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21  gs & WHERE_IPK)!
1c680 3d 30 20 26 26 20 28 66 6c 61 67 73 20 26 20 57  =0 && (flags & W
1c690 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29  HERE_CONSTRAINT)
1c6a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73  !=0 ){.      zMs
1c6b0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
1c6c0 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
1c6d0 73 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20  s USING INTEGER 
1c6e0 50 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d  PRIMARY KEY", zM
1c6f0 73 67 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  sg);..      if( 
1c700 66 6c 61 67 73 26 28 57 48 45 52 45 5f 43 4f 4c  flags&(WHERE_COL
1c710 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c  UMN_EQ|WHERE_COL
1c720 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20  UMN_IN) ){.     
1c730 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1c740 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1c750 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3d 3f  sg, "%s (rowid=?
1c760 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
1c770 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67   }else if( (flag
1c780 73 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d  s&WHERE_BOTH_LIM
1c790 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f  IT)==WHERE_BOTH_
1c7a0 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20  LIMIT ){.       
1c7b0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1c7c0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1c7d0 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 20 41  , "%s (rowid>? A
1c7e0 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d  ND rowid<?)", zM
1c7f0 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sg);.      }else
1c800 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45   if( flags&WHERE
1c810 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
1c820 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1c830 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1c840 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
1c850 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d>?)", zMsg);.  
1c860 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
1c870 57 41 59 53 28 66 6c 61 67 73 26 57 48 45 52 45  WAYS(flags&WHERE
1c880 5f 54 4f 50 5f 4c 49 4d 49 54 29 20 29 7b 0a 20  _TOP_LIMIT) ){. 
1c890 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
1c8a0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1c8b0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77  , zMsg, "%s (row
1c8c0 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id<?)", zMsg);. 
1c8d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
1c8e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c8f0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
1c900 20 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67    else if( (flag
1c910 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
1c920 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
1c930 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1c940 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1c950 4d 73 67 2c 20 22 25 73 20 56 49 52 54 55 41 4c  Msg, "%s VIRTUAL
1c960 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a   TABLE INDEX %d:
1c970 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20  %s", zMsg,.     
1c980 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
1c990 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75  op->u.vtab.idxNu
1c9a0 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  m, pLoop->u.vtab
1c9b0 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a  .idxStr);.    }.
1c9c0 23 65 6e 64 69 66 0a 20 20 20 20 7a 4d 73 67 20  #endif.    zMsg 
1c9d0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1c9e0 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 22  f(db, zMsg, "%s"
1c9f0 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  , zMsg);.    sql
1ca00 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1ca10 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49  , OP_Explain, iI
1ca20 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d  d, iLevel, iFrom
1ca30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
1ca40 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
1ca50 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
1ca60 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78  nOneScan(u,v,w,x
1ca70 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
1ca80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
1ca90 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47  AIN */.../*.** G
1caa0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1cab0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1cac0 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70  e iLevel-th loop
1cad0 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
1cae0 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  ause.** implemen
1caf0 74 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  tation described
1cb00 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73   by pWInfo..*/.s
1cb10 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f  tatic Bitmask co
1cb20 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a  deOneLoopStart(.
1cb30 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
1cb40 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65  nfo,   /* Comple
1cb50 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  te information a
1cb60 62 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63  bout the WHERE c
1cb70 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
1cb80 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
1cb90 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f  /* Which level o
1cba0 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68  f pWInfo->a[] sh
1cbb0 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f  ould be coded */
1cbc0 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
1cbd0 61 64 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68  ady     /* Which
1cbe0 20 74 61 62 6c 65 73 20 61 72 65 20 63 75 72 72   tables are curr
1cbf0 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20  ently available 
1cc00 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b  */.){.  int j, k
1cc10 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1cc20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
1cc30 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
1cc40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
1cc50 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
1cc60 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
1cc70 74 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20  t addrNxt;      
1cc80 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a     /* Where to j
1cc90 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ump to continue 
1cca0 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
1ccb0 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   case */.  int o
1ccc0 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20  mitTable;       
1ccd0 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73  /* True if we us
1cce0 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79  e the index only
1ccf0 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20   */.  int bRev; 
1cd00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1cd10 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ue if we need to
1cd20 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   scan in reverse
1cd30 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72   order */.  Wher
1cd40 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
1cd50 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65   /* The where le
1cd60 76 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20  vel to be coded 
1cd70 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
1cd80 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65  pLoop;    /* The
1cd90 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1cda0 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
1cdb0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
1cdc0 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d  pWC;    /* Decom
1cdd0 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
1cde0 65 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c 61  entire WHERE cla
1cdf0 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  use */.  WhereTe
1ce00 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
1ce10 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48           /* A WH
1ce20 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
1ce30 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
1ce40 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
1ce50 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1ce60 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
1ce70 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
1ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ce90 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
1cea0 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ion */.  Vdbe *v
1ceb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cec0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ced0 70 72 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e  prepared stmt un
1cee0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1cef0 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
1cf00 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
1cf10 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63  Item;  /* FROM c
1cf20 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67  lause term being
1cf30 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
1cf40 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20  addrBrk;        
1cf50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
1cf60 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
1cf70 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  k out of the loo
1cf80 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
1cf90 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ont;            
1cfa0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
1cfb0 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
1cfc0 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20  with next cycle 
1cfd0 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52  */.  int iRowidR
1cfe0 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  eg = 0;        /
1cff0 2a 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65  * Rowid is store
1d000 64 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  d in this regist
1d010 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20  er, if not zero 
1d020 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73  */.  int iReleas
1d030 65 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f  eReg = 0;      /
1d040 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20  * Temp register 
1d050 74 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20 72  to free before r
1d060 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 20 20 42 69  eturning */.  Bi
1d070 74 6d 61 73 6b 20 6e 65 77 4e 6f 74 52 65 61 64  tmask newNotRead
1d080 79 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  y;      /* Retur
1d090 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 70 50  n value */..  pP
1d0a0 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
1d0b0 50 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61  Parse;.  v = pPa
1d0c0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57  rse->pVdbe;.  pW
1d0d0 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
1d0e0 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
1d0f0 3e 64 62 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20  >db;.  pLevel = 
1d100 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65  &pWInfo->a[iLeve
1d110 6c 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  l];.  pLoop = pL
1d120 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
1d130 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e  pTabItem = &pWIn
1d140 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
1d150 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
1d160 20 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65    iCur = pTabIte
1d170 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 62 52  m->iCursor;.  bR
1d180 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65  ev = (pWInfo->re
1d190 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31  vMask>>iLevel)&1
1d1a0 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20  ;.  omitTable = 
1d1b0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1d1c0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
1d1d0 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )!=0 .          
1d1e0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
1d1f0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1d200 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b  FORCE_TABLE)==0;
1d210 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1d220 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 4a 6f  nt((v, "Begin Jo
1d230 69 6e 20 4c 6f 6f 70 20 25 64 22 2c 20 69 4c 65  in Loop %d", iLe
1d240 76 65 6c 29 29 3b 0a 0a 20 20 2f 2a 20 43 72 65  vel));..  /* Cre
1d250 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20 74  ate labels for t
1d260 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20 22  he "break" and "
1d270 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72 75  continue" instru
1d280 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20  ctions.  ** for 
1d290 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
1d2a0 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64 64 72 42  .  Jump to addrB
1d2b0 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  rk to break out 
1d2c0 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20  of a loop..  ** 
1d2d0 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20  Jump to cont to 
1d2e0 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  go immediately t
1d2f0 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
1d300 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tion of the.  **
1d310 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   loop..  **.  **
1d320 20 57 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   When there is a
1d330 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77  n IN operator, w
1d340 65 20 61 6c 73 6f 20 68 61 76 65 20 61 20 22 61  e also have a "a
1d350 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 20 74 68  ddrNxt" label th
1d360 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f  at.  ** means to
1d370 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74   continue with t
1d380 68 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75 65  he next IN value
1d390 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57   combination.  W
1d3a0 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20 61  hen.  ** there a
1d3b0 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f  re no IN operato
1d3c0 72 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72  rs in the constr
1d3d0 61 69 6e 74 73 2c 20 74 68 65 20 22 61 64 64 72  aints, the "addr
1d3e0 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20  Nxt" label.  ** 
1d3f0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 22  is the same as "
1d400 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20  addrBrk"..  */. 
1d410 20 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65   addrBrk = pLeve
1d420 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c 65  l->addrBrk = pLe
1d430 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73  vel->addrNxt = s
1d440 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1d450 62 65 6c 28 76 29 3b 0a 20 20 61 64 64 72 43 6f  bel(v);.  addrCo
1d460 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  nt = pLevel->add
1d470 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  rCont = sqlite3V
1d480 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1d490 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1d4a0 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  s the right tabl
1d4b0 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  e of a LEFT OUTE
1d4c0 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65  R JOIN, allocate
1d4d0 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61   and.  ** initia
1d4e0 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65  lize a memory ce
1d4f0 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73 20  ll that records 
1d500 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61  if this table ma
1d510 74 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72  tches any.  ** r
1d520 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74  ow of the left t
1d530 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
1d540 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65  ..  */.  if( pLe
1d550 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20  vel->iFrom>0 && 
1d560 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69  (pTabItem[0].joi
1d570 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
1d580 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65 76 65  !=0 ){.    pLeve
1d590 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b  l->iLeftJoin = +
1d5a0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1d5b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d5c0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1d5d0 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69  er, 0, pLevel->i
1d5e0 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56  LeftJoin);.    V
1d5f0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1d600 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e  init LEFT JOIN n
1d610 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b  o-match flag"));
1d620 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69  .  }..  /* Speci
1d630 61 6c 20 63 61 73 65 20 6f 66 20 61 20 46 52 4f  al case of a FRO
1d640 4d 20 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M clause subquer
1d650 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  y implemented as
1d660 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f   a co-routine */
1d670 0a 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d  .  if( pTabItem-
1d680 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b  >viaCoroutine ){
1d690 0a 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c  .    int regYiel
1d6a0 64 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72 65  d = pTabItem->re
1d6b0 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c  gReturn;.    sql
1d6c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d6d0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54  , OP_Integer, pT
1d6e0 61 62 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c  abItem->addrFill
1d6f0 53 75 62 2d 31 2c 20 72 65 67 59 69 65 6c 64 29  Sub-1, regYield)
1d700 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
1d710 20 3d 20 20 73 71 6c 69 74 65 33 56 64 62 65 41   =  sqlite3VdbeA
1d720 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
1d730 64 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20  d, regYield);.  
1d740 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1d750 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 63  , "next row of c
1d760 6f 2d 72 6f 75 74 69 6e 65 20 25 73 22 2c 20 70  o-routine %s", p
1d770 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  TabItem->pTab->z
1d780 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73 71 6c 69  Name));.    sqli
1d790 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d7a0 20 4f 50 5f 49 66 2c 20 72 65 67 59 69 65 6c 64   OP_If, regYield
1d7b0 2b 31 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20  +1, addrBrk);.  
1d7c0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
1d7d0 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65 0a  P_Goto;.  }else.
1d7e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d7f0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1d800 45 0a 20 20 69 66 28 20 20 28 70 4c 6f 6f 70 2d  E.  if(  (pLoop-
1d810 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1d820 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
1d830 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  0 ){.    /* Case
1d840 20 31 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69   1:  The table i
1d850 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c  s a virtual-tabl
1d860 65 2e 20 20 55 73 65 20 74 68 65 20 56 46 69 6c  e.  Use the VFil
1d870 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20  ter and VNext.  
1d880 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f    **          to
1d890 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
1d8a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
1d8b0 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56   iReg;   /* P3 V
1d8c0 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c  alue for OP_VFil
1d8d0 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  ter */.    int a
1d8e0 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20 20  ddrNotFound;.   
1d8f0 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
1d900 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d   = pLoop->nLTerm
1d910 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ;..    sqlite3Ex
1d920 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
1d930 73 65 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20  se);.    iReg = 
1d940 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
1d950 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e  nge(pParse, nCon
1d960 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20  straint+2);.    
1d970 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70  addrNotFound = p
1d980 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a  Level->addrBrk;.
1d990 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
1d9a0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29  Constraint; j++)
1d9b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 72  {.      int iTar
1d9c0 67 65 74 20 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a  get = iReg+j+2;.
1d9d0 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c        pTerm = pL
1d9e0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a  oop->aLTerm[j];.
1d9f0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
1da00 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1da10 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
1da20 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
1da30 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  N ){.        cod
1da40 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
1da50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65  arse, pTerm, pLe
1da60 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 69 54  vel, j, bRev, iT
1da70 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1da80 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70  addrNotFound = p
1da90 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a  Level->addrNxt;.
1daa0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1dab0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1dac0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 54 65  Code(pParse, pTe
1dad0 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
1dae0 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20  t, iTarget);.   
1daf0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
1db00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1db10 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1db20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
1db30 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20  xNum, iReg);.   
1db40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1db50 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1db60 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 69  , nConstraint, i
1db70 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69  Reg+1);.    sqli
1db80 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1db90 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75   OP_VFilter, iCu
1dba0 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 2c  r, addrNotFound,
1dbb0 20 69 52 65 67 2c 0a 20 20 20 20 20 20 20 20 20   iReg,.         
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
1dbd0 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  op->u.vtab.idxSt
1dbe0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
1dbf0 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
1dc00 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
1dc10 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50  ? P4_MPRINTF : P
1dc20 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 70  4_STATIC);.    p
1dc30 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  Loop->u.vtab.nee
1dc40 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 66  dFree = 0;.    f
1dc50 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74  or(j=0; j<nConst
1dc60 72 61 69 6e 74 20 26 26 20 6a 3c 31 36 3b 20 6a  raint && j<16; j
1dc70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
1dc80 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  pLoop->u.vtab.om
1dc90 69 74 4d 61 73 6b 3e 3e 6a 29 26 31 20 29 7b 0a  itMask>>j)&1 ){.
1dca0 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
1dcb0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4c 6f 6f  erm(pLevel, pLoo
1dcc0 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 29 3b 0a 20  p->aLTerm[j]);. 
1dcd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1dce0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1dcf0 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76  _VNext;.    pLev
1dd00 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
1dd10 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
1dd20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1dd30 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73  ntAddr(v);.    s
1dd40 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1dd50 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  pRange(pParse, i
1dd60 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  Reg, nConstraint
1dd70 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +2);.    sqlite3
1dd80 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
1dd90 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  rse, 1);.  }else
1dda0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1ddb0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1ddc0 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70  BLE */..  if( (p
1ddd0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1dde0 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20  WHERE_IPK)!=0.  
1ddf0 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
1de00 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c  ags & (WHERE_COL
1de10 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c  UMN_IN|WHERE_COL
1de20 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20 20 29 7b  UMN_EQ))!=0.  ){
1de30 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20  .    /* Case 2: 
1de40 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79   We can directly
1de50 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e   reference a sin
1de60 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e  gle row using an
1de70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1de80 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72   equality compar
1de90 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65  ison against the
1dea0 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f   ROWID field.  O
1deb0 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  r.    **        
1dec0 20 20 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d    we reference m
1ded0 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69  ultiple rows usi
1dee0 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28  ng a "rowid IN (
1def0 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20  ...)".    **    
1df00 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e        construct.
1df10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1df20 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  rt( pLoop->u.btr
1df30 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20 20 20  ee.nEq==1 );.   
1df40 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73   iReleaseReg = s
1df50 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
1df60 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 54  (pParse);.    pT
1df70 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  erm = pLoop->aLT
1df80 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65  erm[0];.    asse
1df90 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
1dfa0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
1dfb0 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  m->pExpr!=0 );. 
1dfc0 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
1dfd0 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74  able==0 );.    t
1dfe0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
1dff0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1e000 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 69 52  IRTUAL );.    iR
1e010 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71  owidReg = codeEq
1e020 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
1e030 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
1e040 2c 20 30 2c 20 62 52 65 76 2c 20 69 52 65 6c 65  , 0, bRev, iRele
1e050 61 73 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64  aseReg);.    add
1e060 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rNxt = pLevel->a
1e070 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69  ddrNxt;.    sqli
1e080 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e090 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
1e0a0 52 6f 77 69 64 52 65 67 2c 20 61 64 64 72 4e 78  RowidReg, addrNx
1e0b0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
1e0c0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1e0d0 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c  NotExists, iCur,
1e0e0 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64   addrNxt, iRowid
1e0f0 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Reg);.    sqlite
1e100 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1e110 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
1e120 20 69 52 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a   iRowidReg, 1);.
1e130 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1e140 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
1e150 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77  , iCur, -1, iRow
1e160 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65  idReg);.    Vdbe
1e170 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22  Comment((v, "pk"
1e180 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ));.    pLevel->
1e190 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  op = OP_Noop;.  
1e1a0 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f 70  }else if( (pLoop
1e1b0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1e1c0 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 20 20 20  E_IPK)!=0.      
1e1d0 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
1e1e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
1e1f0 4c 55 4d 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20  LUMN_RANGE)!=0. 
1e200 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
1e210 33 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20 69  3:  We have an i
1e220 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72  nequality compar
1e230 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65  ison against the
1e240 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20   ROWID field..  
1e250 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73    */.    int tes
1e260 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  tOp = OP_Noop;. 
1e270 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20     int start;.  
1e280 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75    int memEndValu
1e290 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65  e = 0;.    Where
1e2a0 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70  Term *pStart, *p
1e2b0 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  End;..    assert
1e2c0 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
1e2d0 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20  ;.    j = 0;.   
1e2e0 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 20 3d   pStart = pEnd =
1e2f0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f   0;.    if( pLoo
1e300 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1e310 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70  RE_BTM_LIMIT ) p
1e320 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61  Start = pLoop->a
1e330 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20  LTerm[j++];.    
1e340 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1e350 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
1e360 49 4d 49 54 20 29 20 70 45 6e 64 20 3d 20 70 4c  IMIT ) pEnd = pL
1e370 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
1e380 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
1e390 74 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21  tart!=0 || pEnd!
1e3a0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 62 52  =0 );.    if( bR
1e3b0 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  ev ){.      pTer
1e3c0 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20  m = pStart;.    
1e3d0 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b    pStart = pEnd;
1e3e0 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54  .      pEnd = pT
1e3f0 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  erm;.    }.    i
1e400 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
1e410 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20     Expr *pX;    
1e420 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e430 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
1e440 64 65 66 69 6e 65 73 20 74 68 65 20 73 74 61 72  defines the star
1e450 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  t bound */.     
1e460 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20   int r1, rTemp; 
1e470 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
1e480 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20  ers for holding 
1e490 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61  the start bounda
1e4a0 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  ry */..      /* 
1e4b0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
1e4c0 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78  nstant maps TK_x
1e4d0 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72  x codes into cor
1e4e0 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20  responding .    
1e4f0 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65    ** seek opcode
1e500 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f  s.  It depends o
1e510 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f  n a particular o
1e520 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78  rdering of TK_xx
1e530 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1e540 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70  const u8 aMoveOp
1e550 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
1e560 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f    /* TK_GT */  O
1e570 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20 20 20  P_SeekGt,.      
1e580 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f       /* TK_LE */
1e590 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20 20 20    OP_SeekLe,.   
1e5a0 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54          /* TK_LT
1e5b0 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a   */  OP_SeekLt,.
1e5c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
1e5d0 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47  _GE */  OP_SeekG
1e5e0 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  e.      };.     
1e5f0 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d   assert( TK_LE==
1e600 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20  TK_GT+1 );      
1e610 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
1e620 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20   ordering.. */. 
1e630 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1e640 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20  LT==TK_GT+2 );  
1e650 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74      /*  ... of t
1e660 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e  he TK_xx values.
1e670 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  .. */.      asse
1e680 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54  rt( TK_GE==TK_GT
1e690 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e  +3 );      /*  .
1e6a0 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20  .. is correcct. 
1e6b0 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  */..      assert
1e6c0 28 20 28 70 53 74 61 72 74 2d 3e 77 74 46 6c 61  ( (pStart->wtFla
1e6d0 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
1e6e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1e6f0 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77  tcase( pStart->w
1e700 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
1e710 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 70  RTUAL );.      p
1e720 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70  X = pStart->pExp
1e730 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
1e740 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   pX!=0 );.      
1e750 74 65 73 74 63 61 73 65 28 20 70 53 74 61 72 74  testcase( pStart
1e760 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43  ->leftCursor!=iC
1e770 75 72 20 29 3b 20 2f 2a 20 74 72 61 6e 73 69 74  ur ); /* transit
1e780 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ive constraints 
1e790 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  */.      r1 = sq
1e7a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1e7b0 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  p(pParse, pX->pR
1e7c0 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20  ight, &rTemp);. 
1e7d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e7e0 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f  AddOp3(v, aMoveO
1e7f0 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c  p[pX->op-TK_GT],
1e800 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20   iCur, addrBrk, 
1e810 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  r1);.      VdbeC
1e820 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
1e830 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e840 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1e850 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
1e860 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  r1, 1);.      sq
1e870 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1e880 52 65 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d  Reg(pParse, rTem
1e890 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c  p);.      disabl
1e8a0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53  eTerm(pLevel, pS
1e8b0 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  tart);.    }else
1e8c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1e8d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65  dbeAddOp2(v, bRe
1e8e0 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50  v ? OP_Last : OP
1e8f0 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61  _Rewind, iCur, a
1e900 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20  ddrBrk);.    }. 
1e910 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20     if( pEnd ){. 
1e920 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20       Expr *pX;. 
1e930 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e       pX = pEnd->
1e940 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
1e950 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
1e960 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45 6e      assert( (pEn
1e970 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
1e980 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20  M_VNULL)==0 );. 
1e990 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1e9a0 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  End->leftCursor!
1e9b0 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54 72 61 6e  =iCur ); /* Tran
1e9c0 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e  sitive constrain
1e9d0 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ts */.      test
1e9e0 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c  case( pEnd->wtFl
1e9f0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1ea00 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45  AL );.      memE
1ea10 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72  ndValue = ++pPar
1ea20 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1ea30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1ea40 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
1ea50 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29  ht, memEndValue)
1ea60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
1ea70 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
1ea80 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op==TK_GT ){.  
1ea90 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
1eaa0 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50  Rev ? OP_Le : OP
1eab0 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _Ge;.      }else
1eac0 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
1ead0 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20   = bRev ? OP_Lt 
1eae0 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d  : OP_Gt;.      }
1eaf0 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
1eb00 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29  rm(pLevel, pEnd)
1eb10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72  ;.    }.    star
1eb20 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
1eb30 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1eb40 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1eb50 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
1eb60 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c   OP_Next;.    pL
1eb70 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
1eb80 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1eb90 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61 73 73  = start;.    ass
1eba0 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d  ert( pLevel->p5=
1ebb0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 74 65  =0 );.    if( te
1ebc0 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
1ebd0 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
1ebe0 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d   = iReleaseReg =
1ebf0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1ec00 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
1ec10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ec20 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
1ec30 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67   iCur, iRowidReg
1ec40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ec50 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
1ec60 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
1ec70 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1ec80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ec90 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20  dOp3(v, testOp, 
1eca0 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64  memEndValue, add
1ecb0 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29  rBrk, iRowidReg)
1ecc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1ecd0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
1ece0 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
1ecf0 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  C | SQLITE_JUMPI
1ed00 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  FNULL);.    }.  
1ed10 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d  }else if( pLoop-
1ed20 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1ed30 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
1ed40 2f 2a 20 43 61 73 65 20 34 3a 20 41 20 73 63 61  /* Case 4: A sca
1ed50 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  n using an index
1ed60 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1ed70 20 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52          The WHER
1ed80 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e  E clause may con
1ed90 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  tain zero or mor
1eda0 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20  e equality .    
1edb0 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d 73  **         terms
1edc0 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f   ("==" or "IN" o
1edd0 70 65 72 61 74 6f 72 73 29 20 74 68 61 74 20 72  perators) that r
1ede0 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20  efer to the N.  
1edf0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66    **         lef
1ee00 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f  t-most columns o
1ee10 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20  f the index. It 
1ee20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
1ee30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ee40 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1ee50 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d  raints (>, <, >=
1ee60 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69   or <=) on the i
1ee70 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20  ndexed.    **   
1ee80 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61        column tha
1ee90 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  t immediately fo
1eea0 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61  llows the N equa
1eeb0 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20  lities. Only .  
1eec0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65    **         the
1eed0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75   right-most colu
1eee0 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65  mn can be an ine
1eef0 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65  quality - the re
1ef00 73 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20  st must.    **  
1ef10 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22         use the "
1ef20 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65  ==" and "IN" ope
1ef30 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d  rators. For exam
1ef40 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20  ple, if the .   
1ef50 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65   **         inde
1ef60 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c  x is on (x,y,z),
1ef70 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   then the follow
1ef80 69 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20  ing clauses are 
1ef90 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  all .    **     
1efa0 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20      optimized:. 
1efb0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1efc0 20 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20          x=5.    
1efd0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
1efe0 35 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a  5 AND y=10.    *
1eff0 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1f000 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
1f010 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1f020 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30  AND y>5 AND y<10
1f030 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f040 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41     x=5 AND y=5 A
1f050 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a  ND z<=10.    **.
1f060 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
1f070 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20  he z<10 term of 
1f080 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  the following ca
1f090 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e  nnot be used, on
1f0a0 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ly.    **       
1f0b0 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a    the x=5 term:.
1f0c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1f0d0 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
1f0e0 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20   z<10.    **.   
1f0f0 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61   **         N ma
1f100 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65  y be zero if the
1f110 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74  re are inequalit
1f120 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20  y constraints.. 
1f130 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66     **         If
1f140 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e   there are no in
1f150 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1f160 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20  ints, then N is 
1f170 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  at.    **       
1f180 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20    least one..   
1f190 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1f1a0 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20     This case is 
1f1b0 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74  also used when t
1f1c0 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52  here are no WHER
1f1d0 45 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  E clause.    ** 
1f1e0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69          constrai
1f1f0 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78  nts but an index
1f200 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79   is selected any
1f210 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20  way, in order.  
1f220 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20    **         to 
1f230 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74  force the output
1f240 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72   order to confor
1f250 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59  m to an ORDER BY
1f260 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73  ..    */  .    s
1f270 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
1f280 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20  StartOp[] = {.  
1f290 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a      0,.      0,.
1f2a0 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c        OP_Rewind,
1f2b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a             /* 2:
1f2c0 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61   (!start_constra
1f2d0 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20  ints && startEq 
1f2e0 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20  &&  !bRev) */.  
1f2f0 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20      OP_Last,    
1f300 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28           /* 3: (
1f310 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  !start_constrain
1f320 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26  ts && startEq &&
1f330 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20     bRev) */.    
1f340 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20 20    OP_SeekGt,    
1f350 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74         /* 4: (st
1f360 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1f370 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20   && !startEq && 
1f380 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
1f390 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20 20  OP_SeekLt,      
1f3a0 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72       /* 5: (star
1f3b0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
1f3c0 26 20 21 73 74 61 72 74 45 71 20 26 26 20 20 62  & !startEq &&  b
1f3d0 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
1f3e0 5f 53 65 65 6b 47 65 2c 20 20 20 20 20 20 20 20  _SeekGe,        
1f3f0 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f     /* 6: (start_
1f400 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
1f410 20 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65   startEq && !bRe
1f420 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
1f430 65 65 6b 4c 65 20 20 20 20 20 20 20 20 20 20 20  eekLe           
1f440 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f   /* 7: (start_co
1f450 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73  nstraints  &&  s
1f460 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29  tartEq &&  bRev)
1f470 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73   */.    };.    s
1f480 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
1f490 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  EndOp[] = {.    
1f4a0 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20    OP_Noop,      
1f4b0 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65         /* 0: (!e
1f4c0 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20  nd_constraints) 
1f4d0 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47  */.      OP_IdxG
1f4e0 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  E,            /*
1f4f0 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   1: (end_constra
1f500 69 6e 74 73 20 26 26 20 21 62 52 65 76 29 20 2a  ints && !bRev) *
1f510 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54  /.      OP_IdxLT
1f520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f530 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  2: (end_constrai
1f540 6e 74 73 20 26 26 20 62 52 65 76 29 20 2a 2f 0a  nts && bRev) */.
1f550 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e      };.    int n
1f560 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Eq = pLoop->u.bt
1f570 72 65 65 2e 6e 45 71 3b 20 20 2f 2a 20 4e 75 6d  ree.nEq;  /* Num
1f580 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20  ber of == or IN 
1f590 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74  terms */.    int
1f5a0 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b   isMinQuery = 0;
1f5b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1f5c0 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74  f this is an opt
1f5d0 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69  imized SELECT mi
1f5e0 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e  n(x).. */.    in
1f5f0 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
1f600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61             /* Ba
1f610 73 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  se register hold
1f620 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  ing constraint v
1f630 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  alues */.    int
1f640 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   r1;            
1f650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
1f660 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  p register */.  
1f670 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
1f680 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f  ngeStart = 0;  /
1f690 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
1f6a0 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
1f6b0 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68   start */.    Wh
1f6c0 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45  ereTerm *pRangeE
1f6d0 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e  nd = 0;    /* In
1f6e0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1f6f0 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64  int at range end
1f700 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72   */.    int star
1f710 74 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  tEq;            
1f720 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1f730 72 61 6e 67 65 20 73 74 61 72 74 20 75 73 65 73  range start uses
1f740 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
1f750 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20  .    int endEq; 
1f760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f770 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e    /* True if ran
1f780 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20  ge end uses ==, 
1f790 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20  >= or <= */.    
1f7a0 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72  int start_constr
1f7b0 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20  aints;       /* 
1f7c0 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69  Start of range i
1f7d0 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f  s constrained */
1f7e0 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  .    int nConstr
1f7f0 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  aint;           
1f800 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1f810 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
1f820 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
1f830 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
1f840 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
1f850 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
1f860 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  g */.    int iId
1f870 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  xCur;           
1f880 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
1f890 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
1f8a0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
1f8b0 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b  t nExtraReg = 0;
1f8c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1f8d0 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
1f8e0 67 69 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a  gisters needed *
1f8f0 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20  /.    int op;   
1f900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f910 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f     /* Instructio
1f920 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  n opcode */.    
1f930 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66 3b  char *zStartAff;
1f940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f950 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74 61  Affinity for sta
1f960 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  rt of range cons
1f970 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68  traint */.    ch
1f980 61 72 20 2a 7a 45 6e 64 41 66 66 3b 20 20 20 20  ar *zEndAff;    
1f990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
1f9a0 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20 6f  finity for end o
1f9b0 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  f range constrai
1f9c0 6e 74 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20  nt */..    pIdx 
1f9d0 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
1f9e0 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 49 64  .pIndex;.    iId
1f9f0 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
1fa00 49 64 78 43 75 72 3b 0a 0a 20 20 20 20 2f 2a 20  IdxCur;..    /* 
1fa10 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74  If this loop sat
1fa20 69 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72  isfies a sort or
1fa30 64 65 72 20 28 70 4f 72 64 65 72 42 79 29 20 72  der (pOrderBy) r
1fa40 65 71 75 65 73 74 20 74 68 61 74 20 0a 20 20 20  equest that .   
1fa50 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20 74   ** was passed t
1fa60 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
1fa70 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22  to implement a "
1fa80 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e  SELECT min(x) ..
1fa90 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79  ." .    ** query
1faa0 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
1fab0 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f  r will only allo
1fac0 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75  w the loop to ru
1fad0 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73  n for.    ** a s
1fae0 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e  ingle iteration.
1faf0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
1fb00 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 72   the first row r
1fb10 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73  eturned.    ** s
1fb20 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61  hould not have a
1fb30 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72   NULL value stor
1fb40 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f  ed in 'x'. If co
1fb50 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20  lumn 'x' is.    
1fb60 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65  ** the first one
1fb70 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 65   after the nEq e
1fb80 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1fb90 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  nts in the index
1fba0 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65  ,.    ** this re
1fbb0 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63  quires some spec
1fbc0 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20  ial handling..  
1fbd0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 57    */.    if( (pW
1fbe0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
1fbf0 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  &WHERE_ORDERBY_M
1fc00 49 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  IN)!=0.     && (
1fc10 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 21 3d  pWInfo->bOBSat!=
1fc20 30 29 0a 20 20 20 20 20 26 26 20 28 70 49 64 78  0).     && (pIdx
1fc30 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20  ->nColumn>nEq). 
1fc40 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61     ){.      /* a
1fc50 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d  ssert( pOrderBy-
1fc60 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a  >nExpr==1 ); */.
1fc70 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
1fc80 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e   pOrderBy->a[0].
1fc90 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
1fca0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
1fcb0 45 71 5d 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20  Eq] ); */.      
1fcc0 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a  isMinQuery = 1;.
1fcd0 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20        nExtraReg 
1fce0 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
1fcf0 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65 71  /* Find any ineq
1fd00 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1fd10 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20  t terms for the 
1fd20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a 20  start and end . 
1fd30 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e     ** of the ran
1fd40 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ge. .    */.    
1fd50 6a 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28  j = nEq;.    if(
1fd60 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1fd70 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
1fd80 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67  T ){.      pRang
1fd90 65 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e  eStart = pLoop->
1fda0 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20  aLTerm[j++];.   
1fdb0 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31     nExtraReg = 1
1fdc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1fdd0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1fde0 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
1fdf0 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65   ){.      pRange
1fe00 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  End = pLoop->aLT
1fe10 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20  erm[j++];.      
1fe20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
1fe30 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e     }..    /* Gen
1fe40 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
1fe50 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74  aluate all const
1fe60 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e  raint terms usin
1fe70 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a  g == or IN.    *
1fe80 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
1fe90 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20  values of those 
1fea0 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61  terms in an arra
1feb0 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20  y of registers. 
1fec0 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
1fed0 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a  t regBase..    *
1fee0 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  /.    regBase = 
1fef0 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54  codeAllEqualityT
1ff00 65 72 6d 73 28 70 50 61 72 73 65 2c 70 4c 65 76  erms(pParse,pLev
1ff10 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72 61 52 65  el,bRev,nExtraRe
1ff20 67 2c 26 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  g,&zStartAff);. 
1ff30 20 20 20 7a 45 6e 64 41 66 66 20 3d 20 73 71 6c     zEndAff = sql
1ff40 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
1ff50 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20   zStartAff);.   
1ff60 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65   addrNxt = pLeve
1ff70 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20  l->addrNxt;..   
1ff80 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
1ff90 69 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72  ing a reverse or
1ffa0 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61  der scan on an a
1ffb0 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20  scending index, 
1ffc0 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77  or.    ** a forw
1ffd0 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f  ard order scan o
1ffe0 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69  n a descending i
1fff0 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67  ndex, interchang
20000 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74  e the .    ** st
20010 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d  art and end term
20020 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61  s (pRangeStart a
20030 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20  nd pRangeEnd).. 
20040 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e     */.    if( (n
20050 45 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  Eq<pIdx->nColumn
20060 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d   && bRev==(pIdx-
20070 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
20080 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29  ==SQLITE_SO_ASC)
20090 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76 20  ).     || (bRev 
200a0 26 26 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  && pIdx->nColumn
200b0 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  ==nEq).    ){.  
200c0 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65      SWAP(WhereTe
200d0 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c  rm *, pRangeEnd,
200e0 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20   pRangeStart);. 
200f0 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61     }..    testca
20100 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  se( pRangeStart 
20110 26 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d  && (pRangeStart-
20120 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
20130 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  LE)!=0 );.    te
20140 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
20150 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74  art && (pRangeSt
20160 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
20170 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20   WO_GE)!=0 );.  
20180 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
20190 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65  geEnd && (pRange
201a0 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
201b0 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20   WO_LE)!=0 );.  
201c0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
201d0 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65  geEnd && (pRange
201e0 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
201f0 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20   WO_GE)!=0 );.  
20200 20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52 61    startEq = !pRa
20210 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e  ngeStart || pRan
20220 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
20230 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
20240 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20  E);.    endEq = 
20250 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20    !pRangeEnd || 
20260 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
20270 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f  ator & (WO_LE|WO
20280 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f  _GE);.    start_
20290 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52  constraints = pR
202a0 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71  angeStart || nEq
202b0 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  >0;..    /* Seek
202c0 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f   the index curso
202d0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
202e0 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
202f0 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20      nConstraint 
20300 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
20310 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20  RangeStart ){.  
20320 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
20330 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e   = pRangeStart->
20340 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
20350 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
20360 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
20370 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
20380 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52  );.      if( (pR
20390 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61  angeStart->wtFla
203a0 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
203b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
203c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73  qlite3ExprCodeIs
203d0 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67  NullJump(v, pRig
203e0 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  ht, regBase+nEq,
203f0 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20   addrNxt);.     
20400 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74   }.      if( zSt
20410 61 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20  artAff ){.      
20420 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d    if( sqlite3Com
20430 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69  pareAffinity(pRi
20440 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e  ght, zStartAff[n
20450 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46  Eq])==SQLITE_AFF
20460 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20  _NONE){.        
20470 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63    /* Since the c
20480 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20  omparison is to 
20490 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74  be performed wit
204a0 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73  h no conversions
204b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70  .          ** ap
204c0 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65  plied to the ope
204d0 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61  rands, set the a
204e0 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79  ffinity to apply
204f0 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20   to pRight to . 
20500 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49           ** SQLI
20510 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f  TE_AFF_NONE.  */
20520 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72  .          zStar
20530 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49  tAff[nEq] = SQLI
20540 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
20550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
20560 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65  f( sqlite3ExprNe
20570 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
20580 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61  nge(pRight, zSta
20590 72 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20  rtAff[nEq]) ){. 
205a0 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41           zStartA
205b0 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
205c0 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
205d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20     }.      }  . 
205e0 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
205f0 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ++;.      testca
20600 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d  se( pRangeStart-
20610 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
20620 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d  VIRTUAL );.    }
20630 65 6c 73 65 20 69 66 28 20 69 73 4d 69 6e 51 75  else if( isMinQu
20640 65 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ery ){.      sql
20650 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20660 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
20670 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
20680 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
20690 0a 20 20 20 20 20 20 73 74 61 72 74 45 71 20 3d  .      startEq =
206a0 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f   0;.      start_
206b0 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b  constraints = 1;
206c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41  .    }.    codeA
206d0 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61  pplyAffinity(pPa
206e0 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  rse, regBase, nC
206f0 6f 6e 73 74 72 61 69 6e 74 2c 20 7a 53 74 61 72  onstraint, zStar
20700 74 41 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20  tAff);.    op = 
20710 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f  aStartOp[(start_
20720 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20  constraints<<2) 
20730 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b  + (startEq<<1) +
20740 20 62 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65   bRev];.    asse
20750 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20  rt( op!=0 );.   
20760 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
20770 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20  P_Rewind );.    
20780 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
20790 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20 74 65 73  _Last );.    tes
207a0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
207b0 65 6b 47 74 20 29 3b 0a 20 20 20 20 74 65 73 74  ekGt );.    test
207c0 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
207d0 6b 47 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63  kGe );.    testc
207e0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
207f0 4c 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  Le );.    testca
20800 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  se( op==OP_SeekL
20810 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t );.    sqlite3
20820 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
20830 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64   op, iIdxCur, ad
20840 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20  drNxt, regBase, 
20850 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 0a 20  nConstraint);.. 
20860 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76     /* Load the v
20870 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65  alue for the ine
20880 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
20890 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
208a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67   the.    ** rang
208b0 65 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20  e (if any)..    
208c0 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  */.    nConstrai
208d0 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66  nt = nEq;.    if
208e0 28 20 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20  ( pRangeEnd ){. 
208f0 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
20900 74 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70  t = pRangeEnd->p
20910 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
20920 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20930 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
20940 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  e, regBase+nEq, 
20950 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
20960 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
20970 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
20980 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66  e+nEq);.      if
20990 28 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74  ( (pRangeEnd->wt
209a0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
209b0 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LL)==0 ){.      
209c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
209d0 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70  eIsNullJump(v, p
209e0 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e  Right, regBase+n
209f0 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  Eq, addrNxt);.  
20a00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
20a10 7a 45 6e 64 41 66 66 20 29 7b 0a 20 20 20 20 20  zEndAff ){.     
20a20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
20a30 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52  mpareAffinity(pR
20a40 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45  ight, zEndAff[nE
20a50 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  q])==SQLITE_AFF_
20a60 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20  NONE){.         
20a70 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f   /* Since the co
20a80 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62  mparison is to b
20a90 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68  e performed with
20aa0 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a   no conversions.
20ab0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70            ** app
20ac0 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72  lied to the oper
20ad0 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66  ands, set the af
20ae0 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20  finity to apply 
20af0 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20  to pRight to .  
20b00 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54          ** SQLIT
20b10 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a  E_AFF_NONE.  */.
20b20 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66            zEndAf
20b30 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
20b40 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
20b50 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
20b60 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
20b70 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
20b80 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66  (pRight, zEndAff
20b90 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20  [nEq]) ){.      
20ba0 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d      zEndAff[nEq]
20bb0 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
20bc0 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
20bd0 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20 63 6f      }  .      co
20be0 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
20bf0 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
20c00 20 6e 45 71 2b 31 2c 20 7a 45 6e 64 41 66 66 29   nEq+1, zEndAff)
20c10 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61  ;.      nConstra
20c20 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73  int++;.      tes
20c30 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
20c40 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
20c50 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
20c60 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
20c70 72 65 65 28 64 62 2c 20 7a 53 74 61 72 74 41 66  ree(db, zStartAf
20c80 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  f);.    sqlite3D
20c90 62 46 72 65 65 28 64 62 2c 20 7a 45 6e 64 41 66  bFree(db, zEndAf
20ca0 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20  f);..    /* Top 
20cb0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79  of the loop body
20cc0 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   */.    pLevel->
20cd0 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p2 = sqlite3Vdbe
20ce0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
20cf0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  .    /* Check if
20d00 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f   the index curso
20d10 72 20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e  r is past the en
20d20 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  d of the range. 
20d30 2a 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e 64  */.    op = aEnd
20d40 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c  Op[(pRangeEnd ||
20d50 20 6e 45 71 29 20 2a 20 28 31 20 2b 20 62 52 65   nEq) * (1 + bRe
20d60 76 29 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73  v)];.    testcas
20d70 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29  e( op==OP_Noop )
20d80 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
20d90 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a  op==OP_IdxGE );.
20da0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
20db0 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20  ==OP_IdxLT );.  
20dc0 20 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f    if( op!=OP_Noo
20dd0 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
20de0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
20df0 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20  v, op, iIdxCur, 
20e00 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65  addrNxt, regBase
20e10 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  , nConstraint);.
20e20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20e30 65 43 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64  eChangeP5(v, end
20e40 45 71 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a  Eq!=bRev ?1:0);.
20e50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
20e60 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75   there are inequ
20e70 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
20e80 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  s, check that th
20e90 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f  e value.    ** o
20ea0 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
20eb0 6d 6e 20 74 68 61 74 20 74 68 65 20 69 6e 65 71  mn that the ineq
20ec0 75 61 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e 73  uality contrains
20ed0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20   is not NULL..  
20ee0 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 6a    ** If it is, j
20ef0 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ump to the next 
20f00 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
20f10 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
20f20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
20f30 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
20f40 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
20f50 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
20f60 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
20f70 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
20f80 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
20f90 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
20fa0 49 54 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  IT );.    if( (p
20fb0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
20fc0 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  (WHERE_BTM_LIMIT
20fd0 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
20fe0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ))!=0 ){.      s
20ff0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
21000 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
21010 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72 31 29  IdxCur, nEq, r1)
21020 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21030 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21040 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64 72  IsNull, r1, addr
21050 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Cont);.    }.   
21060 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
21070 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
21080 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  1);..    /* Seek
21090 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   the table curso
210a0 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  r, if required *
210b0 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72  /.    disableTer
210c0 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65  m(pLevel, pRange
210d0 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61  Start);.    disa
210e0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
210f0 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20  pRangeEnd);.    
21100 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29  if( !omitTable )
21110 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
21120 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20  g = iReleaseReg 
21130 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
21140 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
21150 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21160 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f  dOp2(v, OP_IdxRo
21170 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52  wid, iIdxCur, iR
21180 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
21190 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
211a0 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
211b0 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
211c0 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
211d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
211e0 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52  P_Seek, iCur, iR
211f0 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65  owidReg);  /* De
21200 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20  ferred seek */. 
21210 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63     }..    /* Rec
21220 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75 63 74  ord the instruct
21230 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d  ion used to term
21240 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20  inate the loop. 
21250 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20  Disable .    ** 
21260 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
21270 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e  ms made redundan
21280 74 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 72  t by the index r
21290 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a  ange scan..    *
212a0 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  /.    if( pLoop-
212b0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
212c0 5f 4f 4e 45 52 4f 57 20 29 7b 0a 20 20 20 20 20  _ONEROW ){.     
212d0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
212e0 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65  _Noop;.    }else
212f0 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
21300 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
21310 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c  OP_Prev;.    }el
21320 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
21330 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a  ->op = OP_Next;.
21340 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
21350 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a  ->p1 = iIdxCur;.
21360 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
21370 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
21380 43 4f 4e 53 54 52 41 49 4e 54 29 3d 3d 30 20 29  CONSTRAINT)==0 )
21390 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
213a0 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54  p5 = SQLITE_STMT
213b0 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
213c0 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  STEP;.    }else{
213d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
213e0 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a  Level->p5==0 );.
213f0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23      }.  }else..#
21400 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21410 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
21420 4f 4e 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  ON.  if( pLoop->
21430 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
21440 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20  MULTI_OR ){.    
21450 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 77 6f 20  /* Case 5:  Two 
21460 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65  or more separate
21470 6c 79 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73  ly indexed terms
21480 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52   connected by OR
21490 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
214a0 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
214b0 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54     **   CREATE T
214c0 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29  ABLE t1(a,b,c,d)
214d0 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
214e0 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
214f0 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  (a);.    **   CR
21500 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e  EATE INDEX i2 ON
21510 20 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(b);.    **  
21520 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 33   CREATE INDEX i3
21530 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a   ON t1(c);.    *
21540 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43  *.    **   SELEC
21550 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
21560 45 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20  E a=5 OR b=7 OR 
21570 28 63 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a  (c=11 AND d=13).
21580 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e      **.    ** In
21590 20 74 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68   the example, th
215a0 65 72 65 20 61 72 65 20 74 68 72 65 65 20 69 6e  ere are three in
215b0 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e  dexed terms conn
215c0 65 63 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20  ected by OR..   
215d0 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74   ** The top of t
215e0 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69  he loop looks li
215f0 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a  ke this:.    **.
21600 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
21610 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20  Null       1    
21620 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65              # Ze
21630 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e  ro the rowset in
21640 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20   reg 1.    **.  
21650 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65    ** Then, for e
21660 61 63 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d  ach indexed term
21670 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e  , the following.
21680 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74   The arguments t
21690 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54  o.    ** RowSetT
216a0 65 73 74 20 61 72 65 20 73 75 63 68 20 74 68 61  est are such tha
216b0 74 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74  t the rowid of t
216c0 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69  he current row i
216d0 73 20 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a  s inserted.    *
216e0 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65  * into the RowSe
216f0 74 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65  t. If it is alre
21700 61 64 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e  ady present, con
21710 74 72 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20  trol skips the. 
21720 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f     ** Gosub opco
21730 64 65 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72  de and jumps str
21740 61 69 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64  aight to the cod
21750 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 57  e generated by W
21760 68 65 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a  hereEnd()..    *
21770 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
21780 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
21790 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a  n(<term>).    **
217a0 20 20 20 20 20 20 20 20 20 20 52 6f 77 53 65 74            RowSet
217b0 54 65 73 74 20 20 20 20 20 20 20 20 20 20 20 20  Test            
217c0 20 20 20 20 20 20 23 20 49 6e 73 65 72 74 20 72        # Insert r
217d0 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74  owid into rowset
217e0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
217f0 20 47 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a   Gosub      2 A.
21800 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71      **        sq
21810 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a  lite3WhereEnd().
21820 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
21830 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76  llowing the abov
21840 65 2c 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69  e, code to termi
21850 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c  nate the loop. L
21860 61 62 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67  abel A, the targ
21870 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  et.    ** of the
21880 20 47 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75   Gosub above, ju
21890 6d 70 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72  mps to the instr
218a0 75 63 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74  uction right aft
218b0 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20  er the Goto..   
218c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
218d0 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31      Null       1
218e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218f0 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65  # Zero the rowse
21900 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a  t in reg 1.    *
21910 2a 20 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20  *          Goto 
21920 20 20 20 20 20 20 42 20 20 20 20 20 20 20 20 20        B         
21930 20 20 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f         # The loo
21940 70 20 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20  p is finished.. 
21950 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
21960 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79     A: <loop body
21970 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >               
21980 20 20 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c    # Return data,
21990 20 77 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a   whatever..    *
219a0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
219b0 20 20 52 65 74 75 72 6e 20 20 20 20 20 32 20 20    Return     2  
219c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
219d0 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65  Jump back to the
219e0 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20   Gosub.    **.  
219f0 20 20 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61    **       B: <a
21a00 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20  fter the loop>. 
21a10 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20     **.    */.   
21a20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f   WhereClause *pO
21a30 72 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rWc;    /* The O
21a40 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20  R-clause broken 
21a50 6f 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  out into subterm
21a60 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74  s */.    SrcList
21a70 20 2a 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20   *pOrTab;       
21a80 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62  /* Shortened tab
21a90 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c  le list or OR-cl
21aa0 61 75 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  ause generation 
21ab0 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43  */.    Index *pC
21ac0 6f 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ov = 0;         
21ad0 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c      /* Potential
21ae0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
21af0 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20  (or NULL) */.   
21b00 20 69 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70   int iCovCur = p
21b10 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
21b20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20 66  /* Cursor used f
21b30 6f 72 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28  or index scans (
21b40 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20  if any) */..    
21b50 69 6e 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20  int regReturn = 
21b60 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20  ++pParse->nMem; 
21b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
21b80 69 73 74 65 72 20 75 73 65 64 20 77 69 74 68 20  ister used with 
21b90 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20  OP_Gosub */.    
21ba0 69 6e 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20  int regRowset = 
21bb0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
21bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
21bd0 69 73 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74  ister for RowSet
21be0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69   object */.    i
21bf0 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b  nt regRowid = 0;
21c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c10 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
21c20 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77  ster holding row
21c30 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c  id */.    int iL
21c40 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65  oopBody = sqlite
21c50 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
21c60 29 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  );  /* Start of 
21c70 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20  loop body */.   
21c80 20 69 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20   int iRetInit;  
21c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
21cb0 64 72 65 73 73 20 6f 66 20 72 65 67 52 65 74 75  dress of regRetu
21cc0 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69  rn init */.    i
21cd0 6e 74 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73  nt untestedTerms
21ce0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
21cf0 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20    /* Some terms 
21d00 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74  not completely t
21d10 65 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  ested */.    int
21d20 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
21d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d40 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
21d50 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 41 6e  */.    Expr *pAn
21d60 64 45 78 70 72 20 3d 20 30 3b 20 20 20 20 20 20  dExpr = 0;      
21d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
21d80 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65  ".. AND (...)" e
21d90 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
21da0 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f  .    pTerm = pLo
21db0 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20  op->aLTerm[0];. 
21dc0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
21dd0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
21de0 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  t( pTerm->eOpera
21df0 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20  tor & WO_OR );. 
21e00 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
21e10 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
21e20 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a  M_ORINFO)!=0 );.
21e30 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65      pOrWc = &pTe
21e40 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
21e50 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  c;.    pLevel->o
21e60 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20  p = OP_Return;. 
21e70 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
21e80 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20  regReturn;..    
21e90 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77 20  /* Set up a new 
21ea0 53 72 63 4c 69 73 74 20 69 6e 20 70 4f 72 54 61  SrcList in pOrTa
21eb0 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  b containing the
21ec0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61   table being sca
21ed0 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  nned.    ** by t
21ee0 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20  his loop in the 
21ef0 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c  a[0] slot and al
21f00 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  l notReady table
21f10 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74  s in a[1..] slot
21f20 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  s..    ** This b
21f30 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69  ecomes the SrcLi
21f40 73 74 20 69 6e 20 74 68 65 20 72 65 63 75 72 73  st in the recurs
21f50 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ive call to sqli
21f60 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e  te3WhereBegin().
21f70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
21f80 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31  pWInfo->nLevel>1
21f90 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e   ){.      int nN
21fa0 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20  otReady;        
21fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
21fc0 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61  number of notRea
21fd0 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  dy tables */.   
21fe0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
21ff0 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b  t_item *origSrc;
22000 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
22010 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   list of tables 
22020 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61  */.      nNotRea
22030 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  dy = pWInfo->nLe
22040 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31  vel - iLevel - 1
22050 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d  ;.      pOrTab =
22060 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c   sqlite3StackAll
22070 6f 63 52 61 77 28 64 62 2c 0a 20 20 20 20 20 20  ocRaw(db,.      
22080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22090 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f        sizeof(*pO
220a0 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79  rTab)+ nNotReady
220b0 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e  *sizeof(pOrTab->
220c0 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  a[0]));.      if
220d0 28 20 70 4f 72 54 61 62 3d 3d 30 20 29 20 72 65  ( pOrTab==0 ) re
220e0 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20  turn notReady;. 
220f0 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c       pOrTab->nAl
22100 6c 6f 63 20 3d 20 28 75 38 29 28 6e 4e 6f 74 52  loc = (u8)(nNotR
22110 65 61 64 79 20 2b 20 31 29 3b 0a 20 20 20 20 20  eady + 1);.     
22120 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20   pOrTab->nSrc = 
22130 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a  pOrTab->nAlloc;.
22140 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 72        memcpy(pOr
22150 54 61 62 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d  Tab->a, pTabItem
22160 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61 62 49 74  , sizeof(*pTabIt
22170 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72 69 67  em));.      orig
22180 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Src = pWInfo->pT
22190 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  abList->a;.     
221a0 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f   for(k=1; k<=nNo
221b0 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20  tReady; k++){.  
221c0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4f        memcpy(&pO
221d0 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69  rTab->a[k], &ori
221e0 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69  gSrc[pLevel[k].i
221f0 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f  From], sizeof(pO
22200 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20  rTab->a[k]));.  
22210 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
22220 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20  .      pOrTab = 
22230 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
22240 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
22250 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72  Initialize the r
22260 6f 77 73 65 74 20 72 65 67 69 73 74 65 72 20 74  owset register t
22270 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20  o contain NULL. 
22280 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a  An SQL NULL is .
22290 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e      ** equivalen
222a0 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f  t to an empty ro
222b0 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  wset..    **.   
222c0 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c   ** Also initial
222d0 69 7a 65 20 72 65 67 52 65 74 75 72 6e 20 74 6f  ize regReturn to
222e0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 61 64 64   contain the add
222f0 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e 73 74  ress of the inst
22300 72 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  ruction .    ** 
22310 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
22320 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 74  owing the OP_Ret
22330 75 72 6e 20 61 74 20 74 68 65 20 62 6f 74 74 6f  urn at the botto
22340 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54  m of the loop. T
22350 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 72 65  his.    ** is re
22360 71 75 69 72 65 64 20 69 6e 20 61 20 66 65 77 20  quired in a few 
22370 6f 62 73 63 75 72 65 20 4c 45 46 54 20 4a 4f 49  obscure LEFT JOI
22380 4e 20 63 61 73 65 73 20 77 68 65 72 65 20 63 6f  N cases where co
22390 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20  ntrol jumps.    
223a0 2a 2a 20 6f 76 65 72 20 74 68 65 20 74 6f 70 20  ** over the top 
223b0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f  of the loop into
223c0 20 74 68 65 20 62 6f 64 79 20 6f 66 20 69 74 2e   the body of it.
223d0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
223e0 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 63  e .    ** correc
223f0 74 20 72 65 73 70 6f 6e 73 65 20 66 6f 72 20 74  t response for t
22400 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63  he end-of-loop c
22410 6f 64 65 20 28 74 68 65 20 4f 50 5f 52 65 74 75  ode (the OP_Retu
22420 72 6e 29 20 69 73 20 74 6f 20 0a 20 20 20 20 2a  rn) is to .    *
22430 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  * fall through t
22440 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
22450 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20  uction, just as 
22460 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20  an OP_Next does 
22470 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64  if.    ** called
22480 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c   on an uninitial
22490 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20 20 20  ized cursor..   
224a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 57 49   */.    if( (pWI
224b0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
224c0 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54  & WHERE_DUPLICAT
224d0 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20  ES_OK)==0 ){.   
224e0 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20 2b     regRowset = +
224f0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
22500 20 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20       regRowid = 
22510 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
22520 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22530 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
22540 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73 65 74  ll, 0, regRowset
22550 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65  );.    }.    iRe
22560 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56  tInit = sqlite3V
22570 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
22580 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52  Integer, 0, regR
22590 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20  eturn);..    /* 
225a0 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
225b0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
225c0 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  z of the form:  
225d0 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e  (x1 OR x2 OR ...
225e0 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54  ) AND y.    ** T
225f0 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20 74 65  hen for every te
22600 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74 65 20  rm xN, evaluate 
22610 61 73 20 74 68 65 20 73 75 62 65 78 70 72 65 73  as the subexpres
22620 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20  sion: xN AND z. 
22630 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20     ** That way, 
22640 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61 74 20  terms in y that 
22650 61 72 65 20 66 61 63 74 6f 72 65 64 20 69 6e 74  are factored int
22660 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74 69 6f  o the disjunctio
22670 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  n will.    ** be
22680 20 70 69 63 6b 65 64 20 75 70 20 62 79 20 74 68   picked up by th
22690 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
226a0 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  s to sqlite3Wher
226b0 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a  eBegin() below..
226c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63      **.    ** Ac
226d0 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73 75 62  tually, each sub
226e0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
226f0 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e 20 41  nverted to "xN A
22700 4e 44 20 77 22 20 77 68 65 72 65 20 77 20 69 73  ND w" where w is
22710 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69 6e 74  .    ** the "int
22720 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d 73 20  eresting" terms 
22730 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74 68 61  of z - terms tha
22740 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e  t did not origin
22750 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ate in the.    *
22760 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  * ON or USING cl
22770 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
22780 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20 74  OIN, and terms t
22790 68 61 74 20 61 72 65 20 75 73 61 62 6c 65 20 61  hat are usable a
227a0 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  s .    ** indice
227b0 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
227c0 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   This optimizati
227d0 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70  on also only app
227e0 6c 69 65 73 20 69 66 20 74 68 65 20 28 78 31 20  lies if the (x1 
227f0 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65  OR x2 OR ...) te
22800 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  rm.    ** is not
22810 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
22820 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61  e ON clause of a
22830 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20   LEFT JOIN..    
22840 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 20 68 74  ** See ticket ht
22850 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e  tp://www.sqlite.
22860 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33  org/src/info/f23
22870 36 39 33 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20  69304e4.    */. 
22880 20 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72     if( pWC->nTer
22890 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  m>1 ){.      int
228a0 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f   iTerm;.      fo
228b0 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d  r(iTerm=0; iTerm
228c0 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65  <pWC->nTerm; iTe
228d0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45  rm++){.        E
228e0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 57 43  xpr *pExpr = pWC
228f0 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72  ->a[iTerm].pExpr
22900 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 26 70  ;.        if( &p
22910 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d 3d 20  WC->a[iTerm] == 
22920 70 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65  pTerm ) continue
22930 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78  ;.        if( Ex
22940 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
22950 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
22960 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
22970 20 20 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61        if( pWC->a
22980 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20  [iTerm].wtFlags 
22990 26 20 28 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 20  & (TERM_ORINFO) 
229a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
229b0 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b      if( (pWC->a[
229c0 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f 72  iTerm].eOperator
229d0 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20   & WO_ALL)==0 ) 
229e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
229f0 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
22a00 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
22a10 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
22a20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74  pAndExpr = sqlit
22a30 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 41  e3ExprAnd(db, pA
22a40 6e 64 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a  ndExpr, pExpr);.
22a50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
22a60 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20  ( pAndExpr ){.  
22a70 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d        pAndExpr =
22a80 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
22a90 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  arse, TK_AND, 0,
22aa0 20 70 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a 20   pAndExpr, 0);. 
22ab0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
22ac0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
22ad0 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b  OrWc->nTerm; ii+
22ae0 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54  +){.      WhereT
22af0 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26  erm *pOrTerm = &
22b00 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20  pOrWc->a[ii];.  
22b10 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
22b20 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
22b30 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d 2d 3e 65  r || (pOrTerm->e
22b40 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e  Operator & WO_AN
22b50 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  D)!=0 ){.       
22b60 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62   WhereInfo *pSub
22b70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
22b80 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67  /* Info for sing
22b90 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20  le OR-term scan 
22ba0 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  */.        Expr 
22bb0 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f 72 54 65  *pOrExpr = pOrTe
22bc0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
22bd0 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
22be0 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
22bf0 72 74 79 28 70 4f 72 45 78 70 72 2c 20 45 50 5f  rty(pOrExpr, EP_
22c00 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
22c10 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d         pAndExpr-
22c20 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45 78 70 72  >pLeft = pOrExpr
22c30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 45  ;.          pOrE
22c40 78 70 72 20 3d 20 70 41 6e 64 45 78 70 72 3b 0a  xpr = pAndExpr;.
22c50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22c60 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
22c70 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20  h table entries 
22c80 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20  that match term 
22c90 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  pOrTerm. */.    
22ca0 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20      pSubWInfo = 
22cb0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
22cc0 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62  n(pParse, pOrTab
22cd0 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c  , pOrExpr, 0, 0,
22ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22cf0 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f           WHERE_O
22d00 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 20 7c  MIT_OPEN_CLOSE |
22d10 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20   WHERE_AND_ONLY 
22d20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
22d30 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
22d40 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20 57 48  FORCE_TABLE | WH
22d50 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
22d60 59 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20 20 20  Y, iCovCur);.   
22d70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
22d80 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65  bWInfo || pParse
22d90 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
22da0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
22db0 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49        if( pSubWI
22dc0 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
22dd0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62   WhereLoop *pSub
22de0 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  Loop;.          
22df0 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  explainOneScan(.
22e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
22e10 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70  arse, pOrTab, &p
22e20 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20  SubWInfo->a[0], 
22e30 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e  iLevel, pLevel->
22e40 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20  iFrom, 0.       
22e50 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
22e60 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
22e70 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
22e80 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d  DUPLICATES_OK)==
22e90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
22ea0 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28 69 69   int iSet = ((ii
22eb0 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  ==pOrWc->nTerm-1
22ec0 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20 20  )?-1:ii);.      
22ed0 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20        int r;.   
22ee0 20 20 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c           r = sql
22ef0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
22f00 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54  olumn(pParse, pT
22f10 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20 2d 31  abItem->pTab, -1
22f20 2c 20 69 43 75 72 2c 20 0a 20 20 20 20 20 20 20  , iCur, .       
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f50 20 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a    regRowid, 0);.
22f60 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
22f70 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
22f80 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73  (v, OP_RowSetTes
22f90 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a 20 20  t, regRowset,.  
22fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
22fc0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
22fd0 74 41 64 64 72 28 76 29 2b 32 2c 20 72 2c 20 69  tAddr(v)+2, r, i
22fe0 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Set);.          
22ff0 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
23000 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
23010 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65   OP_Gosub, regRe
23020 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29  turn, iLoopBody)
23030 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
23040 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75  The pSubWInfo->u
23050 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61  ntestedTerms fla
23060 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  g means that thi
23070 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20  s OR term.      
23080 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64      ** contained
23090 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44   one or more AND
230a0 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74   term from a not
230b0 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68  Ready table.  Th
230c0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
230d0 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f  erms from the no
230e0 74 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75  tReady table cou
230f0 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64  ld not be tested
23100 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20   and will.      
23110 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62      ** need to b
23120 65 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a  e tested later..
23130 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
23140 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57         if( pSubW
23150 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
23160 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54 65  rms ) untestedTe
23170 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20  rms = 1;..      
23180 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66      /* If all of
23190 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65   the OR-connecte
231a0 64 20 74 65 72 6d 73 20 61 72 65 20 6f 70 74 69  d terms are opti
231b0 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20  mized using the 
231c0 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a  same.          *
231d0 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 65  * index, and the
231e0 20 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64   index is opened
231f0 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
23200 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20  cursor number.  
23210 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 65 61          ** by ea
23220 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ch call to sqlit
23230 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 6d  e3WhereBegin() m
23240 61 64 65 20 62 79 20 74 68 69 73 20 6c 6f 6f 70  ade by this loop
23250 2c 20 69 74 20 6d 61 79 0a 20 20 20 20 20 20 20  , it may.       
23260 20 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c     ** be possibl
23270 65 20 74 6f 20 75 73 65 20 74 68 61 74 20 69 6e  e to use that in
23280 64 65 78 20 61 73 20 61 20 63 6f 76 65 72 69 6e  dex as a coverin
23290 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  g index..       
232a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
232b0 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74  ** If the call t
232c0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
232d0 67 69 6e 28 29 20 61 62 6f 76 65 20 72 65 73 75  gin() above resu
232e0 6c 74 65 64 20 69 6e 20 61 20 73 63 61 6e 20 74  lted in a scan t
232f0 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
23300 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20   uses an index, 
23310 61 6e 64 20 74 68 69 73 20 69 73 20 65 69 74 68  and this is eith
23320 65 72 20 74 68 65 20 66 69 72 73 74 20 4f 52 2d  er the first OR-
23330 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a 20  connected term. 
23340 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
23350 65 73 73 65 64 20 6f 72 20 74 68 65 20 69 6e 64  essed or the ind
23360 65 78 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ex is the same a
23370 73 20 74 68 61 74 20 75 73 65 64 20 62 79 20 61  s that used by a
23380 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20  ll previous.    
23390 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20        ** terms, 
233a0 73 65 74 20 70 43 6f 76 20 74 6f 20 74 68 65 20  set pCov to the 
233b0 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69  candidate coveri
233c0 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68 65 72 77  ng index. Otherw
233d0 69 73 65 2c 20 73 65 74 20 0a 20 20 20 20 20 20  ise, set .      
233e0 20 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e      ** pCov to N
233f0 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ULL to indicate 
23400 74 68 61 74 20 6e 6f 20 63 61 6e 64 69 64 61 74  that no candidat
23410 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  e covering index
23420 20 77 69 6c 6c 20 0a 20 20 20 20 20 20 20 20 20   will .         
23430 20 2a 2a 20 62 65 20 61 76 61 69 6c 61 62 6c 65   ** be available
23440 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
23450 20 20 20 20 20 20 20 20 20 70 53 75 62 4c 6f 6f           pSubLoo
23460 70 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61  p = pSubWInfo->a
23470 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  [0].pWLoop;.    
23480 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
23490 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  SubLoop->wsFlags
234a0 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
234b0 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  DEX)==0 );.     
234c0 20 20 20 20 20 69 66 28 20 28 70 53 75 62 4c 6f       if( (pSubLo
234d0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
234e0 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
234f0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69             && (i
23500 69 3d 3d 30 20 7c 7c 20 70 53 75 62 4c 6f 6f 70  i==0 || pSubLoop
23510 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
23520 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20 20 20 20  ==pCov).        
23530 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
23540 20 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e   assert( pSubWIn
23550 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78 43 75 72  fo->a[0].iIdxCur
23560 3d 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20 20 20  ==iCovCur );.   
23570 20 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20           pCov = 
23580 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  pSubLoop->u.btre
23590 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  e.pIndex;.      
235a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
235b0 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30 3b         pCov = 0;
235c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
235d0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73          /* Finis
235e0 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75  h the loop throu
235f0 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  gh table entries
23600 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d   that match term
23610 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20   pOrTerm. */.   
23620 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
23630 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f  ereEnd(pSubWInfo
23640 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
23650 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
23660 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78  Level->u.pCovidx
23670 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69 66 28   = pCov;.    if(
23680 20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d 3e   pCov ) pLevel->
23690 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43 75  iIdxCur = iCovCu
236a0 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64 45  r;.    if( pAndE
236b0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41 6e  xpr ){.      pAn
236c0 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30  dExpr->pLeft = 0
236d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
236e0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 41  xprDelete(db, pA
236f0 6e 64 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  ndExpr);.    }. 
23700 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
23710 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e  angeP1(v, iRetIn
23720 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  it, sqlite3VdbeC
23730 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
23740 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23750 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
23760 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  , 0, pLevel->add
23770 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  rBrk);.    sqlit
23780 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
23790 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29  el(v, iLoopBody)
237a0 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  ;..    if( pWInf
237b0 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71  o->nLevel>1 ) sq
237c0 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64  lite3StackFree(d
237d0 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20  b, pOrTab);.    
237e0 69 66 28 20 21 75 6e 74 65 73 74 65 64 54 65 72  if( !untestedTer
237f0 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d  ms ) disableTerm
23800 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
23810 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
23820 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  /* SQLITE_OMIT_O
23830 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  R_OPTIMIZATION *
23840 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61  /..  {.    /* Ca
23850 73 65 20 36 3a 20 20 54 68 65 72 65 20 69 73 20  se 6:  There is 
23860 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e  no usable index.
23870 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63    We must do a c
23880 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20  omplete.    **  
23890 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20          scan of 
238a0 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65  the entire table
238b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61  ..    */.    sta
238c0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
238d0 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74  ep[] = { OP_Next
238e0 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20  , OP_Prev };.   
238f0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
23900 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50   aStart[] = { OP
23910 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74  _Rewind, OP_Last
23920 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   };.    assert( 
23930 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d  bRev==0 || bRev=
23940 3d 31 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  =1 );.    pLevel
23950 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65  ->op = aStep[bRe
23960 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  v];.    pLevel->
23970 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  p1 = iCur;.    p
23980 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20  Level->p2 = 1 + 
23990 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
239a0 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76  2(v, aStart[bRev
239b0 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  ], iCur, addrBrk
239c0 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  );.    pLevel->p
239d0 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  5 = SQLITE_STMTS
239e0 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
239f0 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 65 77 4e 6f  TEP;.  }.  newNo
23a00 74 52 65 61 64 79 20 3d 20 6e 6f 74 52 65 61 64  tReady = notRead
23a10 79 20 26 20 7e 67 65 74 4d 61 73 6b 28 26 70 57  y & ~getMask(&pW
23a20 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
23a30 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73  iCur);..  /* Ins
23a40 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74  ert code to test
23a50 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73   every subexpres
23a60 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65  sion that can be
23a70 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a   completely.  **
23a80 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20   computed using 
23a90 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20  the current set 
23aa0 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  of tables..  */.
23ab0 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
23ac0 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d  >a, j=pWC->nTerm
23ad0 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72  ; j>0; j--, pTer
23ae0 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
23af0 70 45 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  pE;.    testcase
23b00 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
23b10 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
23b20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
23b30 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
23b40 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a  & TERM_CODED );.
23b50 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
23b60 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
23b70 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
23b80 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
23b90 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
23ba0 72 65 72 65 71 41 6c 6c 20 26 20 6e 65 77 4e 6f  rereqAll & newNo
23bb0 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20  tReady)!=0 ){.  
23bc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57      testcase( pW
23bd0 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
23be0 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  rms==0.         
23bf0 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
23c00 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
23c10 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
23c20 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  LY)!=0 );.      
23c30 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
23c40 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20  Terms = 1;.     
23c50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
23c60 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d  .    pE = pTerm-
23c70 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >pExpr;.    asse
23c80 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20  rt( pE!=0 );.   
23c90 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
23ca0 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48  ftJoin && !ExprH
23cb0 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
23cc0 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
23cd0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
23ce0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
23cf0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
23d00 73 65 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74  se, pE, addrCont
23d10 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
23d20 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d  ULL);.    pTerm-
23d30 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
23d40 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f  _CODED;.  }..  /
23d50 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f  * Insert code to
23d60 20 74 65 73 74 20 66 6f 72 20 69 6d 70 6c 69 65   test for implie
23d70 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 61  d constraints ba
23d80 73 65 64 20 6f 6e 20 74 72 61 6e 73 69 74 69 76  sed on transitiv
23d90 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ity.  ** of the 
23da0 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72 2e 0a 20  "==" operator.. 
23db0 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65   **.  ** Example
23dc0 3a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  : If the WHERE c
23dd0 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 22  lause contains "
23de0 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e 64 20 22  t1.a=t2.b" and "
23df0 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a 2a 20 61  t2.b=123".  ** a
23e00 6e 64 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67  nd we are coding
23e10 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64   the t1 loop and
23e20 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 68 61 73   the t2 loop has
23e30 20 6e 6f 74 20 79 65 74 20 63 6f 64 65 64 2c 0a   not yet coded,.
23e40 20 20 2a 2a 20 74 68 65 6e 20 77 65 20 63 61 6e    ** then we can
23e50 6e 6f 74 20 75 73 65 20 74 68 65 20 22 74 31 2e  not use the "t1.
23e60 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74 72 61 69  a=t2.b" constrai
23e70 6e 74 2c 20 62 75 74 20 77 65 20 63 61 6e 20 63  nt, but we can c
23e80 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20 69 6d 70  ode.  ** the imp
23e90 6c 69 65 64 20 22 74 31 2e 61 3d 31 32 33 22 20  lied "t1.a=123" 
23ea0 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f  constraint..  */
23eb0 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
23ec0 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72  ->a, j=pWC->nTer
23ed0 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65  m; j>0; j--, pTe
23ee0 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
23ef0 2a 70 45 2c 20 2a 70 45 41 6c 74 3b 0a 20 20 20  *pE, *pEAlt;.   
23f00 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6c 74   WhereTerm *pAlt
23f10 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
23f20 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
23f30 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
23f40 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
23f50 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
23f60 65 4f 70 65 72 61 74 6f 72 21 3d 28 57 4f 5f 45  eOperator!=(WO_E
23f70 51 55 49 56 7c 57 4f 5f 45 51 29 20 29 20 63 6f  QUIV|WO_EQ) ) co
23f80 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
23f90 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
23fa0 72 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  r!=iCur ) contin
23fb0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  ue;.    if( pLev
23fc0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 20  el->iLeftJoin ) 
23fd0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45  continue;.    pE
23fe0 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
23ff0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
24000 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
24010 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
24020 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
24030 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
24040 74 20 26 20 6e 65 77 4e 6f 74 52 65 61 64 79 29  t & newNotReady)
24050 21 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c 74 20  !=0 );.    pAlt 
24060 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
24070 69 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c  iCur, pTerm->u.l
24080 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65  eftColumn, notRe
24090 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  ady, WO_EQ|WO_IN
240a0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 41  , 0);.    if( pA
240b0 6c 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  lt==0 ) continue
240c0 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74 2d 3e  ;.    if( pAlt->
240d0 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
240e0 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
240f0 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  e;.    testcase(
24100 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72   pAlt->eOperator
24110 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20   & WO_EQ );.    
24120 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e  testcase( pAlt->
24130 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
24140 4e 20 29 3b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  N );.    VdbeNoo
24150 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65  pComment((v, "be
24160 67 69 6e 20 74 72 61 6e 73 69 74 69 76 65 20 63  gin transitive c
24170 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b 0a 20 20  onstraint"));.  
24180 20 20 70 45 41 6c 74 20 3d 20 73 71 6c 69 74 65    pEAlt = sqlite
24190 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64  3StackAllocRaw(d
241a0 62 2c 20 73 69 7a 65 6f 66 28 2a 70 45 41 6c 74  b, sizeof(*pEAlt
241b0 29 29 3b 0a 20 20 20 20 69 66 28 20 70 45 41 6c  ));.    if( pEAl
241c0 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 41 6c  t ){.      *pEAl
241d0 74 20 3d 20 2a 70 41 6c 74 2d 3e 70 45 78 70 72  t = *pAlt->pExpr
241e0 3b 0a 20 20 20 20 20 20 70 45 41 6c 74 2d 3e 70  ;.      pEAlt->p
241f0 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c 65 66 74  Left = pE->pLeft
24200 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
24210 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
24220 65 2c 20 70 45 41 6c 74 2c 20 61 64 64 72 43 6f  e, pEAlt, addrCo
24230 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nt, SQLITE_JUMPI
24240 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  FNULL);.      sq
24250 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64  lite3StackFree(d
24260 62 2c 20 70 45 41 6c 74 29 3b 0a 20 20 20 20 7d  b, pEAlt);.    }
24270 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61  .  }..  /* For a
24280 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
24290 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
242a0 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64  that will record
242b0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20   the fact that. 
242c0 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
242d0 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68   row of the righ
242e0 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63  t table has matc
242f0 68 65 64 20 74 68 65 20 6c 65 66 74 20 74 61 62  hed the left tab
24300 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28  le.  .  */.  if(
24310 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
24320 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  in ){.    pLevel
24330 2d 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73 71  ->addrFirst = sq
24340 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
24350 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
24360 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
24370 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
24380 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
24390 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  in);.    VdbeCom
243a0 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64  ment((v, "record
243b0 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29   LEFT JOIN hit")
243c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
243d0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
243e0 72 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 54  rse);.    for(pT
243f0 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b  erm=pWC->a, j=0;
24400 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a   j<pWC->nTerm; j
24410 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
24420 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
24430 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
24440 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
24450 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
24460 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
24470 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
24480 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
24490 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
244a0 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
244b0 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
244c0 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
244d0 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 65 77  >prereqAll & new
244e0 4e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a  NotReady)!=0 ){.
244f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
24500 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
24510 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20  Terms );.       
24520 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
24530 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
24540 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b   pTerm->pExpr );
24550 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
24560 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
24570 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  , pTerm->pExpr, 
24580 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45  addrCont, SQLITE
24590 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
245a0 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
245b0 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
245c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
245d0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
245e0 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65 6c  Reg(pParse, iRel
245f0 65 61 73 65 52 65 67 29 3b 0a 0a 20 20 72 65 74  easeReg);..  ret
24600 75 72 6e 20 6e 65 77 4e 6f 74 52 65 61 64 79 3b  urn newNotReady;
24610 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45  .}..#ifdef WHERE
24620 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
24630 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72  .** Print a Wher
24640 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72  eLoop object for
24650 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f   debugging purpo
24660 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ses.*/.static vo
24670 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e  id whereLoopPrin
24680 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  t(WhereLoop *p, 
24690 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
246a0 74 29 7b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31  t){.  int nb = 1
246b0 2b 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  +(pTabList->nSrc
246c0 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63 74 20  +7)/8;.  struct 
246d0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
246e0 74 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  tem = pTabList->
246f0 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54  a + p->iTab;.  T
24700 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74  able *pTab = pIt
24710 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69  em->pTab;.  sqli
24720 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24730 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a  %c%2d.%0*llx.%0*
24740 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20  llx", p->cId,.  
24750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24760 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20     p->iTab, nb, 
24770 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c  p->maskSelf, nb,
24780 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20 73   p->prereq);.  s
24790 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
247a0 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20  f(" %12s",.     
247b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247c0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20  pItem->zAlias ? 
247d0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20  pItem->zAlias : 
247e0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
247f0 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
24800 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
24810 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
24820 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  if( p->u.btree.p
24830 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 63  Index ){.      c
24840 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
24850 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49   = p->u.btree.pI
24860 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  ndex->zName;.   
24870 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
24880 29 20 7a 4e 61 6d 65 20 3d 20 22 69 70 6b 22 3b  ) zName = "ipk";
24890 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
248a0 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
248b0 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31  e_autoindex_", 1
248c0 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  7)==0 ){.       
248d0 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33   int i = sqlite3
248e0 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20  Strlen30(zName) 
248f0 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69  - 1;.        whi
24900 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f  le( zName[i]!='_
24910 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20  ' ) i--;.       
24920 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20   zName += i;.   
24930 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
24940 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2e  e3DebugPrintf(".
24950 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d  %-16s %2d", zNam
24960 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  e, p->u.btree.nE
24970 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  q);.    }else{. 
24980 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
24990 67 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c 22  gPrintf("%20s","
249a0 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ");.    }.  }els
249b0 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  e{.    char *z;.
249c0 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74 61      if( p->u.vta
249d0 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20  b.idxStr ){.    
249e0 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
249f0 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73 5c  rintf("(%d,\"%s\
24a00 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20 20  ",%x)",.        
24a10 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61          p->u.vta
24a20 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76  b.idxNum, p->u.v
24a30 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75  tab.idxStr, p->u
24a40 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b  .vtab.omitMask);
24a50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24a60 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
24a70 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22 2c  rintf("(%d,%x)",
24a80 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75   p->u.vtab.idxNu
24a90 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  m, p->u.vtab.omi
24aa0 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  tMask);.    }.  
24ab0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24ac0 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20 7a  intf(" %-19s", z
24ad0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
24ae0 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 73 71  ree(z);.  }.  sq
24af0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24b00 28 22 20 66 20 25 30 34 78 20 4e 20 25 64 22 2c  (" f %04x N %d",
24b10 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e   p->wsFlags, p->
24b20 6e 4c 54 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74  nLTerm);.  sqlit
24b30 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
24b40 63 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22  cost %d,%d,%d\n"
24b50 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e  , p->rSetup, p->
24b60 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a  rRun, p->nOut);.
24b70 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
24b80 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d  Convert bulk mem
24b90 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64  ory into a valid
24ba0 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
24bb0 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a  can be passed.**
24bc0 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65   to whereLoopCle
24bd0 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a  ar harmlessly..*
24be0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
24bf0 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72  ereLoopInit(Wher
24c00 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e  eLoop *p){.  p->
24c10 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65  aLTerm = p->aLTe
24c20 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c  rmSpace;.  p->nL
24c30 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  Term = 0;.  p->n
24c40 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a  LSlot = ArraySiz
24c50 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  e(p->aLTermSpace
24c60 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20  );.  p->wsFlags 
24c70 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
24c80 65 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  ear the WhereLoo
24c90 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76  p.u union.  Leav
24ca0 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65  e WhereLoop.pLTe
24cb0 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74  rm intact..*/.st
24cc0 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
24cd0 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71  oopClearUnion(sq
24ce0 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
24cf0 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20  Loop *p){.  if( 
24d00 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
24d10 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
24d20 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45  |WHERE_AUTO_INDE
24d30 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70  X) ){.    if( (p
24d40 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
24d50 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
24d60 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e  =0 && p->u.vtab.
24d70 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20  needFree ){.    
24d80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
24d90 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29  ->u.vtab.idxStr)
24da0 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61  ;.      p->u.vta
24db0 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
24dc0 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
24dd0 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  idxStr = 0;.    
24de0 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73  }else if( (p->ws
24df0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
24e00 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20  TO_INDEX)!=0 && 
24e10 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
24e20 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  x!=0 ){.      sq
24e30 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
24e40 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
24e50 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20  x->zColAff);.   
24e60 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
24e70 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  (db, p->u.btree.
24e80 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70  pIndex);.      p
24e90 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
24ea0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
24eb0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
24ec0 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d  ate internal mem
24ed0 6f 72 79 20 75 73 65 64 20 62 79 20 61 20 57 68  ory used by a Wh
24ee0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a  ereLoop object.*
24ef0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
24f00 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c  ereLoopClear(sql
24f10 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
24f20 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  oop *p){.  if( p
24f30 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54  ->aLTerm!=p->aLT
24f40 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74  ermSpace ) sqlit
24f50 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
24f60 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65  aLTerm);.  where
24f70 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64  LoopClearUnion(d
24f80 62 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f  b, p);.  whereLo
24f90 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a  opInit(p);.}../*
24fa0 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65  .** Increase the
24fb0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
24fc0 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c  on for pLoop->aL
24fd0 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20  Term[] to be at 
24fe0 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74  least n..*/.stat
24ff0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
25000 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a  Resize(sqlite3 *
25010 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
25020 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72  , int n){.  Wher
25030 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20  eTerm **paNew;. 
25040 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d   if( p->nLSlot>=
25050 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n ) return SQLIT
25060 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37  E_OK;.  n = (n+7
25070 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20  )&~7;.  paNew = 
25080 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
25090 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d  aw(db, sizeof(p-
250a0 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a  >aLTerm[0])*n);.
250b0 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29    if( paNew==0 )
250c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
250d0 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70  OMEM;.  memcpy(p
250e0 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c  aNew, p->aLTerm,
250f0 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72   sizeof(p->aLTer
25100 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29  m[0])*p->nLSlot)
25110 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  ;.  if( p->aLTer
25120 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
25130 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
25140 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  e(db, p->aLTerm)
25150 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  ;.  p->aLTerm = 
25160 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c  paNew;.  p->nLSl
25170 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e  ot = n;.  return
25180 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
25190 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f  *.** Transfer co
251a0 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73  ntent from the s
251b0 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f  econd pLoop into
251c0 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73   the first..*/.s
251d0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
251e0 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20  oopXfer(sqlite3 
251f0 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
25200 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  pTo, WhereLoop *
25210 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 77 68  pFrom){.  if( wh
25220 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
25230 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c  , pTo, pFrom->nL
25240 54 65 72 6d 29 20 29 20 72 65 74 75 72 6e 20 53  Term) ) return S
25250 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 77  QLITE_NOMEM;.  w
25260 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
25270 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 6d  on(db, pTo);.  m
25280 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d  emcpy(pTo, pFrom
25290 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45  , WHERE_LOOP_XFE
252a0 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28  R_SZ);.  memcpy(
252b0 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72  pTo->aLTerm, pFr
252c0 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d  om->aLTerm, pTo-
252d0 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70  >nLTerm*sizeof(p
252e0 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b  To->aLTerm[0]));
252f0 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73  .  if( pFrom->ws
25300 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
25310 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20  RTUALTABLE ){.  
25320 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e    pFrom->u.vtab.
25330 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
25340 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d  }else if( (pFrom
25350 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
25360 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
25370 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75   ){.    pFrom->u
25380 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
25390 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
253a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
253b0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65  .** Delete a Whe
253c0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f  reLoop object.*/
253d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
253e0 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c  reLoopDelete(sql
253f0 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
25400 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65  oop *p){.  where
25410 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29  LoopClear(db, p)
25420 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
25430 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
25440 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49  ** Free a WhereI
25450 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f  nfo structure.*/
25460 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
25470 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74  reInfoFree(sqlit
25480 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66  e3 *db, WhereInf
25490 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66  o *pWInfo){.  if
254a0 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29  ( ALWAYS(pWInfo)
254b0 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61   ){.    whereCla
254c0 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f  useClear(&pWInfo
254d0 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c  ->sWC);.    whil
254e0 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  e( pWInfo->pLoop
254f0 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  s ){.      Where
25500 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f  Loop *p = pWInfo
25510 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20  ->pLoops;.      
25520 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d  pWInfo->pLoops =
25530 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20   p->pNextLoop;. 
25540 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65       whereLoopDe
25550 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  lete(db, p);.   
25560 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
25570 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
25580 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
25590 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65  nsert or replace
255a0 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74   a WhereLoop ent
255b0 72 79 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d  ry using the tem
255c0 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a  plate supplied..
255d0 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
255e0 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  g WhereLoop entr
255f0 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77  y might be overw
25600 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65  ritten if the ne
25610 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73  w template.** is
25620 20 62 65 74 74 65 72 20 61 6e 64 20 68 61 73 20   better and has 
25630 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
25640 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70  es.  Or the temp
25650 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e  late will be ign
25660 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69  ored.** and no i
25670 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72  nsert will occur
25680 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
25690 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73  WhereLoop is fas
256a0 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66  ter and has.** f
256b0 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
256c0 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c  s than the templ
256d0 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ate.  Otherwise 
256e0 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20  a new WhereLoop 
256f0 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65  is.** added base
25700 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  d on the templat
25710 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69  e..**.** If pBui
25720 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
25730 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65  not NULL then we
25740 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74   only care about
25750 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65   only the.** pre
25760 72 65 71 75 69 73 69 74 65 73 20 61 6e 64 20 72  requisites and r
25770 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73  Run and nOut cos
25780 74 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74  ts of the N best
25790 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a   loops.  That.**
257a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
257b0 67 61 74 68 65 72 65 64 20 69 6e 20 74 68 65 20  gathered in the 
257c0 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
257d0 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73   object.  This s
257e0 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73  pecial.** proces
257f0 73 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65  sing mode is use
25800 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c  d only for OR cl
25810 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
25820 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75  .**.** When accu
25830 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c  mulating multipl
25840 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42  e loops (when pB
25850 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69  uilder->pOrSet i
25860 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74  s NULL) we.** st
25870 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72  ill might overwr
25880 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70  ite similar loop
25890 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 74  s with the new t
258a0 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a  emplate if the.*
258b0 2a 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65  * template is be
258c0 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79  tter.  Loops may
258d0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
258e0 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
258f0 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20   .** conditions 
25900 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
25910 20 20 28 31 29 20 20 54 68 65 79 20 68 61 76 65    (1)  They have
25920 20 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a   the same iTab..
25930 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 79 20  **    (2)  They 
25940 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 53  have the same iS
25950 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33  ortIdx..**    (3
25960 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
25970 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65  has same or fewe
25980 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74  r dependencies t
25990 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
259a0 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20  loop.**    (4)  
259b0 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73  The template has
259c0 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77   the same or low
259d0 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65  er cost than the
259e0 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a   current loop.**
259f0 20 20 20 20 28 35 29 20 20 54 68 65 20 74 65 6d      (5)  The tem
25a00 70 6c 61 74 65 20 75 73 65 73 20 6d 6f 72 65 20  plate uses more 
25a10 74 65 72 6d 73 20 6f 66 20 74 68 65 20 73 61 6d  terms of the sam
25a20 65 20 69 6e 64 65 78 20 62 75 74 20 68 61 73 20  e index but has 
25a30 6e 6f 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  no additional.**
25a40 20 20 20 20 20 20 20 20 20 64 65 70 65 6e 64 65           depende
25a50 6e 63 69 65 73 20 20 20 20 20 20 20 20 20 20 0a  ncies          .
25a60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
25a70 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68  ereLoopInsert(Wh
25a80 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
25a90 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c  pBuilder, WhereL
25aa0 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b  oop *pTemplate){
25ab0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70  .  WhereLoop **p
25ac0 70 50 72 65 76 2c 20 2a 70 2c 20 2a 70 4e 65 78  pPrev, *p, *pNex
25ad0 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 49 6e  t = 0;.  WhereIn
25ae0 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
25af0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
25b00 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
25b10 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
25b20 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69  b;..  /* If pBui
25b30 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
25b40 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e  defined, then on
25b50 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66  ly keep track of
25b60 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20   the costs.  ** 
25b70 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a  and prereqs..  *
25b80 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72  /.  if( pBuilder
25b90 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 23  ->pOrSet!=0 ){.#
25ba0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
25bb0 41 42 4c 45 44 0a 20 20 20 20 75 31 36 20 6e 20  ABLED.    u16 n 
25bc0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  = pBuilder->pOrS
25bd0 65 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20 78  et->n;.    int x
25be0 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 77 68   =.#endif.    wh
25bf0 65 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69  ereOrInsert(pBui
25c00 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54  lder->pOrSet, pT
25c10 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c  emplate->prereq,
25c20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
25c30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c50 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
25c60 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52  >nOut);.#if WHER
25c70 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
25c80 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
25c90 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
25ca0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
25cb0 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20  ebugPrintf(x?"  
25cc0 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f   or-%d:  ":"   o
25cd0 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20  r-X:  ", n);.   
25ce0 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
25cf0 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 57 49  t(pTemplate, pWI
25d00 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a  nfo->pTabList);.
25d10 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
25d20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25d30 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61  K;.  }..  /* Sea
25d40 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74  rch for an exist
25d50 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f  ing WhereLoop to
25d60 20 6f 76 65 72 77 72 69 74 65 2c 20 6f 72 20 77   overwrite, or w
25d70 68 69 63 68 20 74 61 6b 65 73 0a 20 20 2a 2a 20  hich takes.  ** 
25d80 70 72 69 6f 72 69 74 79 20 6f 76 65 72 20 70 54  priority over pT
25d90 65 6d 70 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  emplate..  */.  
25da0 66 6f 72 28 70 70 50 72 65 76 3d 26 70 57 49 6e  for(ppPrev=&pWIn
25db0 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 3d 2a 70  fo->pLoops, p=*p
25dc0 70 50 72 65 76 3b 20 70 3b 20 70 70 50 72 65 76  pPrev; p; ppPrev
25dd0 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20  =&p->pNextLoop, 
25de0 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20 20  p=*ppPrev){.    
25df0 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65  if( p->iTab!=pTe
25e00 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20  mplate->iTab || 
25e10 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54 65  p->iSortIdx!=pTe
25e20 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64 78  mplate->iSortIdx
25e30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
25e40 65 69 74 68 65 72 20 74 68 65 20 69 54 61 62 20  either the iTab 
25e50 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61 6c 75  or iSortIdx valu
25e60 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65 72 65  es for two Where
25e70 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65 72 65  Loop are differe
25e80 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  nt.      ** then
25e90 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70   those WhereLoop
25ea0 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e  s need to be con
25eb0 73 69 64 65 72 65 64 20 73 65 70 61 72 61 74 65  sidered separate
25ec0 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69 73 0a  ly.  Neither is.
25ed0 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e 64 69        ** a candi
25ee0 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63 65 20  date to replace 
25ef0 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20  the other. */.  
25f00 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
25f10 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68    }.    /* In th
25f20 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
25f30 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 72 53  entation, the rS
25f40 65 74 75 70 20 76 61 6c 75 65 20 69 73 20 65 69  etup value is ei
25f50 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a  ther zero.    **
25f60 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20   or the cost of 
25f70 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f  building an auto
25f80 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f  matic index (Nlo
25f90 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67  gN) and the Nlog
25fa0 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20  N.    ** is the 
25fb0 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74 69  same for compati
25fc0 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20  ble WhereLoops. 
25fd0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
25fe0 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70  ->rSetup==0 || p
25ff0 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
26000 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  ==0 .           
26010 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74        || p->rSet
26020 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up==pTemplate->r
26030 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a  Setup );..    /*
26040 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
26050 65 65 28 29 20 61 6c 77 61 79 73 20 67 65 6e 65  ee() always gene
26060 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65 72 74  rates and insert
26070 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  s the automatic 
26080 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 73  index.    ** cas
26090 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63 65 20  e first.  Hence 
260a0 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e 64 69  compatible candi
260b0 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 73 20  date WhereLoops 
260c0 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c 61 72  never have a lar
260d0 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65 74 75  ger.    ** rSetu
260e0 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53 45 54  p. Call this SET
260f0 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a  UP-INVARIANT */.
26100 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
26110 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65  Setup>=pTemplate
26120 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20  ->rSetup );..   
26130 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20   if( (p->prereq 
26140 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  & pTemplate->pre
26150 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 0a  req)==p->prereq.
26160 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75       && p->rSetu
26170 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p<=pTemplate->rS
26180 65 74 75 70 0a 20 20 20 20 20 26 26 20 70 2d 3e  etup.     && p->
26190 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d  rRun<=pTemplate-
261a0 3e 72 52 75 6e 0a 20 20 20 20 29 7b 0a 20 20 20  >rRun.    ){.   
261b0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
261c0 68 20 74 61 6b 65 6e 20 77 68 65 6e 20 70 20 69  h taken when p i
261d0 73 20 65 71 75 61 6c 20 6f 72 20 62 65 74 74 65  s equal or bette
261e0 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  r than pTemplate
261f0 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c   in .      ** al
26200 6c 20 6f 66 20 28 31 29 20 64 65 70 65 6e 64 65  l of (1) depende
26210 6e 63 65 73 20 28 32 29 20 73 65 74 75 70 2d 63  nces (2) setup-c
26220 6f 73 74 2c 20 61 6e 64 20 28 33 29 20 72 75 6e  ost, and (3) run
26230 2d 63 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20  -cost. */.      
26240 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
26250 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p==pTemplate->rS
26260 65 74 75 70 20 29 3b 0a 20 20 20 20 20 20 69 66  etup );.      if
26270 28 20 70 2d 3e 6e 4c 54 65 72 6d 3c 70 54 65 6d  ( p->nLTerm<pTem
26280 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 0a 20 20  plate->nLTerm.  
26290 20 20 20 20 20 26 26 20 28 70 2d 3e 77 73 46 6c       && (p->wsFl
262a0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
262b0 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26  XED)!=0.       &
262c0 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73  & (pTemplate->ws
262d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
262e0 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20  DEXED)!=0.      
262f0 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70   && p->u.btree.p
26300 49 6e 64 65 78 3d 3d 70 54 65 6d 70 6c 61 74 65  Index==pTemplate
26310 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
26320 0a 20 20 20 20 20 20 20 26 26 20 70 2d 3e 70 72  .       && p->pr
26330 65 72 65 71 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  ereq==pTemplate-
26340 3e 70 72 65 72 65 71 0a 20 20 20 20 20 20 29 7b  >prereq.      ){
26350 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72  .        /* Over
26360 77 72 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e  write an existin
26370 67 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68  g WhereLoop with
26380 20 61 6e 20 73 69 6d 69 6c 61 72 20 6f 6e 65 20   an similar one 
26390 74 68 61 74 20 75 73 65 73 0a 20 20 20 20 20 20  that uses.      
263a0 20 20 2a 2a 20 6d 6f 72 65 20 74 65 72 6d 73 20    ** more terms 
263b0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  of the index */.
263c0 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20          pNext = 
263d0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20  p->pNextLoop;.  
263e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
263f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26400 20 20 2f 2a 20 70 54 65 6d 70 6c 61 74 65 20 69    /* pTemplate i
26410 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c 2e 0a 20  s not helpful.. 
26420 20 20 20 20 20 20 20 2a 2a 20 52 65 74 75 72 6e         ** Return
26430 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
26440 67 20 6f 72 20 61 64 64 69 6e 67 20 61 6e 79 74  g or adding anyt
26450 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20  hing */.        
26460 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 49 6e  goto whereLoopIn
26470 73 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20  sert_noop;.     
26480 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
26490 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
264a0 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
264b0 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  ==pTemplate->pre
264c0 72 65 71 0a 20 20 20 20 20 26 26 20 70 2d 3e 72  req.     && p->r
264d0 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run>=pTemplate->
264e0 72 52 75 6e 0a 20 20 20 20 20 26 26 20 41 4c 57  rRun.     && ALW
264f0 41 59 53 28 70 2d 3e 72 53 65 74 75 70 3e 3d 70  AYS(p->rSetup>=p
26500 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
26510 29 20 2f 2a 20 53 65 65 20 53 45 54 55 50 2d 49  ) /* See SETUP-I
26520 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a  NVARIANT above *
26530 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  /.    ){.      /
26540 2a 20 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65  * Overwrite an e
26550 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
26560 70 20 77 69 74 68 20 61 20 62 65 74 74 65 72 20  p with a better 
26570 6f 6e 65 3a 20 6f 6e 65 20 74 68 61 74 20 69 73  one: one that is
26580 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72  .      ** better
26590 20 61 74 20 6f 6e 65 20 6f 66 20 28 31 29 20 64   at one of (1) d
265a0 65 70 65 6e 64 65 6e 63 65 73 2c 20 28 32 29 20  ependences, (2) 
265b0 73 65 74 75 70 2d 63 6f 73 74 2c 20 6f 72 20 28  setup-cost, or (
265c0 33 29 20 72 75 6e 2d 63 6f 73 74 0a 20 20 20 20  3) run-cost.    
265d0 20 20 2a 2a 20 61 6e 64 20 69 73 20 6e 6f 20 77    ** and is no w
265e0 6f 72 73 65 20 69 6e 20 61 6e 79 20 6f 66 20 74  orse in any of t
265f0 68 6f 73 65 20 63 61 74 65 67 6f 72 69 65 73 2e  hose categories.
26600 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 78 74 20   */.      pNext 
26610 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  = p->pNextLoop;.
26620 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26630 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
26640 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
26650 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61  int it means tha
26660 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f  t either p[] sho
26670 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74 74  uld be overwritt
26680 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65  en.  ** with pTe
26690 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20  mplate[] if p[] 
266a0 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d  exists, or if p=
266b0 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63  =NULL then alloc
266c0 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57  ate a new.  ** W
266d0 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73  hereLoop and ins
266e0 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66  ert it..  */.#if
266f0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
26700 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
26710 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
26720 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  8 ){.    if( p!=
26730 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
26740 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69  e3DebugPrintf("i
26750 6e 73 2d 64 65 6c 3a 20 20 22 29 3b 0a 20 20 20  ns-del:  ");.   
26760 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
26770 74 28 70 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61  t(p, pWInfo->pTa
26780 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  bList);.    }.  
26790 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
267a0 69 6e 74 66 28 22 69 6e 73 2d 6e 65 77 3a 20 20  intf("ins-new:  
267b0 22 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f  ");.    whereLoo
267c0 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65  pPrint(pTemplate
267d0 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  , pWInfo->pTabLi
267e0 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  st);.  }.#endif.
267f0 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
26800 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    p = sqlite3DbM
26810 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
26820 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b  eof(WhereLoop));
26830 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
26840 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
26850 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f  MEM;.    whereLo
26860 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a 20  opInit(p);.  }. 
26870 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64   whereLoopXfer(d
26880 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29  b, p, pTemplate)
26890 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ;.  p->pNextLoop
268a0 20 3d 20 70 4e 65 78 74 3b 0a 20 20 2a 70 70 50   = pNext;.  *ppP
268b0 72 65 76 20 3d 20 70 3b 0a 20 20 69 66 28 20 28  rev = p;.  if( (
268c0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
268d0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
268e0 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ==0 ){.    Index
268f0 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e   *pIndex = p->u.
26900 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
26910 20 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20    if( pIndex && 
26920 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20  pIndex->tnum==0 
26930 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74  ){.      p->u.bt
26940 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  ree.pIndex = 0;.
26950 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
26960 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
26970 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
26980 20 74 68 65 20 69 6e 73 65 72 74 20 69 73 20 61   the insert is a
26990 20 6e 6f 2d 6f 70 20 2a 2f 0a 77 68 65 72 65 4c   no-op */.whereL
269a0 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3a 0a  oopInsert_noop:.
269b0 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
269c0 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
269d0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
269e0 20 30 78 38 20 29 7b 0a 20 20 20 20 73 71 6c 69   0x8 ){.    sqli
269f0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
26a00 69 6e 73 2d 6e 6f 6f 70 3a 20 22 29 3b 0a 20 20  ins-noop: ");.  
26a10 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
26a20 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e  (pTemplate, pWIn
26a30 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20  fo->pTabList);. 
26a40 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
26a50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a  rn SQLITE_OK;  .
26a60 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65  }../*.** We have
26a70 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65 64 20   so far matched 
26a80 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
26a90 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65 72 6d  u.btree.nEq term
26aa0 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 70  s of the index p
26ab0 49 6e 64 65 78 2e 0a 2a 2a 20 54 72 79 20 74 6f  Index..** Try to
26ac0 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e   match one more.
26ad0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65  .**.** If pProbe
26ae0 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20  ->tnum==0, that 
26af0 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69 73 20  means pIndex is 
26b00 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75 73 65  a fake index use
26b10 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54  d for the.** INT
26b20 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
26b30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26b40 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
26b50 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 4c  eIndex(.  WhereL
26b60 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
26b70 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54 68 65  lder,     /* The
26b80 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f   WhereLoop facto
26b90 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ry */.  struct S
26ba0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
26bb0 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  c,      /* FROM 
26bc0 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e  clause term bein
26bd0 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  g analyzed */.  
26be0 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c 20 20  Index *pProbe,  
26bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c00 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70  /* An index on p
26c10 53 72 63 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  Src */.  WhereCo
26c20 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20  st nInMul       
26c30 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28           /* log(
26c40 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74  Number of iterat
26c50 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e 29 20  ions due to IN) 
26c60 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  */.){.  WhereInf
26c70 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
26c80 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f  lder->pWInfo;  /
26c90 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 65 20  * WHERE analyse 
26ca0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72  context */.  Par
26cb0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49  se *pParse = pWI
26cc0 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20  nfo->pParse;    
26cd0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
26ce0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
26cf0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
26d00 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44  ->db;       /* D
26d10 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
26d20 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78  on malloc contex
26d30 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
26d40 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
26d50 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61         /* Templa
26d60 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64  te WhereLoop und
26d70 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
26d80 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
26d90 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
26da0 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72 65 54       /* A WhereT
26db0 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69 64  erm under consid
26dc0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
26dd0 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20   opMask;        
26de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26df0 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72 73 20  Valid operators 
26e00 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  for constraints 
26e10 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73  */.  WhereScan s
26e20 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  can;            
26e30 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
26e40 20 66 6f 72 20 57 48 45 52 45 20 74 65 72 6d 73   for WHERE terms
26e50 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73 61   */.  Bitmask sa
26e60 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20 20 20  ved_prereq;     
26e70 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
26e80 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
26e90 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75 31 36  >prereq */.  u16
26ea0 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20   saved_nLTerm;  
26eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26ec0 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
26ed0 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a  f pNew->nLTerm *
26ee0 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 5f 6e 45  /.  int saved_nE
26ef0 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
26f00 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
26f10 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75  value of pNew->u
26f20 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20  .btree.nEq */.  
26f30 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67  u32 saved_wsFlag
26f40 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
26f50 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
26f60 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61  e of pNew->wsFla
26f70 67 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  gs */.  WhereCos
26f80 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20  t saved_nOut;   
26f90 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
26fa0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
26fb0 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74  w->nOut */.  int
26fc0 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
26fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26fe0 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  Index of the col
26ff0 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
27000 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
27010 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
27020 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
27030 63 6f 64 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  code */.  WhereC
27040 6f 73 74 20 6e 52 6f 77 45 73 74 3b 20 20 20 20  ost nRowEst;    
27050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74            /* Est
27060 69 6d 61 74 65 64 20 69 6e 64 65 78 20 73 65 6c  imated index sel
27070 65 63 74 69 76 69 74 79 20 2a 2f 0a 20 20 57 68  ectivity */.  Wh
27080 65 72 65 43 6f 73 74 20 72 4c 6f 67 53 69 7a 65  ereCost rLogSize
27090 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
270a0 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61   Logarithm of ta
270b0 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68  ble size */.  Wh
270c0 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20  ereTerm *pTop = 
270d0 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a  0, *pBtm = 0; /*
270e0 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20   Top and bottom 
270f0 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
27100 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70  s */..  pNew = p
27110 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
27120 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
27130 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53  ailed ) return S
27140 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20  QLITE_NOMEM;..  
27150 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77  assert( (pNew->w
27160 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
27170 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
27180 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e  );.  assert( (pN
27190 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
271a0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d  ERE_TOP_LIMIT)==
271b0 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  0 );.  if( pNew-
271c0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
271d0 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
271e0 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54    opMask = WO_LT
271f0 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20  |WO_LE;.  }else 
27200 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d  if( pProbe->tnum
27210 3c 3d 30 20 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f  <=0 || (pSrc->jo
27220 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
27230 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61  )!=0 ){.    opMa
27240 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
27250 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
27260 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73  LT|WO_LE;.  }els
27270 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  e{.    opMask = 
27280 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49  WO_EQ|WO_IN|WO_I
27290 53 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47  SNULL|WO_GT|WO_G
272a0 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  E|WO_LT|WO_LE;. 
272b0 20 7d 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d   }.  if( pProbe-
272c0 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70  >bUnordered ) op
272d0 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c  Mask &= ~(WO_GT|
272e0 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_GE|WO_LT|WO_L
272f0 45 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  E);..  assert( p
27300 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
27310 3c 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  <=pProbe->nColum
27320 6e 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  n );.  if( pNew-
27330 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3c 20 70  >u.btree.nEq < p
27340 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Probe->nColumn )
27350 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 50 72  {.    iCol = pPr
27360 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e  obe->aiColumn[pN
27370 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d  ew->u.btree.nEq]
27380 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 3d 20  ;.    nRowEst = 
27390 77 68 65 72 65 43 6f 73 74 28 70 50 72 6f 62 65  whereCost(pProbe
273a0 2d 3e 61 69 52 6f 77 45 73 74 5b 70 4e 65 77 2d  ->aiRowEst[pNew-
273b0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 31 5d 29  >u.btree.nEq+1])
273c0 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73  ;.    if( nRowEs
273d0 74 3d 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e  t==0 && pProbe->
273e0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
273f0 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 31 3b 0a   ) nRowEst = 1;.
27400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 43 6f    }else{.    iCo
27410 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 6e 52 6f 77  l = -1;.    nRow
27420 45 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  Est = 0;.  }.  p
27430 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e  Term = whereScan
27440 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 42 75 69  Init(&scan, pBui
27450 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d  lder->pWC, pSrc-
27460 3e 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a  >iCursor, iCol,.
27470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27480 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20          opMask, 
27490 70 50 72 6f 62 65 29 3b 0a 20 20 73 61 76 65 64  pProbe);.  saved
274a0 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62  _nEq = pNew->u.b
274b0 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65  tree.nEq;.  save
274c0 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d  d_nLTerm = pNew-
274d0 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64  >nLTerm;.  saved
274e0 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d  _wsFlags = pNew-
274f0 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65  >wsFlags;.  save
27500 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d  d_prereq = pNew-
27510 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64  >prereq;.  saved
27520 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f  _nOut = pNew->nO
27530 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74  ut;.  pNew->rSet
27540 75 70 20 3d 20 30 3b 0a 20 20 72 4c 6f 67 53 69  up = 0;.  rLogSi
27550 7a 65 20 3d 20 65 73 74 4c 6f 67 28 77 68 65 72  ze = estLog(wher
27560 65 43 6f 73 74 28 70 50 72 6f 62 65 2d 3e 61 69  eCost(pProbe->ai
27570 52 6f 77 45 73 74 5b 30 5d 29 29 3b 0a 20 20 66  RowEst[0]));.  f
27580 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  or(; rc==SQLITE_
27590 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20  OK && pTerm!=0; 
275a0 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61  pTerm = whereSca
275b0 6e 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20  nNext(&scan)){. 
275c0 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a     int nIn = 0;.
275d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
275e0 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 20 20 69  ABLE_STAT4.    i
275f0 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70  nt nRecValid = p
27600 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
27610 69 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  id;.    assert( 
27620 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65  pNew->nOut==save
27630 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 69 66  d_nOut );.    if
27640 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
27650 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 21  s & TERM_VNULL)!
27660 3d 30 20 26 26 20 70 53 72 63 2d 3e 70 54 61 62  =0 && pSrc->pTab
27670 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74  ->aCol[iCol].not
27680 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 6f  Null ){.      co
27690 6e 74 69 6e 75 65 3b 20 2f 2a 20 73 6b 69 70 20  ntinue; /* skip 
276a0 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73  IS NOT NULL cons
276b0 74 72 61 69 6e 74 73 20 6f 6e 20 61 20 4e 4f 54  traints on a NOT
276c0 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   NULL column */.
276d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
276e0 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
276f0 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e  eqRight & pNew->
27700 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69  maskSelf ) conti
27710 6e 75 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  nue;..    assert
27720 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61  ( pNew->nOut==sa
27730 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 0a 20 20 20  ved_nOut );..   
27740 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
27750 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
27760 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
27770 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45  e.nEq = saved_nE
27780 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  q;.    pNew->nLT
27790 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65  erm = saved_nLTe
277a0 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72  rm;.    if( wher
277b0 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
277c0 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65  pNew, pNew->nLTe
277d0 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f  rm+1) ) break; /
277e0 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65  * OOM */.    pNe
277f0 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e  w->aLTerm[pNew->
27800 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72  nLTerm++] = pTer
27810 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  m;.    pNew->pre
27820 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72 65  req = (saved_pre
27830 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65  req | pTerm->pre
27840 72 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e 65  reqRight) & ~pNe
27850 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  w->maskSelf;.   
27860 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 4c   pNew->rRun = rL
27870 6f 67 53 69 7a 65 3b 20 2f 2a 20 42 61 73 65 6c  ogSize; /* Basel
27880 69 6e 65 20 63 6f 73 74 20 69 73 20 6c 6f 67 32  ine cost is log2
27890 28 4e 29 2e 20 20 41 64 6a 75 73 74 6d 65 6e 74  (N).  Adjustment
278a0 73 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 69  s below */.    i
278b0 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
278c0 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20  tor & WO_IN ){. 
278d0 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
278e0 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
278f0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
27900 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
27910 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69  LUMN_IN;.      i
27920 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
27930 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
27940 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
27950 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c     /* "x IN (SEL
27960 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49  ECT ...)":  TUNI
27970 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20 72  NG: the SELECT r
27980 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a  eturns 25 rows *
27990 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20  /.        nIn = 
279a0 34 36 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d  46;  assert( 46=
279b0 3d 77 68 65 72 65 43 6f 73 74 28 32 35 29 20 29  =whereCost(25) )
279c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
279d0 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e  ( ALWAYS(pExpr->
279e0 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70 72  x.pList && pExpr
279f0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
27a00 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
27a10 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61  "x IN (value, va
27a20 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20  lue, ...)" */.  
27a30 20 20 20 20 20 20 6e 49 6e 20 3d 20 77 68 65 72        nIn = wher
27a40 65 43 6f 73 74 28 70 45 78 70 72 2d 3e 78 2e 70  eCost(pExpr->x.p
27a50 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
27a60 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77      }.      pNew
27a70 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 3b 0a 20  ->rRun += nIn;. 
27a80 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
27a90 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20  ee.nEq++;.      
27aa0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f  pNew->nOut = nRo
27ab0 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20  wEst + nInMul + 
27ac0 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  nIn;.    }else i
27ad0 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
27ae0 74 6f 72 20 26 20 28 57 4f 5f 45 51 29 20 29 7b  tor & (WO_EQ) ){
27af0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
27b00 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
27b10 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55  (WHERE_COLUMN_NU
27b20 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  LL|WHERE_COLUMN_
27b30 49 4e 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  IN))!=0.        
27b40 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6e 49 6e            || nIn
27b50 4d 75 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Mul==0 );.      
27b60 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
27b70 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
27b80 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
27b90 3c 30 20 20 0a 20 20 20 20 20 20 20 7c 7c 20 28  <0  .       || (
27ba0 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21  pProbe->onError!
27bb0 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 6e 49 6e 4d  =OE_None && nInM
27bc0 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ul==0.          
27bd0 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65   && pNew->u.btre
27be0 65 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e  e.nEq==pProbe->n
27bf0 43 6f 6c 75 6d 6e 2d 31 29 0a 20 20 20 20 20 20  Column-1).      
27c00 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
27c10 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  t( (pNew->wsFlag
27c20 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
27c30 5f 49 4e 29 3d 3d 30 20 7c 7c 20 69 43 6f 6c 3c  _IN)==0 || iCol<
27c40 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  0 );.        pNe
27c50 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
27c60 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20  ERE_ONEROW;.    
27c70 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e    }.      pNew->
27c80 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20  u.btree.nEq++;. 
27c90 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
27ca0 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d  = nRowEst + nInM
27cb0 75 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ul;.    }else if
27cc0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
27cd0 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29  or & (WO_ISNULL)
27ce0 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
27cf0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
27d00 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20  _COLUMN_NULL;.  
27d10 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
27d20 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 2f  e.nEq++;.      /
27d30 2a 20 54 55 4e 49 4e 47 3a 20 49 53 20 4e 55 4c  * TUNING: IS NUL
27d40 4c 20 73 65 6c 65 63 74 73 20 32 20 72 6f 77 73  L selects 2 rows
27d50 20 2a 2f 0a 20 20 20 20 20 20 6e 49 6e 20 3d 20   */.      nIn = 
27d60 31 30 3b 20 20 61 73 73 65 72 74 28 20 31 30 3d  10;  assert( 10=
27d70 3d 77 68 65 72 65 43 6f 73 74 28 32 29 20 29 3b  =whereCost(2) );
27d80 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
27d90 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49  t = nRowEst + nI
27da0 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20  nMul + nIn;.    
27db0 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d  }else if( pTerm-
27dc0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
27dd0 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20  _GT|WO_GE) ){.  
27de0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
27df0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
27e00 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20 20   WO_GT );.      
27e10 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
27e20 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
27e30 47 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  GE );.      pNew
27e40 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
27e50 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
27e60 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b  WHERE_BTM_LIMIT;
27e70 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54  .      pBtm = pT
27e80 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20  erm;.      pTop 
27e90 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
27ea0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
27eb0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
27ec0 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29   (WO_LT|WO_LE) )
27ed0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
27ee0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
27ef0 6f 72 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20  or & WO_LT );.  
27f00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
27f10 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
27f20 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20   WO_LE );.      
27f30 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
27f40 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
27f50 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49  NGE|WHERE_TOP_LI
27f60 4d 49 54 3b 0a 20 20 20 20 20 20 70 54 6f 70 20  MIT;.      pTop 
27f70 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  = pTerm;.      p
27f80 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46  Btm = (pNew->wsF
27f90 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
27fa0 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20  _LIMIT)!=0 ?.   
27fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fc0 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70    pNew->aLTerm[p
27fd0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a  New->nLTerm-2] :
27fe0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
27ff0 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  ( pNew->wsFlags 
28000 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  & WHERE_COLUMN_R
28010 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ANGE ){.      /*
28020 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 61 6e 64   Adjust nOut and
28030 20 72 52 75 6e 20 66 6f 72 20 53 54 41 54 33 20   rRun for STAT3 
28040 72 61 6e 67 65 20 76 61 6c 75 65 73 20 2a 2f 0a  range values */.
28050 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
28060 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f  ew->nOut==saved_
28070 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 77 68  nOut );.      wh
28080 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28  ereRangeScanEst(
28090 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
280a0 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 26 70  , pBtm, pTop, &p
280b0 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20  New->nOut);.    
280c0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
280d0 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 20  ENABLE_STAT4.   
280e0 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 26   if( nInMul==0 &
280f0 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c  & pProbe->nSampl
28100 65 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f  e && Optimizatio
28110 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
28120 49 54 45 5f 53 74 61 74 33 29 20 29 7b 0a 20 20  ITE_Stat3) ){.  
28130 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
28140 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
28150 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f        tRowcnt nO
28160 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  ut = 0;.      if
28170 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
28180 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  tor & (WO_EQ|WO_
28190 49 53 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20  ISNULL))!=0 ){. 
281a0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
281b0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
281c0 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
281d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
281e0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
281f0 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  & WO_ISNULL );. 
28200 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
28210 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50  eEqualScanEst(pP
28220 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
28230 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
28240 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  nOut);.      }el
28250 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  se if( (pTerm->e
28260 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
28270 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ).             &
28280 26 20 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  &  !ExprHasPrope
28290 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
282a0 73 53 65 6c 65 63 74 29 20 20 29 7b 0a 20 20 20  sSelect)  ){.   
282b0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 49       rc = whereI
282c0 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  nScanEst(pParse,
282d0 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72   pBuilder, pExpr
282e0 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74  ->x.pList, &nOut
282f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
28300 20 61 73 73 65 72 74 28 20 6e 4f 75 74 3d 3d 30   assert( nOut==0
28310 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
28320 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  K );.      if( n
28330 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  Out ){.        n
28340 4f 75 74 20 3d 20 77 68 65 72 65 43 6f 73 74 28  Out = whereCost(
28350 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70  nOut);.        p
28360 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 4d 49 4e 28  New->nOut = MIN(
28370 6e 4f 75 74 2c 20 73 61 76 65 64 5f 6e 4f 75 74  nOut, saved_nOut
28380 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
28390 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
283a0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
283b0 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   (WHERE_IDX_ONLY
283c0 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20  |WHERE_IPK))==0 
283d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 61 63 68  ){.      /* Each
283e0 20 72 6f 77 20 69 6e 76 6f 6c 76 65 73 20 61 20   row involves a 
283f0 73 74 65 70 20 6f 66 20 74 68 65 20 69 6e 64 65  step of the inde
28400 78 2c 20 74 68 65 6e 20 61 20 62 69 6e 61 72 79  x, then a binary
28410 20 73 65 61 72 63 68 20 6f 66 0a 20 20 20 20 20   search of.     
28420 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20 74 61 62   ** the main tab
28430 6c 65 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  le */.      pNew
28440 2d 3e 72 52 75 6e 20 3d 20 20 77 68 65 72 65 43  ->rRun =  whereC
28450 6f 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75  ostAdd(pNew->rRu
28460 6e 2c 20 72 4c 6f 67 53 69 7a 65 3e 32 37 20 3f  n, rLogSize>27 ?
28470 20 72 4c 6f 67 53 69 7a 65 2d 31 37 20 3a 20 31   rLogSize-17 : 1
28480 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  0);.    }.    /*
28490 20 53 74 65 70 20 63 6f 73 74 20 66 6f 72 20 65   Step cost for e
284a0 61 63 68 20 6f 75 74 70 75 74 20 72 6f 77 20 2a  ach output row *
284b0 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e  /.    pNew->rRun
284c0 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28   = whereCostAdd(
284d0 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77  pNew->rRun, pNew
284e0 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20  ->nOut);.    /* 
284f0 54 42 44 3a 20 41 64 6a 75 73 74 20 6e 4f 75 74  TBD: Adjust nOut
28500 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
28510 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
28520 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
28530 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
28540 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 69 66 28  , pNew);.    if(
28550 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
28560 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
28570 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e  T)==0.     && pN
28580 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
28590 28 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  (pProbe->nColumn
285a0 20 2b 20 28 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d   + (pProbe->zNam
285b0 65 21 3d 30 29 29 0a 20 20 20 20 29 7b 0a 20 20  e!=0)).    ){.  
285c0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64      whereLoopAdd
285d0 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
285e0 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
285f0 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a  e, nInMul+nIn);.
28600 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e      }.    pNew->
28610 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
28620 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  t;.#ifdef SQLITE
28630 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20  _ENABLE_STAT4.  
28640 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
28650 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69  Valid = nRecVali
28660 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  d;.#endif.  }.  
28670 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73  pNew->prereq = s
28680 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70  aved_prereq;.  p
28690 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
286a0 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
286b0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
286c0 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
286d0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
286e0 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77  ved_nOut;.  pNew
286f0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
28700 5f 6e 4c 54 65 72 6d 3b 0a 20 20 72 65 74 75 72  _nLTerm;.  retur
28710 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
28720 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 69 74  eturn True if it
28730 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
28740 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20 62  t pIndex might b
28750 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69  e useful in.** i
28760 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  mplementing the 
28770 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
28780 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a  in pBuilder..**.
28790 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65 20  ** Return False 
287a0 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65 73  if pBuilder does
287b0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20   not contain an 
287c0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
287d0 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  or.** if there i
287e0 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49 6e  s no way for pIn
287f0 64 65 78 20 74 6f 20 62 65 20 75 73 65 66 75 6c  dex to be useful
28800 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   in implementing
28810 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42   that.** ORDER B
28820 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61  Y clause..*/.sta
28830 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69 67  tic int indexMig
28840 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42  htHelpWithOrderB
28850 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  y(.  WhereLoopBu
28860 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
28870 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
28880 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 0a  ,.  int iCursor.
28890 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
288a0 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a  OB;.  int ii, jj
288b0 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d  ;..  if( pIndex-
288c0 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65  >bUnordered ) re
288d0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
288e0 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  OB = pBuilder->p
288f0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29  WInfo->pOrderBy)
28900 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
28910 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
28920 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  OB->nExpr; ii++)
28930 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
28940 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
28950 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e  kipCollate(pOB->
28960 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  a[ii].pExpr);.  
28970 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
28980 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  =TK_COLUMN ) ret
28990 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70  urn 0;.    if( p
289a0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43  Expr->iTable==iC
289b0 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 66  ursor ){.      f
289c0 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64  or(jj=0; jj<pInd
289d0 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 6a 2b  ex->nColumn; jj+
289e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
289f0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
28a00 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
28a10 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b  [jj] ) return 1;
28a20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
28a30 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
28a40 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
28a50 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31   bitmask where 1
28a60 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
28a70 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
28a80 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  g column of.** t
28a90 68 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64  he table is used
28aa0 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f   by an index.  O
28ab0 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33  nly the first 63
28ac0 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e   columns are con
28ad0 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  sidered..*/.stat
28ae0 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d  ic Bitmask colum
28af0 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20  nsInIndex(Index 
28b00 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73  *pIdx){.  Bitmas
28b10 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  k m = 0;.  int j
28b20 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e  ;.  for(j=pIdx->
28b30 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b  nColumn-1; j>=0;
28b40 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78   j--){.    int x
28b50 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
28b60 6e 5b 6a 5d 3b 0a 20 20 20 20 74 65 73 74 63 61  n[j];.    testca
28b70 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a  se( x==BMS-1 );.
28b80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
28b90 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 69 66  =BMS-2 );.    if
28ba0 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d  ( x<BMS-1 ) m |=
28bb0 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 7d   MASKBIT(x);.  }
28bc0 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a  .  return m;.}..
28bd0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
28be0 69 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64  if a partial ind
28bf0 65 78 20 77 69 74 68 20 70 50 61 72 74 49 6e 64  ex with pPartInd
28c00 65 78 57 68 65 72 65 20 63 61 6e 20 62 65 20 75  exWhere can be u
28c10 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75  sed.** in the cu
28c20 72 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65  rrent query.  Re
28c30 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
28c40 63 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65  can be and false
28c50 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   if not..*/.stat
28c60 69 63 20 69 6e 74 20 77 68 65 72 65 55 73 61 62  ic int whereUsab
28c70 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69  lePartialIndex(i
28c80 6e 74 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c  nt iTab, WhereCl
28c90 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
28ca0 2a 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20  *pWhere){.  int 
28cb0 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  i;.  WhereTerm *
28cc0 70 54 65 72 6d 3b 0a 20 20 66 6f 72 28 69 3d 30  pTerm;.  for(i=0
28cd0 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
28ce0 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
28cf0 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
28d00 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
28d10 49 6d 70 6c 69 65 73 45 78 70 72 28 70 54 65 72  ImpliesExpr(pTer
28d20 6d 2d 3e 70 45 78 70 72 2c 20 70 57 68 65 72 65  m->pExpr, pWhere
28d30 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
28d40 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
28d50 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   0;.}../*.** Add
28d60 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
28d70 62 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e  bjects for a sin
28d80 67 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65  gle table of the
28d90 20 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20   join where the 
28da0 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e  table.** is iden
28db0 66 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72  fied by pBuilder
28dc0 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54  ->pNew->iTab.  T
28dd0 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61  hat table is gua
28de0 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a  ranteed to be.**
28df0 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c   a b-tree table,
28e00 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74   not a virtual t
28e10 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
28e20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
28e30 42 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f  Btree(.  WhereLo
28e40 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
28e50 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c  der, /* WHERE cl
28e60 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
28e70 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45   */.  Bitmask mE
28e80 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20  xtra            
28e90 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65    /* Extra prere
28ea0 71 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69  quesites for usi
28eb0 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  ng this table */
28ec0 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
28ed0 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
28ee0 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
28ef0 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  sis context */. 
28f00 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20   Index *pProbe; 
28f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28f20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  An index we are 
28f30 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20  evaluating */.  
28f40 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20  Index sPk;      
28f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
28f60 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65   fake index obje
28f70 63 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61  ct for the prima
28f80 72 79 20 6b 65 79 20 2a 2f 0a 20 20 74 52 6f 77  ry key */.  tRow
28f90 63 6e 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32  cnt aiRowEstPk[2
28fa0 5d 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ];      /* The a
28fb0 69 52 6f 77 45 73 74 5b 5d 20 76 61 6c 75 65 20  iRowEst[] value 
28fc0 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65  for the sPk inde
28fd0 78 20 2a 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c  x */.  int aiCol
28fe0 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20  umnPk = -1;     
28ff0 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d     /* The aColum
29000 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68  n[] value for th
29010 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20  e sPk index */. 
29020 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
29030 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  st;          /* 
29040 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
29050 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
29060 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20  ist_item *pSrc; 
29070 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
29080 75 73 65 20 62 74 72 65 65 20 74 65 72 6d 20 74  use btree term t
29090 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65  o add */.  Where
290a0 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20  Loop *pNew;     
290b0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61         /* Templa
290c0 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  te WhereLoop obj
290d0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ect */.  int rc 
290e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
290f0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
29100 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f  ode */.  int iSo
29110 72 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20  rtIdx = 1;      
29120 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75       /* Index nu
29130 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b  mber */.  int b;
29140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29150 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65        /* A boole
29160 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 57 68  an value */.  Wh
29170 65 72 65 43 6f 73 74 20 72 53 69 7a 65 3b 20 20  ereCost rSize;  
29180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d            /* num
29190 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
291a0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68  he table */.  Wh
291b0 65 72 65 43 6f 73 74 20 72 4c 6f 67 53 69 7a 65  ereCost rLogSize
291c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67  ;         /* Log
291d0 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75  arithm of the nu
291e0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
291f0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57  the table */.  W
29200 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
29210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
29220 65 20 70 61 72 73 65 64 20 57 48 45 52 45 20 63  e parsed WHERE c
29230 6c 61 75 73 65 20 2a 2f 0a 20 20 0a 20 20 70 4e  lause */.  .  pN
29240 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
29250 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20  New;.  pWInfo = 
29260 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
29270 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
29280 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
29290 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69  .  pSrc = pTabLi
292a0 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54  st->a + pNew->iT
292b0 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  ab;.  pWC = pBui
292c0 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73  lder->pWC;.  ass
292d0 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28  ert( !IsVirtual(
292e0 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a  pSrc->pTab) );..
292f0 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64    if( pSrc->pInd
29300 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20  ex ){.    /* An 
29310 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
29320 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61  e specifies a pa
29330 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74  rticular index t
29340 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72  o use */.    pPr
29350 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64  obe = pSrc->pInd
29360 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ex;.  }else{.   
29370 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
29380 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
29390 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b  e.  Create a fak
293a0 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  e Index object i
293b0 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76  n local.    ** v
293c0 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72  ariable sPk to r
293d0 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77  epresent the row
293e0 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  id primary key i
293f0 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73  ndex.  Make this
29400 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64  .    ** fake ind
29410 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  ex the first in 
29420 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78  a chain of Index
29430 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c   objects with al
29440 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20  l of the real.  
29450 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
29460 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e  follow */.    In
29470 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20  dex *pFirst;    
29480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29490 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69   First of real i
294a0 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61  ndices on the ta
294b0 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ble */.    memse
294c0 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f  t(&sPk, 0, sizeo
294d0 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73  f(Index));.    s
294e0 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a  Pk.nColumn = 1;.
294f0 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e      sPk.aiColumn
29500 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a   = &aiColumnPk;.
29510 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45 73 74      sPk.aiRowEst
29520 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20   = aiRowEstPk;. 
29530 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d     sPk.onError =
29540 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20   OE_Replace;.   
29550 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 53   sPk.pTable = pS
29560 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 69  rc->pTab;.    ai
29570 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 53  RowEstPk[0] = pS
29580 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73  rc->pTab->nRowEs
29590 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  t;.    aiRowEstP
295a0 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70 46  k[1] = 1;.    pF
295b0 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61  irst = pSrc->pTa
295c0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  b->pIndex;.    i
295d0 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65  f( pSrc->notInde
295e0 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  xed==0 ){.      
295f0 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69  /* The real indi
29600 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ces of the table
29610 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64   are only consid
29620 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20  ered if the.    
29630 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44    ** NOT INDEXED
29640 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d   qualifier is om
29650 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46  itted from the F
29660 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
29670 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20      sPk.pNext = 
29680 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20  pFirst;.    }.  
29690 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b    pProbe = &sPk;
296a0 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 77  .  }.  rSize = w
296b0 68 65 72 65 43 6f 73 74 28 70 53 72 63 2d 3e 70  hereCost(pSrc->p
296c0 54 61 62 2d 3e 6e 52 6f 77 45 73 74 29 3b 0a 20  Tab->nRowEst);. 
296d0 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c   rLogSize = estL
296e0 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a  og(rSize);..  /*
296f0 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   Automatic index
29700 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75  es */.  if( !pBu
29710 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 0a 20 20  ilder->pOrSet.  
29720 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61   && (pWInfo->pPa
29730 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
29740 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65   SQLITE_AutoInde
29750 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72 63  x)!=0.   && pSrc
29760 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 26  ->pIndex==0.   &
29770 26 20 21 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f  & !pSrc->viaCoro
29780 75 74 69 6e 65 0a 20 20 20 26 26 20 21 70 53 72  utine.   && !pSr
29790 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a 20 20  c->notIndexed.  
297a0 20 26 26 20 21 70 53 72 63 2d 3e 69 73 43 6f 72   && !pSrc->isCor
297b0 72 65 6c 61 74 65 64 0a 20 20 29 7b 0a 20 20 20  related.  ){.   
297c0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74   /* Generate aut
297d0 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f  o-index WhereLoo
297e0 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  ps */.    WhereT
297f0 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20  erm *pTerm;.    
29800 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e  WhereTerm *pWCEn
29810 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
29820 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72  ->nTerm;.    for
29830 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72  (pTerm=pWC->a; r
29840 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
29850 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
29860 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  erm++){.      if
29870 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  ( pTerm->prereqR
29880 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73  ight & pNew->mas
29890 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65  kSelf ) continue
298a0 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d  ;.      if( term
298b0 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54  CanDriveIndex(pT
298c0 65 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b  erm, pSrc, 0) ){
298d0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
298e0 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a  .btree.nEq = 1;.
298f0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
29900 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
29910 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
29920 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
29930 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
29940 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
29950 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
29960 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f  One-time cost fo
29970 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20  r computing the 
29980 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
29990 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 70  is.        ** ap
299a0 70 72 6f 78 69 6d 61 74 65 6c 79 20 37 2a 4e 2a  proximately 7*N*
299b0 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20  log2(N) where N 
299c0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
299d0 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20   rows in.       
299e0 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
299f0 69 6e 67 20 69 6e 64 65 78 65 64 2e 20 2a 2f 0a  ing indexed. */.
29a00 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53          pNew->rS
29a10 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20  etup = rLogSize 
29a20 2b 20 72 53 69 7a 65 20 2b 20 32 38 3b 20 20 61  + rSize + 28;  a
29a30 73 73 65 72 74 28 20 32 38 3d 3d 77 68 65 72 65  ssert( 28==where
29a40 43 6f 73 74 28 37 29 20 29 3b 0a 20 20 20 20 20  Cost(7) );.     
29a50 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61     /* TUNING: Ea
29a60 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  ch index lookup 
29a70 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69  yields 20 rows i
29a80 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  n the table.  Th
29a90 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  is.        ** is
29aa0 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75   more than the u
29ab0 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30  sual guess of 10
29ac0 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20   rows, since we 
29ad0 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20  have no way.    
29ae0 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 6e 69      ** of knowni
29af0 6e 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65  ng how selective
29b00 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20   the index will 
29b10 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20  ultimately be.  
29b20 49 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20  It would.       
29b30 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61   ** not be unrea
29b40 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20  sonable to make 
29b50 74 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20  this value much 
29b60 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  larger. */.     
29b70 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
29b80 34 33 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d  43;  assert( 43=
29b90 3d 77 68 65 72 65 43 6f 73 74 28 32 30 29 20 29  =whereCost(20) )
29ba0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
29bb0 72 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74  rRun = whereCost
29bc0 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65  Add(rLogSize,pNe
29bd0 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  w->nOut);.      
29be0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
29bf0 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  = WHERE_AUTO_IND
29c00 45 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  EX;.        pNew
29c10 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72  ->prereq = mExtr
29c20 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  a | pTerm->prere
29c30 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
29c40 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
29c50 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
29c60 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
29c70 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f    }.  }..  /* Lo
29c80 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69  op over all indi
29c90 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b  ces.  */.  for(;
29ca0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
29cb0 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65  & pProbe; pProbe
29cc0 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20  =pProbe->pNext, 
29cd0 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20  iSortIdx++){.   
29ce0 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50 61   if( pProbe->pPa
29cf0 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20  rtIdxWhere!=0.  
29d00 20 20 20 26 26 20 21 77 68 65 72 65 55 73 61 62     && !whereUsab
29d10 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 70  lePartialIndex(p
29d20 4e 65 77 2d 3e 69 54 61 62 2c 20 70 57 43 2c 20  New->iTab, pWC, 
29d30 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78  pProbe->pPartIdx
29d40 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20  Where) ){.      
29d50 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61  continue;  /* Pa
29d60 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61 70  rtial index inap
29d70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
29d80 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  is query */.    
29d90 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  }.    pNew->u.bt
29da0 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20  ree.nEq = 0;.   
29db0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
29dc0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f  0;.    pNew->iSo
29dd0 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70  rtIdx = 0;.    p
29de0 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
29df0 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
29e00 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20  q = mExtra;.    
29e10 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
29e20 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ze;.    pNew->u.
29e30 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
29e40 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69  Probe;.    b = i
29e50 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
29e60 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64 65  hOrderBy(pBuilde
29e70 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d  r, pProbe, pSrc-
29e80 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f  >iCursor);.    /
29e90 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45  * The ONEPASS_DE
29ea0 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65  SIRED flags neve
29eb0 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65  r occurs togethe
29ec0 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59 20  r with ORDER BY 
29ed0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
29ee0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
29ef0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
29f00 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
29f10 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  | b==0 );.    if
29f20 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d  ( pProbe->tnum<=
29f30 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  0 ){.      /* In
29f40 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65  teger primary ke
29f50 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  y index */.     
29f60 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
29f70 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20   WHERE_IPK;..   
29f80 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65     /* Full table
29f90 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70   scan */.      p
29fa0 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
29fb0 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30  b ? iSortIdx : 0
29fc0 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
29fd0 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20  G: Cost of full 
29fe0 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 33 2a  table scan is 3*
29ff0 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20  (N + log2(N)).. 
2a000 20 20 20 20 20 2a 2a 20 20 2b 20 20 54 68 65 20       **  +  The 
2a010 65 78 74 72 61 20 33 20 66 61 63 74 6f 72 20 69  extra 3 factor i
2a020 73 20 74 6f 20 65 6e 63 6f 75 72 61 67 65 20 74  s to encourage t
2a030 68 65 20 75 73 65 20 6f 66 20 69 6e 64 65 78 65  he use of indexe
2a040 64 20 6c 6f 6f 6b 75 70 73 0a 20 20 20 20 20 20  d lookups.      
2a050 2a 2a 20 20 20 20 20 6f 76 65 72 20 66 75 6c 6c  **     over full
2a060 20 73 63 61 6e 73 2e 20 20 41 20 73 6d 61 6c 6c   scans.  A small
2a070 65 72 20 63 6f 6e 73 74 61 6e 74 20 32 20 69 73  er constant 2 is
2a080 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 69   used for coveri
2a090 6e 67 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  ng.      **     
2a0a0 69 6e 64 65 78 20 73 63 61 6e 73 20 73 6f 20 74  index scans so t
2a0b0 68 61 74 20 61 20 63 6f 76 65 72 69 6e 67 20 69  hat a covering i
2a0c0 6e 64 65 78 20 73 63 61 6e 20 77 69 6c 6c 20 62  ndex scan will b
2a0d0 65 20 66 61 76 6f 72 65 64 20 6f 76 65 72 0a 20  e favored over. 
2a0e0 20 20 20 20 20 2a 2a 20 20 20 20 20 61 20 74 61       **     a ta
2a0f0 62 6c 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20  ble scan. */.   
2a100 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
2a110 77 68 65 72 65 43 6f 73 74 41 64 64 28 72 53 69  whereCostAdd(rSi
2a120 7a 65 2c 72 4c 6f 67 53 69 7a 65 29 20 2b 20 31  ze,rLogSize) + 1
2a130 36 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  6;.      rc = wh
2a140 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
2a150 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
2a160 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
2a170 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
2a180 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20        Bitmask m 
2a190 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  = pSrc->colUsed 
2a1a0 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  & ~columnsInInde
2a1b0 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20  x(pProbe);.     
2a1c0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
2a1d0 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52 45   (m==0) ? (WHERE
2a1e0 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f  _IDX_ONLY|WHERE_
2a1f0 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52 45  INDEXED) : WHERE
2a200 5f 49 4e 44 45 58 45 44 3b 0a 0a 20 20 20 20 20  _INDEXED;..     
2a210 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69   /* Full scan vi
2a220 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  a index */.     
2a230 20 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c   if( b.       ||
2a240 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20   ( m==0.        
2a250 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f   && pProbe->bUno
2a260 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20  rdered==0.      
2a270 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
2a280 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2a290 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
2a2a0 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  D)==0.         &
2a2b0 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
2a2c0 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20 20  onfig.bUseCis.  
2a2d0 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69         && Optimi
2a2e0 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57  zationEnabled(pW
2a2f0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
2a300 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64  , SQLITE_CoverId
2a310 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20 20  xScan).         
2a320 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20   ).      ){.    
2a330 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
2a340 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64  dx = b ? iSortId
2a350 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 69  x : 0;.        i
2a360 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( m==0 ){.     
2a370 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
2a380 43 6f 73 74 20 6f 66 20 61 20 63 6f 76 65 72 69  Cost of a coveri
2a390 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69 73  ng index scan is
2a3a0 20 32 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29   2*(N + log2(N))
2a3b0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  ..          **  
2a3c0 2b 20 20 54 68 65 20 65 78 74 72 61 20 32 20 66  +  The extra 2 f
2a3d0 61 63 74 6f 72 20 69 73 20 74 6f 20 65 6e 63 6f  actor is to enco
2a3e0 75 72 61 67 65 20 74 68 65 20 75 73 65 20 6f 66  urage the use of
2a3f0 20 69 6e 64 65 78 65 64 20 6c 6f 6f 6b 75 70 73   indexed lookups
2a400 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20  .          **   
2a410 20 20 6f 76 65 72 20 69 6e 64 65 78 20 73 63 61    over index sca
2a420 6e 73 2e 20 20 41 20 74 61 62 6c 65 20 73 63 61  ns.  A table sca
2a430 6e 20 75 73 65 73 20 61 20 66 61 63 74 6f 72 20  n uses a factor 
2a440 6f 66 20 33 20 73 6f 20 74 68 61 74 0a 20 20 20  of 3 so that.   
2a450 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e         **     in
2a460 64 65 78 20 73 63 61 6e 73 20 61 72 65 20 66 61  dex scans are fa
2a470 76 6f 72 65 64 20 6f 76 65 72 20 74 61 62 6c 65  vored over table
2a480 20 73 63 61 6e 73 2e 0a 20 20 20 20 20 20 20 20   scans..        
2a490 20 20 2a 2a 20 20 2b 20 20 49 66 20 74 68 69 73    **  +  If this
2a4a0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
2a4b0 6d 69 67 68 74 20 61 6c 73 6f 20 68 65 6c 70 20  might also help 
2a4c0 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45  satisfy the ORDE
2a4d0 52 20 42 59 0a 20 20 20 20 20 20 20 20 20 20 2a  R BY.          *
2a4e0 2a 20 20 20 20 20 63 6c 61 75 73 65 2c 20 74 68  *     clause, th
2a4f0 65 6e 20 74 68 65 20 63 6f 73 74 20 69 73 20 66  en the cost is f
2a500 75 64 67 65 64 20 64 6f 77 6e 20 73 6c 69 67 68  udged down sligh
2a510 74 6c 79 20 73 6f 20 74 68 61 74 20 74 68 69 73  tly so that this
2a520 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20  .          **   
2a530 20 20 69 6e 64 65 78 20 69 73 20 66 61 76 6f 72    index is favor
2a540 65 64 20 61 62 6f 76 65 20 6f 74 68 65 72 20 69  ed above other i
2a550 6e 64 69 63 65 73 20 74 68 61 74 20 68 61 76 65  ndices that have
2a560 20 6e 6f 20 68 6f 70 65 20 6f 66 0a 20 20 20 20   no hope of.    
2a570 20 20 20 20 20 20 2a 2a 20 20 20 20 20 68 65 6c        **     hel
2a580 70 69 6e 67 20 77 69 74 68 20 74 68 65 20 4f 52  ping with the OR
2a590 44 45 52 20 42 59 2e 20 2a 2f 0a 20 20 20 20 20  DER BY. */.     
2a5a0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2a5b0 3d 20 31 30 20 2b 20 77 68 65 72 65 43 6f 73 74  = 10 + whereCost
2a5c0 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69  Add(rSize,rLogSi
2a5d0 7a 65 29 20 2d 20 62 3b 0a 20 20 20 20 20 20 20  ze) - b;.       
2a5e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a5f0 20 20 61 73 73 65 72 74 28 20 62 21 3d 30 20 29    assert( b!=0 )
2a600 3b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ; .          /* 
2a610 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20  TUNING: Cost of 
2a620 73 63 61 6e 6e 69 6e 67 20 61 20 6e 6f 6e 2d 63  scanning a non-c
2a630 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 69 73  overing index is
2a640 20 28 4e 2b 31 29 2a 6c 6f 67 32 28 4e 29 0a 20   (N+1)*log2(N). 
2a650 20 20 20 20 20 20 20 20 20 2a 2a 20 77 68 69 63           ** whic
2a660 68 20 77 65 20 77 69 6c 6c 20 73 69 6d 70 6c 69  h we will simpli
2a670 66 79 20 74 6f 20 6a 75 73 74 20 4e 2a 6c 6f 67  fy to just N*log
2a680 32 28 4e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  2(N) */.        
2a690 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72    pNew->rRun = r
2a6a0 53 69 7a 65 20 2b 20 72 4c 6f 67 53 69 7a 65 3b  Size + rLogSize;
2a6b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a6c0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2a6d0 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
2a6e0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
2a6f0 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
2a700 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2a710 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2a720 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
2a730 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
2a740 70 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64  pProbe, 0);.#ifd
2a750 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2a760 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c 69 74  _STAT4.    sqlit
2a770 65 33 53 74 61 74 34 50 72 6f 62 65 46 72 65 65  e3Stat4ProbeFree
2a780 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 29  (pBuilder->pRec)
2a790 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ;.    pBuilder->
2a7a0 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20  nRecValid = 0;. 
2a7b0 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65     pBuilder->pRe
2a7c0 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  c = 0;.#endif.. 
2a7d0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
2a7e0 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  as an INDEXED BY
2a7f0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e   clause, then on
2a800 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65  ly that one inde
2a810 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  x is.    ** cons
2a820 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  idered. */.    i
2a830 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20  f( pSrc->pIndex 
2a840 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
2a850 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
2a860 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2a870 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
2a880 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
2a890 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
2a8a0 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65  r a table of the
2a8b0 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64   join identified
2a8c0 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d   by.** pBuilder-
2a8d0 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68  >pNew->iTab.  Th
2a8e0 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72  at table is guar
2a8f0 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 76  anteed to be a v
2a900 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  irtual table..*/
2a910 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
2a920 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
2a930 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
2a940 64 65 72 20 2a 70 42 75 69 6c 64 65 72 20 20 20  der *pBuilder   
2a950 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
2a960 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 29  information */.)
2a970 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
2a980 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
2a990 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
2a9a0 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  is context */.  
2a9b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
2a9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a9d0 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
2a9e0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
2a9f0 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
2aa00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
2aa10 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
2aa20 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2aa30 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54  em *pSrc;   /* T
2aa40 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
2aa50 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
2aa60 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
2aa70 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2aa80 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
2aa90 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20  nfo *pIdxInfo;. 
2aaa0 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
2aab0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
2aac0 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74   *pIdxCons;.  st
2aad0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
2aae0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
2aaf0 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57  age *pUsage;.  W
2ab00 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
2ab10 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
2ab20 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54 65 72 6d  nt iTerm, mxTerm
2ab30 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61  ;.  int nConstra
2ab40 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49  int;.  int seenI
2ab50 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
2ab60 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2ab70 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  n IN operator is
2ab80 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73   seen */.  int s
2ab90 65 65 6e 56 61 72 20 3d 20 30 3b 20 20 20 20 20  eenVar = 0;     
2aba0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2abb0 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  if a non-constan
2abc0 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  t constraint is 
2abd0 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50  seen */.  int iP
2abe0 68 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  hase;           
2abf0 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e         /* 0: con
2ac00 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f  st w/o IN, 1: co
2ac10 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20  nst, 2: no IN,  
2ac20 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65  2: IN */.  Where
2ac30 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Loop *pNew;.  in
2ac40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2ac50 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42  ;..  pWInfo = pB
2ac60 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
2ac70 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
2ac80 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  o->pParse;.  db 
2ac90 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2aca0 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
2acb0 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42  pWC;.  pNew = pB
2acc0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
2acd0 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  pSrc = &pWInfo->
2ace0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77  pTabList->a[pNew
2acf0 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54 61 62 20  ->iTab];.  pTab 
2ad00 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
2ad10 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75 61  assert( IsVirtua
2ad20 6c 28 70 54 61 62 29 20 29 3b 0a 20 20 70 49 64  l(pTab) );.  pId
2ad30 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65  xInfo = allocate
2ad40 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65  IndexInfo(pParse
2ad50 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 70 42 75  , pWC, pSrc, pBu
2ad60 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29  ilder->pOrderBy)
2ad70 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
2ad80 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
2ad90 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65  ITE_NOMEM;.  pNe
2ada0 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20  w->prereq = 0;. 
2adb0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
2adc0 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  0;.  pNew->wsFla
2add0 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55  gs = WHERE_VIRTU
2ade0 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d  ALTABLE;.  pNew-
2adf0 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  >nLTerm = 0;.  p
2ae00 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
2ae10 46 72 65 65 20 3d 20 30 3b 0a 20 20 70 55 73 61  Free = 0;.  pUsa
2ae20 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61  ge = pIdxInfo->a
2ae30 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b  ConstraintUsage;
2ae40 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  .  nConstraint =
2ae50 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73   pIdxInfo->nCons
2ae60 74 72 61 69 6e 74 3b 0a 20 20 69 66 28 20 77 68  traint;.  if( wh
2ae70 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
2ae80 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61  , pNew, nConstra
2ae90 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  int) ){.    sqli
2aea0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
2aeb0 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74  dxInfo);.    ret
2aec0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2aed0 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68  ;.  }..  for(iPh
2aee0 61 73 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33  ase=0; iPhase<=3
2aef0 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20  ; iPhase++){.   
2af00 20 69 66 28 20 21 73 65 65 6e 49 6e 20 26 26 20   if( !seenIn && 
2af10 28 69 50 68 61 73 65 26 31 29 21 3d 30 20 29 7b  (iPhase&1)!=0 ){
2af20 0a 20 20 20 20 20 20 69 50 68 61 73 65 2b 2b 3b  .      iPhase++;
2af30 0a 20 20 20 20 20 20 69 66 28 20 69 50 68 61 73  .      if( iPhas
2af40 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  e>3 ) break;.   
2af50 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e   }.    if( !seen
2af60 56 61 72 20 26 26 20 69 50 68 61 73 65 3e 31 20  Var && iPhase>1 
2af70 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 64  ) break;.    pId
2af80 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74  xCons = *(struct
2af90 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
2afa0 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
2afb0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
2afc0 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  nt;.    for(i=0;
2afd0 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
2afe0 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
2aff0 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
2b000 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e    j = pIdxCons->
2b010 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
2b020 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
2b030 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69  >a[j];.      swi
2b040 74 63 68 28 20 69 50 68 61 73 65 20 29 7b 0a 20  tch( iPhase ){. 
2b050 20 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 20         case 0:  
2b060 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77    /* Constants w
2b070 69 74 68 6f 75 74 20 49 4e 20 6f 70 65 72 61 74  ithout IN operat
2b080 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
2b090 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
2b0a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2b0b0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2b0c0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d  rator & WO_IN)!=
2b0d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2b0e0 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20   seenIn = 1;.   
2b0f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b100 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
2b110 65 72 65 71 52 69 67 68 74 21 3d 30 20 29 7b 0a  ereqRight!=0 ){.
2b120 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e              seen
2b130 56 61 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Var = 1;.       
2b140 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54     }else if( (pT
2b150 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2b160 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20 20   WO_IN)==0 ){.  
2b170 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
2b180 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a  ns->usable = 1;.
2b190 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b1a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2b1b0 20 20 20 20 20 63 61 73 65 20 31 3a 20 20 20 20       case 1:    
2b1c0 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74  /* Constants wit
2b1d0 68 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a  h IN operators *
2b1e0 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
2b1f0 72 74 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20  rt( seenIn );.  
2b200 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
2b210 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72  ->usable = (pTer
2b220 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d  m->prereqRight==
2b230 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
2b240 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
2b250 65 20 32 3a 20 20 20 20 2f 2a 20 56 61 72 69 61  e 2:    /* Varia
2b260 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e 20  bles without IN 
2b270 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
2b280 65 72 74 28 20 73 65 65 6e 56 61 72 20 29 3b 0a  ert( seenVar );.
2b290 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
2b2a0 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54  ns->usable = (pT
2b2b0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2b2c0 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20   WO_IN)==0;.    
2b2d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2b2e0 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20       default:   
2b2f0 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69 74  /* Variables wit
2b300 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20  h IN */.        
2b310 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61    assert( seenVa
2b320 72 20 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20  r && seenIn );. 
2b330 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
2b340 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20  s->usable = 1;. 
2b350 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2b360 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b370 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c    memset(pUsage,
2b380 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67   0, sizeof(pUsag
2b390 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e  e[0])*pIdxInfo->
2b3a0 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
2b3b0 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
2b3c0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
2b3d0 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
2b3e0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
2b3f0 29 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  );.    pIdxInfo-
2b400 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  >idxStr = 0;.   
2b410 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
2b420 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  m = 0;.    pIdxI
2b430 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
2b440 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70  dxStr = 0;.    p
2b450 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
2b460 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
2b470 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
2b480 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49  matedCost = SQLI
2b490 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f  TE_BIG_DBL / (do
2b4a0 75 62 6c 65 29 32 3b 0a 20 20 20 20 72 63 20 3d  uble)2;.    rc =
2b4b0 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70   vtabBestIndex(p
2b4c0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64  Parse, pTab, pId
2b4d0 78 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20  xInfo);.    if( 
2b4e0 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c  rc ) goto whereL
2b4f0 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b  oopAddVtab_exit;
2b500 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  .    pIdxCons = 
2b510 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
2b520 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
2b530 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
2b540 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  Constraint;.    
2b550 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30  pNew->prereq = 0
2b560 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d  ;.    mxTerm = -
2b570 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
2b580 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f  New->nLSlot>=nCo
2b590 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 20 20  nstraint );.    
2b5a0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
2b5b0 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65  traint; i++) pNe
2b5c0 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30  w->aLTerm[i] = 0
2b5d0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74  ;.    pNew->u.vt
2b5e0 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b  ab.omitMask = 0;
2b5f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2b600 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
2b610 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
2b620 20 20 20 20 20 69 66 28 20 28 69 54 65 72 6d 20       if( (iTerm 
2b630 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  = pUsage[i].argv
2b640 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b  Index - 1)>=0 ){
2b650 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49 64  .        j = pId
2b660 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
2b670 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  et;.        if( 
2b680 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69  iTerm>=nConstrai
2b690 6e 74 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a  nt.         || j
2b6a0 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a  <0.         || j
2b6b0 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20  >=pWC->nTerm.   
2b6c0 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61        || pNew->a
2b6d0 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a  LTerm[iTerm]!=0.
2b6e0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2b6f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2b700 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
2b710 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2b720 67 28 70 50 61 72 73 65 2c 20 22 25 73 2e 78 42  g(pParse, "%s.xB
2b730 65 73 74 49 6e 64 65 78 28 29 20 6d 61 6c 66 75  estIndex() malfu
2b740 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a  nction", pTab->z
2b750 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
2b760 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41   goto whereLoopA
2b770 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20  ddVtab_exit;.   
2b780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
2b790 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
2b7a0 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b  nConstraint-1 );
2b7b0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2b7c0 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( j==0 );.     
2b7d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
2b7e0 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a  pWC->nTerm-1 );.
2b7f0 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
2b800 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20  &pWC->a[j];.    
2b810 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
2b820 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65   |= pTerm->prere
2b830 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
2b840 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e  assert( iTerm<pN
2b850 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
2b860 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
2b870 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72  rm[iTerm] = pTer
2b880 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  m;.        if( i
2b890 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78  Term>mxTerm ) mx
2b8a0 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20  Term = iTerm;.  
2b8b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b8c0 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20  iTerm==15 );.   
2b8d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2b8e0 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20  Term==16 );.    
2b8f0 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36      if( iTerm<16
2b900 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d   && pUsage[i].om
2b910 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61  it ) pNew->u.vta
2b920 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c  b.omitMask |= 1<
2b930 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  <iTerm;.        
2b940 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2b950 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d  rator & WO_IN)!=
2b960 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
2b970 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  f( pUsage[i].omi
2b980 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
2b990 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74      /* Do not at
2b9a0 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e 20  tempt to use an 
2b9b0 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 66  IN constraint if
2b9c0 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
2b9d0 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
2b9e0 2a 20 73 61 79 73 20 74 68 61 74 20 74 68 65 20  * says that the 
2b9f0 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63 6f  equivalent EQ co
2ba00 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
2ba10 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74 65  be safely omitte
2ba20 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  d..            *
2ba30 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74 65 6d  * If we do attem
2ba40 70 74 20 74 6f 20 75 73 65 20 73 75 63 68 20 61  pt to use such a
2ba50 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d   constraint, som
2ba60 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65 0a  e rows might be.
2ba70 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
2ba80 65 70 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f  epeated in the o
2ba90 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20  utput. */.      
2baa0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2bab0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bac0 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20     /* A virtual 
2bad0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f  table that is co
2bae0 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20  nstrained by an 
2baf0 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f  IN clause may no
2bb00 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
2bb10 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52  onsume the ORDER
2bb20 20 42 59 20 63 6c 61 75 73 65 20 62 65 63 61 75   BY clause becau
2bb30 73 65 20 28 31 29 20 74 68 65 20 6f 72 64 65 72  se (1) the order
2bb40 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20   of IN terms.   
2bb50 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
2bb60 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c   necessarily rel
2bb70 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65  ated to the orde
2bb80 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d  r of output term
2bb90 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  s and.          
2bba0 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20  ** (2) Multiple 
2bbb0 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73  outputs from a s
2bbc0 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77  ingle IN value w
2bbd0 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20  ill not merge.  
2bbe0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74          ** toget
2bbf0 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  her.  */.       
2bc00 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64     pIdxInfo->ord
2bc10 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30  erByConsumed = 0
2bc20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2bc30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2bc40 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  ( i>=nConstraint
2bc50 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
2bc60 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b  nLTerm = mxTerm+
2bc70 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
2bc80 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70   pNew->nLTerm<=p
2bc90 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
2bca0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
2bcb0 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49  b.idxNum = pIdxI
2bcc0 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20  nfo->idxNum;.   
2bcd0 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2bce0 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49  needFree = pIdxI
2bcf0 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
2bd00 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64  dxStr;.      pId
2bd10 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
2bd20 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  eIdxStr = 0;.   
2bd30 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2bd40 69 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66  idxStr = pIdxInf
2bd50 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20  o->idxStr;.     
2bd60 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73   pNew->u.vtab.is
2bd70 4f 72 64 65 72 65 64 20 3d 20 28 75 38 29 28 28  Ordered = (u8)((
2bd80 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
2bd90 42 79 21 3d 30 29 0a 20 20 20 20 20 20 20 20 20  By!=0).         
2bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdb0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
2bdc0 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
2bdd0 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 20 20 20  Consumed);.     
2bde0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
2bdf0 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  0;.      pNew->r
2be00 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 46  Run = whereCostF
2be10 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e  romDouble(pIdxIn
2be20 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
2be30 74 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e  t);.      /* TUN
2be40 49 4e 47 3a 20 45 76 65 72 79 20 76 69 72 74 75  ING: Every virtu
2be50 61 6c 20 74 61 62 6c 65 20 71 75 65 72 79 20 72  al table query r
2be60 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a  eturns 25 rows *
2be70 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  /.      pNew->nO
2be80 75 74 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74  ut = 46;  assert
2be90 28 20 34 36 3d 3d 77 68 65 72 65 43 6f 73 74 28  ( 46==whereCost(
2bea0 32 35 29 20 29 3b 0a 20 20 20 20 20 20 77 68 65  25) );.      whe
2beb0 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
2bec0 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
2bed0 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e      if( pNew->u.
2bee0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b  vtab.needFree ){
2bef0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2bf00 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74  _free(pNew->u.vt
2bf10 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
2bf20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
2bf30 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
2bf40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2bf50 20 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64    ..whereLoopAdd
2bf60 56 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28  Vtab_exit:.  if(
2bf70 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
2bf80 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71  oFreeIdxStr ) sq
2bf90 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49  lite3_free(pIdxI
2bfa0 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
2bfb0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2bfc0 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72  , pIdxInfo);.  r
2bfd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
2bfe0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2bff0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
2c000 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65  /../*.** Add Whe
2c010 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74  reLoop entries t
2c020 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d  o handle OR term
2c030 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66  s.  This works f
2c040 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72  or either.** btr
2c050 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74  ees or virtual t
2c060 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
2c070 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
2c080 64 4f 72 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  dOr(WhereLoopBui
2c090 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
2c0a0 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 29 7b  Bitmask mExtra){
2c0b0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
2c0c0 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
2c0d0 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65  >pWInfo;.  Where
2c0e0 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57  Clause *pWC;.  W
2c0f0 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
2c100 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
2c110 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69  rm, *pWCEnd;.  i
2c120 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2c130 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20  K;.  int iCur;. 
2c140 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d   WhereClause tem
2c150 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  pWC;.  WhereLoop
2c160 42 75 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c  Builder sSubBuil
2c170 64 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20  d;.  WhereOrSet 
2c180 73 53 75 6d 2c 20 73 43 75 72 2c 20 73 50 72 65  sSum, sCur, sPre
2c190 76 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  v;.  struct SrcL
2c1a0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2c1b0 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69  .  .  pWC = pBui
2c1c0 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66 28  lder->pWC;.  if(
2c1d0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
2c1e0 61 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44 5f  ags & WHERE_AND_
2c1f0 4f 4e 4c 59 20 29 20 72 65 74 75 72 6e 20 53 51  ONLY ) return SQ
2c200 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e  LITE_OK;.  pWCEn
2c210 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
2c220 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20  ->nTerm;.  pNew 
2c230 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
2c240 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  ;..  for(pTerm=p
2c250 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
2c260 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  End && rc==SQLIT
2c270 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  E_OK; pTerm++){.
2c280 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
2c290 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f  eOperator & WO_O
2c2a0 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  R)!=0.     && (p
2c2b0 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
2c2c0 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65  >indexable & pNe
2c2d0 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20  w->maskSelf)!=0 
2c2e0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68  .    ){.      Wh
2c2f0 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73  ereClause * cons
2c300 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d  t pOrWC = &pTerm
2c310 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b  ->u.pOrInfo->wc;
2c320 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
2c330 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e   * const pOrWCEn
2c340 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f  d = &pOrWC->a[pO
2c350 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20  rWC->nTerm];.   
2c360 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
2c370 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74  rTerm;.      int
2c380 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20   once = 1;.     
2c390 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a   int i, j;.    .
2c3a0 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 70 57        pItem = pW
2c3b0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
2c3c0 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a  a + pNew->iTab;.
2c3d0 20 20 20 20 20 20 69 43 75 72 20 3d 20 70 49 74        iCur = pIt
2c3e0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
2c3f0 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a     sSubBuild = *
2c400 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20  pBuilder;.      
2c410 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72  sSubBuild.pOrder
2c420 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53  By = 0;.      sS
2c430 75 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d  ubBuild.pOrSet =
2c440 20 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 66   &sCur;..      f
2c450 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43  or(pOrTerm=pOrWC
2c460 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72  ->a; pOrTerm<pOr
2c470 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b  WCEnd; pOrTerm++
2c480 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
2c490 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
2c4a0 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20  or & WO_AND)!=0 
2c4b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  ){.          sSu
2c4c0 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f  bBuild.pWC = &pO
2c4d0 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66  rTerm->u.pAndInf
2c4e0 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d  o->wc;.        }
2c4f0 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d  else if( pOrTerm
2c500 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
2c510 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ur ){.          
2c520 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20  tempWC.pWInfo = 
2c530 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20  pWC->pWInfo;.   
2c540 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f         tempWC.pO
2c550 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20  uter = pWC;.    
2c560 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20        tempWC.op 
2c570 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20  = TK_AND;.      
2c580 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d      tempWC.nTerm
2c590 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2c5a0 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65  tempWC.a = pOrTe
2c5b0 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53  rm;.          sS
2c5c0 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74  ubBuild.pWC = &t
2c5d0 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d  empWC;.        }
2c5e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2c5f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2c600 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72    }.        sCur
2c610 2e 6e 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  .n = 0;.#ifndef 
2c620 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2c630 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20  UALTABLE.       
2c640 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
2c650 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20  Item->pTab) ){. 
2c660 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
2c670 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
2c680 6c 28 26 73 53 75 62 42 75 69 6c 64 29 3b 0a 20  l(&sSubBuild);. 
2c690 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
2c6a0 3b 20 69 3c 73 43 75 72 2e 6e 3b 20 69 2b 2b 29  ; i<sCur.n; i++)
2c6b0 20 73 43 75 72 2e 61 5b 69 5d 2e 70 72 65 72 65   sCur.a[i].prere
2c6c0 71 20 7c 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20  q |= mExtra;.   
2c6d0 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
2c6e0 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  f.        {.    
2c6f0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2c700 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73 53  LoopAddBtree(&sS
2c710 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29  ubBuild, mExtra)
2c720 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c730 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
2c740 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75  SQLITE_OK || sCu
2c750 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  r.n==0 );.      
2c760 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20    if( sCur.n==0 
2c770 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  ){.          sSu
2c780 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  m.n = 0;.       
2c790 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2c7a0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65    }else if( once
2c7b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
2c7c0 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c  ereOrMove(&sSum,
2c7d0 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20   &sCur);.       
2c7e0 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20     once = 0;.   
2c7f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2c800 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76        whereOrMov
2c810 65 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29  e(&sPrev, &sSum)
2c820 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d  ;.          sSum
2c830 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
2c840 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72    for(i=0; i<sPr
2c850 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ev.n; i++){.    
2c860 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
2c870 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b   j<sCur.n; j++){
2c880 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  .              w
2c890 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53  hereOrInsert(&sS
2c8a0 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70  um, sPrev.a[i].p
2c8b0 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a  rereq | sCur.a[j
2c8c0 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20  ].prereq,.      
2c8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8e0 20 20 20 20 20 20 77 68 65 72 65 43 6f 73 74 41        whereCostA
2c8f0 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52  dd(sPrev.a[i].rR
2c900 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52  un, sCur.a[j].rR
2c910 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  un),.           
2c920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c930 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 73 50   whereCostAdd(sP
2c940 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73  rev.a[i].nOut, s
2c950 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b  Cur.a[j].nOut));
2c960 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2c970 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c980 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2c990 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
2c9a0 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 1;.      pNew-
2c9b0 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65  >aLTerm[0] = pTe
2c9c0 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  rm;.      pNew->
2c9d0 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
2c9e0 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20  MULTI_OR;.      
2c9f0 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
2ca00 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53  ;.      pNew->iS
2ca10 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  ortIdx = 0;.    
2ca20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e    memset(&pNew->
2ca30 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65  u, 0, sizeof(pNe
2ca40 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20 66 6f  w->u));.      fo
2ca50 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
2ca60 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e  E_OK && i<sSum.n
2ca70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2ca80 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 75 6c 74 69  /* TUNING: Multi
2ca90 70 6c 65 20 62 79 20 33 2e 35 20 66 6f 72 20 74  ple by 3.5 for t
2caa0 68 65 20 73 65 63 6f 6e 64 61 72 79 20 74 61 62  he secondary tab
2cab0 6c 65 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20  le lookup */.   
2cac0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2cad0 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e  = sSum.a[i].rRun
2cae0 20 2b 20 31 38 3b 0a 20 20 20 20 20 20 20 20 70   + 18;.        p
2caf0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d  New->nOut = sSum
2cb00 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20  .a[i].nOut;.    
2cb10 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
2cb20 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65   = sSum.a[i].pre
2cb30 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63 20  req;.        rc 
2cb40 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
2cb50 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
2cb60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2cb70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2cb80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
2cb90 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
2cba0 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62  ects for all tab
2cbb0 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  les .*/.static i
2cbc0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41  nt whereLoopAddA
2cbd0 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  ll(WhereLoopBuil
2cbe0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a  der *pBuilder){.
2cbf0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2cc00 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
2cc10 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73  pWInfo;.  Bitmas
2cc20 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  k mExtra = 0;.  
2cc30 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d  Bitmask mPrior =
2cc40 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a   0;.  int iTab;.
2cc50 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
2cc60 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
2cc70 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  abList;.  struct
2cc80 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2cc90 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
2cca0 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
2ccb0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
2ccc0 6e 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  nTabList = pWInf
2ccd0 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e 74  o->nLevel;.  int
2cce0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2ccf0 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 54  .  u8 priorJoinT
2cd00 79 70 65 20 3d 20 30 3b 0a 20 20 57 68 65 72 65  ype = 0;.  Where
2cd10 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f  Loop *pNew;..  /
2cd20 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20  * Loop over the 
2cd30 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f  tables in the jo
2cd40 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  in, from left to
2cd50 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77   right */.  pNew
2cd60 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
2cd70 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e  w;.  whereLoopIn
2cd80 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28  it(pNew);.  for(
2cd90 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54  iTab=0, pItem=pT
2cda0 61 62 4c 69 73 74 2d 3e 61 3b 20 69 54 61 62 3c  abList->a; iTab<
2cdb0 6e 54 61 62 4c 69 73 74 3b 20 69 54 61 62 2b 2b  nTabList; iTab++
2cdc0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2cdd0 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61  pNew->iTab = iTa
2cde0 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73  b;.    pNew->mas
2cdf0 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28  kSelf = getMask(
2ce00 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
2ce10 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  t, pItem->iCurso
2ce20 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49  r);.    if( ((pI
2ce30 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c 70 72  tem->jointype|pr
2ce40 69 6f 72 4a 6f 69 6e 54 79 70 65 29 20 26 20 28  iorJoinType) & (
2ce50 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
2ce60 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ))!=0 ){.      m
2ce70 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a  Extra = mPrior;.
2ce80 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a      }.    priorJ
2ce90 6f 69 6e 54 79 70 65 20 3d 20 70 49 74 65 6d 2d  oinType = pItem-
2cea0 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 69  >jointype;.    i
2ceb0 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74  f( IsVirtual(pIt
2cec0 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20  em->pTab) ){.   
2ced0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2cee0 70 41 64 64 56 69 72 74 75 61 6c 28 70 42 75 69  pAddVirtual(pBui
2cef0 6c 64 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lder);.    }else
2cf00 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
2cf10 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70  reLoopAddBtree(p
2cf20 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29  Builder, mExtra)
2cf30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2cf40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2cf50 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
2cf60 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c  eLoopAddOr(pBuil
2cf70 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  der, mExtra);.  
2cf80 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c    }.    mPrior |
2cf90 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  = pNew->maskSelf
2cfa0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20  ;.    if( rc || 
2cfb0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2cfc0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
2cfd0 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64  whereLoopClear(d
2cfe0 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  b, pNew);.  retu
2cff0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2d000 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50  Examine a WhereP
2d010 61 74 68 20 28 77 69 74 68 20 74 68 65 20 61 64  ath (with the ad
2d020 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78  dition of the ex
2d030 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66  tra WhereLoop of
2d040 20 74 68 65 20 35 74 68 0a 2a 2a 20 70 61 72 61   the 5th.** para
2d050 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65 20 69  meters) to see i
2d060 66 20 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77  f it outputs row
2d070 73 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  s in the request
2d080 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28  ed ORDER BY.** (
2d090 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77 69 74  or GROUP BY) wit
2d0a0 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67 20 61  hout requiring a
2d0b0 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 20 6f   separate sort o
2d0c0 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72  peration.  Retur
2d0d0 6e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 30 3a 20  n:.** .**    0: 
2d0e0 20 4f 52 44 45 52 20 42 59 20 69 73 20 6e 6f 74   ORDER BY is not
2d0f0 20 73 61 74 69 73 66 69 65 64 2e 20 20 53 6f 72   satisfied.  Sor
2d100 74 69 6e 67 20 72 65 71 75 69 72 65 64 0a 2a 2a  ting required.**
2d110 20 20 20 20 31 3a 20 20 4f 52 44 45 52 20 42 59      1:  ORDER BY
2d120 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 20 20   is satisfied.  
2d130 20 20 20 20 4f 6d 69 74 20 73 6f 72 74 69 6e 67      Omit sorting
2d140 0a 2a 2a 20 20 20 2d 31 3a 20 20 55 6e 6b 6e 6f  .**   -1:  Unkno
2d150 77 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 0a  wn at this time.
2d160 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2d170 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57  processing for W
2d180 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64  HERE_GROUPBY and
2d190 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
2d1a0 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73  Y is not as.** s
2d1b0 74 72 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f  trict.  With GRO
2d1c0 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
2d1d0 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75  CT the only requ
2d1e0 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a  irement is that.
2d1f0 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f  ** equivalent ro
2d200 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69  ws appear immedi
2d210 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74  ately adjacent t
2d220 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20  o one another.  
2d230 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20  GROUP BY.** and 
2d240 44 49 53 54 49 4e 54 20 64 6f 20 6e 6f 74 20 72  DISTINT do not r
2d250 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20 61  equire rows to a
2d260 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61 72  ppear in any par
2d270 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61 73  ticular order as
2d280 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69   long.** as equi
2d290 76 65 6c 65 6e 74 20 72 6f 77 73 20 61 72 65 20  velent rows are 
2d2a0 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72  grouped together
2d2b0 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f 55  .  Thus for GROU
2d2c0 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  P BY and DISTINC
2d2d0 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42  T.** the pOrderB
2d2e0 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20 6d  y terms can be m
2d2f0 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f 72  atched in any or
2d300 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45 52  der.  With ORDER
2d310 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72   BY, the .** pOr
2d320 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73 74  derBy terms must
2d330 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 73   be matched in s
2d340 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69  trict left-to-ri
2d350 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ght order..*/.st
2d360 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61  atic int wherePa
2d370 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
2d380 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  By(.  WhereInfo 
2d390 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54  *pWInfo,    /* T
2d3a0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2d3b0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2d3c0 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52  OrderBy,   /* OR
2d3d0 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
2d3e0 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63  BY or DISTINCT c
2d3f0 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a  lause to check *
2d400 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
2d410 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65  Path,     /* The
2d420 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68   WherePath to ch
2d430 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  eck */.  u16 wct
2d440 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
2d450 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  * Might contain 
2d460 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72  WHERE_GROUPBY or
2d470 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
2d480 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70  Y */.  u16 nLoop
2d490 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2d4a0 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
2d4b0 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  s in pPath->aLoo
2d4c0 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  p[] */.  WhereLo
2d4d0 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f  op *pLast,     /
2d4e0 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65  * Add this Where
2d4f0 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Loop to the end 
2d500 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b  of pPath->aLoop[
2d510 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a  ] */.  Bitmask *
2d520 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20  pRevMask     /* 
2d530 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65  OUT: Mask of Whe
2d540 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69  reLoops to run i
2d550 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
2d560 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65  */.){.  u8 revSe
2d570 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
2d580 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20   True if rev is 
2d590 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65  known */.  u8 re
2d5a0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
2d5b0 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f   /* Composite so
2d5c0 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
2d5d0 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20   revIdx;        
2d5e0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72      /* Index sor
2d5f0 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
2d600 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b  isOrderDistinct;
2d610 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20     /* All prior 
2d620 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f  WhereLoops are o
2d630 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f  rder-distinct */
2d640 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f  .  u8 distinctCo
2d650 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65  lumns;   /* True
2d660 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73   if the loop has
2d670 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c   UNIQUE NOT NULL
2d680 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38   columns */.  u8
2d690 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20   isMatch;       
2d6a0 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d      /* iColumn m
2d6b0 61 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66  atches a term of
2d6c0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2d6d0 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e 43  ause */.  u16 nC
2d6e0 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
2d6f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
2d700 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a  umns in pIndex *
2d710 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79  /.  u16 nOrderBy
2d720 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
2d730 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ber terms in the
2d740 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2d750 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b   */.  int iLoop;
2d760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2d770 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f  ndex of WhereLoo
2d780 70 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67  p in pPath being
2d790 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
2d7a0 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
2d7b0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2d7c0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
2d7d0 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  iCur;           
2d7e0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
2d7f0 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57  er for current W
2d800 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  hereLoop */.  in
2d810 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
2d820 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20      /* A column 
2d830 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61  number within ta
2d840 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68  ble iCur */.  Wh
2d850 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d  ereLoop *pLoop =
2d860 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57   0; /* Current W
2d870 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70  hereLoop being p
2d880 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57  rocessed. */.  W
2d890 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
2d8a0 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
2d8b0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
2d8c0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
2d8d0 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20  xpr *pOBExpr;   
2d8e0 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65       /* An expre
2d8f0 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f  ssion from the O
2d900 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
2d910 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  /.  CollSeq *pCo
2d920 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c  ll;       /* COL
2d930 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72  LATE function fr
2d940 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  om an ORDER BY c
2d950 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
2d960 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
2d970 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
2d980 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
2d990 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71  th pLoop */.  sq
2d9a0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e  lite3 *db = pWIn
2d9b0 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20  fo->pParse->db; 
2d9c0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
2d9d0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  nection */.  Bit
2d9e0 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20  mask obSat = 0; 
2d9f0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52     /* Mask of OR
2da00 44 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74  DER BY terms sat
2da10 69 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f  isfied so far */
2da20 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e  .  Bitmask obDon
2da30 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b  e;       /* Mask
2da40 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59   of all ORDER BY
2da50 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d   terms */.  Bitm
2da60 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63  ask orderDistinc
2da70 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20  tMask;  /* Mask 
2da80 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65  of all well-orde
2da90 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42  red loops */.  B
2daa0 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20  itmask ready;   
2dab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2dac0 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70  sk of inner loop
2dad0 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  s */..  /*.  ** 
2dae0 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65  We say the Where
2daf0 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77  Loop is "one-row
2db00 22 20 69 66 20 69 74 20 67 65 6e 65 72 61 74 65  " if it generate
2db10 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s no more than o
2db20 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f  ne.  ** row of o
2db30 75 74 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c  utput.  A WhereL
2db40 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69  oop is one-row i
2db50 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
2db60 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
2db70 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69  .  **  (a) All i
2db80 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74  ndex columns mat
2db90 63 68 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f  ch with WHERE_CO
2dba0 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28  LUMN_EQ..  **  (
2dbb0 62 29 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  b) The index is 
2dbc0 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20  unique.  ** Any 
2dbd0 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61  WhereLoop with a
2dbe0 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  n WHERE_COLUMN_E
2dbf0 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  Q constraint on 
2dc00 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65  the rowid is one
2dc10 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79  -row..  ** Every
2dc20 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f   one-row WhereLo
2dc30 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65  op will have the
2dc40 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69   WHERE_ONEROW bi
2dc50 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73  t set in wsFlags
2dc60 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73  ..  **.  ** We s
2dc70 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ay the WhereLoop
2dc80 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69   is "order-disti
2dc90 6e 63 74 22 20 69 66 20 74 68 65 20 73 65 74 20  nct" if the set 
2dca0 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a  of columns from.
2dcb0 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c    ** that WhereL
2dcc0 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e 20  oop that are in 
2dcd0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2dce0 75 73 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  use are differen
2dcf0 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a  t for every.  **
2dd00 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72   row of the Wher
2dd10 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e  eLoop.  Every on
2dd20 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20  e-row WhereLoop 
2dd30 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
2dd40 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74  .  ** order-dist
2dd50 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c  inct.   A WhereL
2dd60 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20  oop that has no 
2dd70 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f  columns in the O
2dd80 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
2dd90 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72   ** is not order
2dda0 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65  -distinct. To be
2ddb0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20   order-distinct 
2ddc0 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65  is not quite the
2ddd0 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20   same as being. 
2dde0 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65   ** UNIQUE since
2ddf0 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e   a UNIQUE column
2de00 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61   or index can ha
2de10 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ve multiple rows
2de20 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20   that .  ** are 
2de30 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61  NULL and NULL va
2de40 6c 75 65 73 20 61 72 65 20 65 71 75 69 76 61 6c  lues are equival
2de50 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72 70  ent for the purp
2de60 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73  ose of order-dis
2de70 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62  tinct..  ** To b
2de80 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
2de90 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75  , the columns mu
2dea0 73 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64  st be UNIQUE and
2deb0 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a   NOT NULL..  **.
2dec0 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66    ** The rowid f
2ded0 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c  or a table is al
2dee0 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20  ways UNIQUE and 
2def0 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e  NOT NULL so when
2df00 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f  ever the.  ** ro
2df10 77 69 64 20 61 70 70 65 61 72 73 20 69 6e 20 74  wid appears in t
2df20 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2df30 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  se, the correspo
2df40 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  nding WhereLoop 
2df50 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  is.  ** automati
2df60 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74  cally order-dist
2df70 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73  inct..  */..  as
2df80 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d  sert( pOrderBy!=
2df90 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 6f 72 74 61  0 );..  /* Sorta
2dfa0 62 69 6c 69 74 79 20 6f 66 20 76 69 72 74 75 61  bility of virtua
2dfb0 6c 20 74 61 62 6c 65 73 20 69 73 20 64 65 74 65  l tables is dete
2dfc0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 78 42  rmined by the xB
2dfd0 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 0a  estIndex method.
2dfe0 20 20 2a 2a 20 6f 66 20 74 68 65 20 76 69 72 74    ** of the virt
2dff0 75 61 6c 20 74 61 62 6c 65 20 69 74 73 65 6c 66  ual table itself
2e000 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74 2d   */.  if( pLast-
2e010 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2e020 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
2e030 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
2e040 4c 6f 6f 70 3e 30 20 29 3b 20 20 2f 2a 20 54 72  Loop>0 );  /* Tr
2e050 75 65 20 77 68 65 6e 20 6f 75 74 65 72 20 6c 6f  ue when outer lo
2e060 6f 70 73 20 61 72 65 20 6f 6e 65 2d 72 6f 77 20  ops are one-row 
2e070 61 6e 64 20 6d 61 74 63 68 20 0a 20 20 20 20 20  and match .     
2e080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e090 20 20 20 20 20 2a 2a 20 6e 6f 20 4f 52 44 45 52       ** no ORDER
2e0a0 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20   BY terms */.   
2e0b0 20 72 65 74 75 72 6e 20 70 4c 61 73 74 2d 3e 75   return pLast->u
2e0c0 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64 3b  .vtab.isOrdered;
2e0d0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 6f 70  .  }.  if( nLoop
2e0e0 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
2e0f0 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
2e100 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f  ITE_OrderByIdxJo
2e110 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
2e120 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f  .  nOrderBy = pO
2e130 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
2e140 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65   testcase( nOrde
2e150 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  rBy==BMS-1 );.  
2e160 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53  if( nOrderBy>BMS
2e170 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  -1 ) return 0;  
2e180 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69  /* Cannot optimi
2e190 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20  ze overly large 
2e1a0 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69  ORDER BYs */.  i
2e1b0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
2e1c0 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d   1;.  obDone = M
2e1d0 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29  ASKBIT(nOrderBy)
2e1e0 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69  -1;.  orderDisti
2e1f0 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72  nctMask = 0;.  r
2e200 65 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28  eady = 0;.  for(
2e210 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72  iLoop=0; isOrder
2e220 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61  Distinct && obSa
2e230 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f  t<obDone && iLoo
2e240 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b  p<=nLoop; iLoop+
2e250 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f  +){.    if( iLoo
2e260 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70  p>0 ) ready |= p
2e270 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
2e280 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f      pLoop = iLoo
2e290 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d  p<nLoop ? pPath-
2e2a0 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20  >aLoop[iLoop] : 
2e2b0 70 4c 61 73 74 3b 0a 20 20 20 20 61 73 73 65 72  pLast;.    asser
2e2c0 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
2e2d0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
2e2e0 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20  ALTABLE)==0 );. 
2e2f0 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f     iCur = pWInfo
2e300 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
2e310 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73  oop->iTab].iCurs
2e320 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b  or;..    /* Mark
2e330 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42   off any ORDER B
2e340 59 20 74 65 72 6d 20 58 20 74 68 61 74 20 69 73  Y term X that is
2e350 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
2e360 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a   table of.    **
2e370 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
2e380 70 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72  p for which ther
2e390 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65  e is term in the
2e3a0 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c   WHERE.    ** cl
2e3b0 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  ause of the form
2e3c0 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d   X IS NULL or X=
2e3d0 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  ? that reference
2e3e0 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20   only outer.    
2e3f0 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f  ** loops..    */
2e400 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2e410 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
2e420 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
2e430 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
2e440 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
2e450 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  OBExpr = sqlite3
2e460 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
2e470 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2e480 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
2e490 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b   pOBExpr->op!=TK
2e4a0 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e  _COLUMN ) contin
2e4b0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  ue;.      if( pO
2e4c0 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69  BExpr->iTable!=i
2e4d0 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
2e4e0 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
2e4f0 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e  ndTerm(&pWInfo->
2e500 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78  sWC, iCur, pOBEx
2e510 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  pr->iColumn,.   
2e520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e530 20 20 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45      ~ready, WO_E
2e540 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b  Q|WO_ISNULL, 0);
2e550 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
2e560 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2e570 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
2e580 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45  ->eOperator&WO_E
2e590 51 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72  Q)!=0 && pOBExpr
2e5a0 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a  ->iColumn>=0 ){.
2e5b0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2e5c0 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20  ar *z1, *z2;.   
2e5d0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
2e5e0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2e5f0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
2e600 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2e610 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
2e620 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
2e630 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
2e640 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20  l;.        z1 = 
2e650 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
2e660 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2e670 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2e680 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
2e690 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a   pTerm->pExpr);.
2e6a0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
2e6b0 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
2e6c0 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
2e6d0 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e      z2 = pColl->
2e6e0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
2e6f0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
2e700 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63  p(z1, z2)!=0 ) c
2e710 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
2e720 0a 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20  .      obSat |= 
2e730 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
2e740 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  }..    if( (pLoo
2e750 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2e760 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b  RE_ONEROW)==0 ){
2e770 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
2e780 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2e790 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20  E_IPK ){.       
2e7a0 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20   pIndex = 0;.   
2e7b0 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30       nColumn = 0
2e7c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
2e7d0 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f  ( (pIndex = pLoo
2e7e0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
2e7f0 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d  x)==0 || pIndex-
2e800 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20  >bUnordered ){. 
2e810 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
2e820 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2e830 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20        nColumn = 
2e840 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pIndex->nColumn;
2e850 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72  .        isOrder
2e860 44 69 73 74 69 6e 63 74 20 3d 20 70 49 6e 64 65  Distinct = pInde
2e870 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
2e880 6f 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  one;.      }..  
2e890 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
2e8a0 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  ugh all columns 
2e8b0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
2e8c0 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f   deal with the o
2e8d0 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  nes.      ** tha
2e8e0 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72  t are not constr
2e8f0 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49  ained by == or I
2e900 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  N..      */.    
2e910 20 20 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d    rev = revSet =
2e920 20 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e   0;.      distin
2e930 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20  ctColumns = 0;. 
2e940 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2e950 3d 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  =nColumn; j++){.
2e960 20 20 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65          u8 bOnce
2e970 3b 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72  ;   /* True to r
2e980 75 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  un the ORDER BY 
2e990 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a  search loop */..
2e9a0 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20          /* Skip 
2e9b0 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e  over == and IS N
2e9c0 55 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  ULL terms */.   
2e9d0 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70       if( j<pLoop
2e9e0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20  ->u.btree.nEq.  
2e9f0 20 20 20 20 20 20 20 26 26 20 28 28 69 20 3d 20         && ((i = 
2ea00 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
2ea10 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20 26 20 28  ->eOperator) & (
2ea20 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29  WO_EQ|WO_ISNULL)
2ea30 29 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  )!=0.        ){.
2ea40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 20            if( i 
2ea50 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  & WO_ISNULL ){. 
2ea60 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
2ea70 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74  ase( isOrderDist
2ea80 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20  inct );.        
2ea90 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
2eaa0 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
2eab0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
2eac0 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20  ontinue;  .     
2ead0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
2eae0 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20   Get the column 
2eaf0 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61  number in the ta
2eb00 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e  ble (iColumn) an
2eb10 64 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20  d sort order.   
2eb20 20 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29       ** (revIdx)
2eb30 20 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f   for the j-th co
2eb40 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
2eb50 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  x..        */.  
2eb60 20 20 20 20 20 20 69 66 28 20 6a 3c 6e 43 6f 6c        if( j<nCol
2eb70 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
2eb80 20 2f 2a 20 4e 6f 72 6d 61 6c 20 69 6e 64 65 78   /* Normal index
2eb90 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
2eba0 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
2ebb0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
2ebc0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  [j];.          r
2ebd0 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e  evIdx = pIndex->
2ebe0 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20  aSortOrder[j];. 
2ebf0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
2ec00 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70 54  lumn==pIndex->pT
2ec10 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69 43  able->iPKey ) iC
2ec20 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
2ec30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ec40 20 20 20 20 20 2f 2a 20 54 68 65 20 52 4f 57 49       /* The ROWI
2ec50 44 20 63 6f 6c 75 6d 6e 20 61 74 20 74 68 65 20  D column at the 
2ec60 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  end */.         
2ec70 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 6f 6c   assert( j==nCol
2ec80 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  umn );.         
2ec90 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20   iColumn = -1;. 
2eca0 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20           revIdx 
2ecb0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
2ecc0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e          /* An un
2ecd0 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75  constrained colu
2ece0 6d 6e 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  mn that might be
2ecf0 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74   NULL means that
2ed00 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
2ed10 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f   WhereLoop is no
2ed20 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 0a  t well-ordered .
2ed30 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2ed40 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69     if( isOrderDi
2ed50 73 74 69 6e 63 74 0a 20 20 20 20 20 20 20 20 20  stinct.         
2ed60 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20  && iColumn>=0.  
2ed70 20 20 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f         && j>=pLo
2ed80 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a  op->u.btree.nEq.
2ed90 20 20 20 20 20 20 20 20 20 26 26 20 70 49 6e 64           && pInd
2eda0 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ex->pTable->aCol
2edb0 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c  [iColumn].notNul
2edc0 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  l==0.        ){.
2edd0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
2ede0 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  rDistinct = 0;. 
2edf0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2ee00 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f 52    /* Find the OR
2ee10 44 45 52 20 42 59 20 74 65 72 6d 20 74 68 61 74  DER BY term that
2ee20 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2ee30 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a  the j-th column.
2ee40 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
2ee50 65 20 69 6e 64 65 78 20 61 6e 64 20 61 6e 64 20  e index and and 
2ee60 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20  mark that ORDER 
2ee70 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20  BY term off .   
2ee80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2ee90 62 4f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20  bOnce = 1;.     
2eea0 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a     isMatch = 0;.
2eeb0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2eec0 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64   bOnce && i<nOrd
2eed0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
2eee0 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
2eef0 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
2ef00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2ef10 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c     pOBExpr = sql
2ef20 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2ef30 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ate(pOrderBy->a[
2ef40 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
2ef50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
2ef60 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2ef70 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20  E_GROUPBY );.   
2ef80 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2ef90 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
2efa0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29  ERE_DISTINCTBY )
2efb0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2efc0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57  (wctrlFlags & (W
2efd0 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45  HERE_GROUPBY|WHE
2efe0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d  RE_DISTINCTBY))=
2eff0 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a  =0 ) bOnce = 0;.
2f000 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
2f010 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  BExpr->op!=TK_CO
2f020 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LUMN ) continue;
2f030 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2f040 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d  OBExpr->iTable!=
2f050 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
2f060 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2f070 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21  OBExpr->iColumn!
2f080 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  =iColumn ) conti
2f090 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nue;.          i
2f0a0 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  f( iColumn>=0 ){
2f0b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
2f0c0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
2f0d0 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
2f0e0 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
2f0f0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
2f100 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
2f110 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
2f120 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
2f130 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
2f140 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
2f150 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64  oll->zName, pInd
2f160 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d  ex->azColl[j])!=
2f170 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2f180 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f190 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b      isMatch = 1;
2f1a0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2f1b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2f1c0 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20      if( isMatch 
2f1d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2f1e0 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20   iColumn<0 ){.  
2f1f0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2f200 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75  se( distinctColu
2f210 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  mns==0 );.      
2f220 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f        distinctCo
2f230 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20  lumns = 1;.     
2f240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2f250 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49   obSat |= MASKBI
2f260 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  T(i);.          
2f270 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
2f280 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2f290 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20  GROUPBY)==0 ){. 
2f2a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2f2b0 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f 72 74  ke sure the sort
2f2c0 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74   order is compat
2f2d0 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52  ible in an ORDER
2f2e0 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
2f2f0 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20          ** Sort 
2f300 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c 65 76  order is irrelev
2f310 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20  ant for a GROUP 
2f320 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20  BY clause. */.  
2f330 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
2f340 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  vSet ){.        
2f350 20 20 20 20 20 20 69 66 28 20 28 72 65 76 20 5e        if( (rev ^
2f360 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65 72   revIdx)!=pOrder
2f370 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
2f380 65 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  er ) return 0;. 
2f390 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
2f3a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2f3b0 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70  rev = revIdx ^ p
2f3c0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
2f3d0 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20  rtOrder;.       
2f3e0 20 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29         if( rev )
2f3f0 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41   *pRevMask |= MA
2f400 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20  SKBIT(iLoop);.  
2f410 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 53              revS
2f420 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  et = 1;.        
2f430 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2f440 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
2f450 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  .          /* No
2f460 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a   match found */.
2f470 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
2f480 3d 30 20 7c 7c 20 6a 3c 6e 43 6f 6c 75 6d 6e 20  =0 || j<nColumn 
2f490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
2f4a0 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72  estcase( isOrder
2f4b0 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20  Distinct!=0 );. 
2f4c0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
2f4d0 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
2f4e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f4f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2f500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f       }.      } /
2f510 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20  * end Loop over 
2f520 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  all index column
2f530 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64  s */.      if( d
2f540 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29  istinctColumns )
2f550 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
2f560 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
2f570 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  nct==0 );.      
2f580 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2f590 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
2f5a0 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e     } /* end-if n
2f5b0 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20  ot one-row */.. 
2f5c0 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61     /* Mark off a
2f5d0 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42  ny other ORDER B
2f5e0 59 20 74 65 72 6d 73 20 74 68 61 74 20 72 65 66  Y terms that ref
2f5f0 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a  erence pLoop */.
2f600 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44      if( isOrderD
2f610 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
2f620 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
2f630 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73  sk |= pLoop->mas
2f640 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72  kSelf;.      for
2f650 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
2f660 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2f670 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20  Expr *p;.       
2f680 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20   if( MASKBIT(i) 
2f690 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e  & obSat ) contin
2f6a0 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  ue;.        p = 
2f6b0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2f6c0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66  Expr;.        if
2f6d0 28 20 28 65 78 70 72 54 61 62 6c 65 55 73 61 67  ( (exprTableUsag
2f6e0 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  e(&pWInfo->sMask
2f6f0 53 65 74 2c 20 70 29 26 7e 6f 72 64 65 72 44 69  Set, p)&~orderDi
2f700 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29  stinctMask)==0 )
2f710 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61  {.          obSa
2f720 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
2f730 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f740 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20   }.    }.  } /* 
2f750 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65  End the loop ove
2f760 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73  r all WhereLoops
2f770 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74   from outer-most
2f780 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d   down to inner-m
2f790 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53  ost */.  if( obS
2f7a0 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74  at==obDone ) ret
2f7b0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 21 69 73  urn 1;.  if( !is
2f7c0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 20  OrderDistinct ) 
2f7d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
2f7e0 72 6e 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn -1;.}..#ifdef
2f7f0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
2f800 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67  LED./* For debug
2f810 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a  ging use only: *
2f820 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
2f830 68 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e 61  har *wherePathNa
2f840 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a 70 50  me(WherePath *pP
2f850 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20  ath, int nLoop, 
2f860 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74  WhereLoop *pLast
2f870 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
2f880 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e   zName[65];.  in
2f890 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
2f8a0 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a  i<nLoop; i++){ z
2f8b0 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d  Name[i] = pPath-
2f8c0 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20  >aLoop[i]->cId; 
2f8d0 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29 20  }.  if( pLast ) 
2f8e0 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61  zName[i++] = pLa
2f8f0 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65  st->cId;.  zName
2f900 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  [i] = 0;.  retur
2f910 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69  n zName;.}.#endi
2f920 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  f.../*.** Given 
2f930 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72  the list of Wher
2f940 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61 74  eLoop objects at
2f950 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c   pWInfo->pLoops,
2f960 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
2f970 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e   attempts to fin
2f980 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
2f990 74 20 70 61 74 68 20 74 68 61 74 20 76 69 73 69  t path that visi
2f9a0 74 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f  ts each WhereLoo
2f9b0 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73  p.** once.  This
2f9c0 20 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f   path is then lo
2f9d0 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57  aded into the pW
2f9e0 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70  Info->a[].pWLoop
2f9f0 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41   fields..**.** A
2fa00 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 74  ssume that the t
2fa10 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f  otal number of o
2fa20 75 74 70 75 74 20 72 6f 77 73 20 74 68 61 74 20  utput rows that 
2fa30 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  will need to be 
2fa40 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62  sorted.** will b
2fa50 65 20 6e 52 6f 77 45 73 74 20 28 69 6e 20 74 68  e nRowEst (in th
2fa60 65 20 31 30 2a 6c 6f 67 32 20 72 65 70 72 65 73  e 10*log2 repres
2fa70 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20  entation).  Or, 
2fa80 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a  ignore sorting.*
2fa90 2a 20 63 6f 73 74 73 20 69 66 20 6e 52 6f 77 45  * costs if nRowE
2faa0 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  st==0..**.** Ret
2fab0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
2fac0 20 73 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49   success or SQLI
2fad0 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65  TE_NOMEM of a me
2fae0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  mory allocation.
2faf0 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  ** error occurs.
2fb00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2fb10 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 57  herePathSolver(W
2fb20 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
2fb30 2c 20 57 68 65 72 65 43 6f 73 74 20 6e 52 6f 77  , WhereCost nRow
2fb40 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68  Est){.  int mxCh
2fb50 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  oice;           
2fb60 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
2fb70 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65  ber of simultane
2fb80 6f 75 73 20 70 61 74 68 73 20 74 72 61 63 6b 65  ous paths tracke
2fb90 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70  d */.  int nLoop
2fba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fbb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
2fbc0 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20  rms in the join 
2fbd0 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
2fbe0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  se;            /
2fbf0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
2fc00 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
2fc10 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
2fc20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
2fc30 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
2fc40 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20   int iLoop;     
2fc50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2fc60 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20  op counter over 
2fc70 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
2fc80 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69   join */.  int i
2fc90 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20  i, jj;          
2fca0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2fcb0 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
2fcc0 43 6f 73 74 20 72 43 6f 73 74 3b 20 20 20 20 20  Cost rCost;     
2fcd0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
2fce0 6f 66 20 61 20 70 61 74 68 20 2a 2f 0a 20 20 57  of a path */.  W
2fcf0 68 65 72 65 43 6f 73 74 20 6d 78 43 6f 73 74 20  hereCost mxCost 
2fd00 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  = 0;        /* M
2fd10 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61  aximum cost of a
2fd20 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f   set of paths */
2fd30 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72 53 6f  .  WhereCost rSo
2fd40 72 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20  rtCost;         
2fd50 2f 2a 20 43 6f 73 74 20 74 6f 20 64 6f 20 61 20  /* Cost to do a 
2fd60 73 6f 72 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  sort */.  int nT
2fd70 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20  o, nFrom;       
2fd80 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2fd90 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69   valid entries i
2fda0 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f  n aTo[] and aFro
2fdb0 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  m[] */.  WherePa
2fdc0 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20  th *aFrom;      
2fdd0 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20     /* All nFrom 
2fde0 70 61 74 68 73 20 61 74 20 74 68 65 20 70 72 65  paths at the pre
2fdf0 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20  vious level */. 
2fe00 20 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b   WherePath *aTo;
2fe10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2fe20 65 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73  e nTo best paths
2fe30 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
2fe40 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65  level */.  Where
2fe50 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20  Path *pFrom;    
2fe60 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65       /* An eleme
2fe70 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68  nt of aFrom[] th
2fe80 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  at we are workin
2fe90 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50  g on */.  WhereP
2fea0 61 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20  ath *pTo;       
2feb0 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e      /* An elemen
2fec0 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20  t of aTo[] that 
2fed0 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
2fee0 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  n */.  WhereLoop
2fef0 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20   *pWLoop;       
2ff00 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57   /* One of the W
2ff10 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
2ff20 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
2ff30 2a 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20  **pX;           
2ff40 2f 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79 20  /* Used to divy 
2ff50 75 70 20 74 68 65 20 70 53 70 61 63 65 20 6d 65  up the pSpace me
2ff60 6d 6f 72 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mory */.  char *
2ff70 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
2ff80 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
2ff90 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
2ffa0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  this routine */.
2ffb0 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e  .  pParse = pWIn
2ffc0 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  fo->pParse;.  db
2ffd0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
2ffe0 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d   nLoop = pWInfo-
2fff0 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55  >nLevel;.  /* TU
30000 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65  NING: For simple
30010 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74   queries, only t
30020 68 65 20 62 65 73 74 20 70 61 74 68 20 69 73 20  he best path is 
30030 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f  tracked..  ** Fo
30040 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74  r 2-way joins, t
30050 68 65 20 35 20 62 65 73 74 20 70 61 74 68 73 20  he 5 best paths 
30060 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20  are followed..  
30070 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20  ** For joins of 
30080 33 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73  3 or more tables
30090 2c 20 74 72 61 63 6b 20 74 68 65 20 31 30 20 62  , track the 10 b
300a0 65 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d  est paths */.  m
300b0 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70  xChoice = (nLoop
300c0 3d 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f  ==1) ? 1 : (nLoo
300d0 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a  p==2 ? 5 : 10);.
300e0 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c    assert( nLoop<
300f0 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  =pWInfo->pTabLis
30100 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45  t->nSrc );.  WHE
30110 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 20 28  RETRACE(0x002, (
30120 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76  "---- begin solv
30130 65 72 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 41  er\n"));..  /* A
30140 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
30150 69 61 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72  ialize space for
30160 20 61 54 6f 20 61 6e 64 20 61 46 72 6f 6d 20 2a   aTo and aFrom *
30170 2f 0a 20 20 69 69 20 3d 20 28 73 69 7a 65 6f 66  /.  ii = (sizeof
30180 28 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65  (WherePath)+size
30190 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e  of(WhereLoop*)*n
301a0 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32  Loop)*mxChoice*2
301b0 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c  ;.  pSpace = sql
301c0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
301d0 64 62 2c 20 69 69 29 3b 0a 20 20 69 66 28 20 70  db, ii);.  if( p
301e0 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  Space==0 ) retur
301f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
30200 20 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61    aTo = (WherePa
30210 74 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46  th*)pSpace;.  aF
30220 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69  rom = aTo+mxChoi
30230 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72  ce;.  memset(aFr
30240 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46  om, 0, sizeof(aF
30250 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d  rom[0]));.  pX =
30260 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61   (WhereLoop**)(a
30270 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a  From+mxChoice);.
30280 20 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63    for(ii=mxChoic
30290 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20  e*2, pFrom=aTo; 
302a0 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f  ii>0; ii--, pFro
302b0 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70  m++, pX += nLoop
302c0 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c  ){.    pFrom->aL
302d0 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20  oop = pX;.  }.. 
302e0 20 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65 61   /* Seed the sea
302f0 72 63 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c  rch with a singl
30300 65 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74  e WherePath cont
30310 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72  aining zero Wher
30320 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  eLoops..  **.  *
30330 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74  * TUNING: Do not
30340 20 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   let the number 
30350 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f  of iterations go
30360 20 61 62 6f 76 65 20 32 35 2e 20 20 49 66 20 74   above 25.  If t
30370 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20  he cost.  ** of 
30380 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74  computing an aut
30390 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 20  omatic index is 
303a0 6e 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77 69  not paid back wi
303b0 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 32  thin the first 2
303c0 35 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65  5.  ** rows, the
303d0 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65  n do not use the
303e0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
303f0 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e  . */.  aFrom[0].
30400 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73  nRow = MIN(pPars
30410 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34  e->nQueryLoop, 4
30420 36 29 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d  6);  assert( 46=
30430 3d 77 68 65 72 65 43 6f 73 74 28 32 35 29 20 29  =whereCost(25) )
30440 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 0a  ;.  nFrom = 1;..
30450 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74 65 20    /* Precompute 
30460 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72 74  the cost of sort
30470 69 6e 67 20 74 68 65 20 66 69 6e 61 6c 20 72 65  ing the final re
30480 73 75 6c 74 20 73 65 74 2c 20 69 66 20 74 68 65  sult set, if the
30490 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 74 6f 20   caller.  ** to 
304a0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
304b0 6e 28 29 20 77 61 73 20 63 6f 6e 63 65 72 6e 65  n() was concerne
304c0 64 20 61 62 6f 75 74 20 73 6f 72 74 69 6e 67 20  d about sorting 
304d0 2a 2f 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d  */.  rSortCost =
304e0 20 30 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f   0;.  if( pWInfo
304f0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
30500 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20   nRowEst==0 ){. 
30510 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72     aFrom[0].isOr
30520 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a  deredValid = 1;.
30530 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
30540 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74 65  TUNING: Estimate
30550 64 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  d cost of sortin
30560 67 20 69 73 20 4e 2a 6c 6f 67 32 28 4e 29 20 77  g is N*log2(N) w
30570 68 65 72 65 20 4e 20 69 73 20 74 68 65 0a 20 20  here N is the.  
30580 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6f    ** number of o
30590 75 74 70 75 74 20 72 6f 77 73 2e 20 2a 2f 0a 20  utput rows. */. 
305a0 20 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e     rSortCost = n
305b0 52 6f 77 45 73 74 20 2b 20 65 73 74 4c 6f 67 28  RowEst + estLog(
305c0 6e 52 6f 77 45 73 74 29 3b 0a 20 20 20 20 57 48  nRowEst);.    WH
305d0 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 28  ERETRACE(0x002,(
305e0 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d  "---- sort cost=
305f0 25 2d 33 64 5c 6e 22 2c 20 72 53 6f 72 74 43 6f  %-3d\n", rSortCo
30600 73 74 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  st));.  }..  /* 
30610 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 69  Compute successi
30620 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72  vely longer Wher
30630 65 50 61 74 68 73 20 75 73 69 6e 67 20 74 68 65  ePaths using the
30640 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61   previous genera
30650 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65  tion.  ** of Whe
30660 72 65 50 61 74 68 73 20 61 73 20 74 68 65 20 62  rePaths as the b
30670 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78  asis for the nex
30680 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f  t.  Keep track o
30690 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20  f the mxChoice. 
306a0 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20 61   ** best paths a
306b0 74 20 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f  t each generatio
306c0 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  n */.  for(iLoop
306d0 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b  =0; iLoop<nLoop;
306e0 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e   iLoop++){.    n
306f0 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  To = 0;.    for(
30700 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f  ii=0, pFrom=aFro
30710 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b  m; ii<nFrom; ii+
30720 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
30730 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57     for(pWLoop=pW
30740 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57  Info->pLoops; pW
30750 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c  Loop; pWLoop=pWL
30760 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b  oop->pNextLoop){
30770 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
30780 20 6d 61 73 6b 4e 65 77 3b 0a 20 20 20 20 20 20   maskNew;.      
30790 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73    Bitmask revMas
307a0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75  k = 0;.        u
307b0 38 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  8 isOrderedValid
307c0 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65   = pFrom->isOrde
307d0 72 65 64 56 61 6c 69 64 3b 0a 20 20 20 20 20 20  redValid;.      
307e0 20 20 75 38 20 69 73 4f 72 64 65 72 65 64 20 3d    u8 isOrdered =
307f0 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
30800 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  d;.        if( (
30810 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26  pWLoop->prereq &
30820 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f   ~pFrom->maskLoo
30830 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  p)!=0 ) continue
30840 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
30850 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20  WLoop->maskSelf 
30860 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  & pFrom->maskLoo
30870 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  p)!=0 ) continue
30880 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  ;.        /* At 
30890 74 68 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f  this point, pWLo
308a0 6f 70 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  op is a candidat
308b0 65 20 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74  e to be the next
308c0 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20   loop. .        
308d0 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63  ** Compute its c
308e0 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ost */.        r
308f0 43 6f 73 74 20 3d 20 77 68 65 72 65 43 6f 73 74  Cost = whereCost
30900 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74  Add(pWLoop->rSet
30910 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20  up,pWLoop->rRun 
30920 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a  + pFrom->nRow);.
30930 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20          rCost = 
30940 77 68 65 72 65 43 6f 73 74 41 64 64 28 72 43 6f  whereCostAdd(rCo
30950 73 74 2c 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74  st, pFrom->rCost
30960 29 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e  );.        maskN
30970 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  ew = pFrom->mask
30980 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d  Loop | pWLoop->m
30990 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20  askSelf;.       
309a0 20 69 66 28 20 21 69 73 4f 72 64 65 72 65 64 56   if( !isOrderedV
309b0 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  alid ){.        
309c0 20 20 73 77 69 74 63 68 28 20 77 68 65 72 65 50    switch( whereP
309d0 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
309e0 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20  rBy(pWInfo,.    
309f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a00 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65     pWInfo->pOrde
30a10 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e  rBy, pFrom, pWIn
30a20 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a  fo->wctrlFlags,.
30a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a40 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57         iLoop, pW
30a50 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 20  Loop, &revMask) 
30a60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
30a70 61 73 65 20 31 3a 20 20 2f 2a 20 59 65 73 2e 20  ase 1:  /* Yes. 
30a80 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 64 6f   pFrom+pWLoop do
30a90 65 73 20 73 61 74 69 73 66 79 20 74 68 65 20 4f  es satisfy the O
30aa0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
30ab0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
30ac0 69 73 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20  isOrdered = 1;. 
30ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
30ae0 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b  rderedValid = 1;
30af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
30b00 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
30b10 20 20 63 61 73 65 20 30 3a 20 20 2f 2a 20 4e 6f    case 0:  /* No
30b20 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20  .  pFrom+pWLoop 
30b30 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 73  will require a s
30b40 65 70 61 72 61 74 65 20 73 6f 72 74 20 2a 2f 0a  eparate sort */.
30b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
30b60 4f 72 64 65 72 65 64 20 3d 20 30 3b 0a 20 20 20  Ordered = 0;.   
30b70 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
30b80 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20  eredValid = 1;. 
30b90 20 20 20 20 20 20 20 20 20 20 20 20 20 72 43 6f               rCo
30ba0 73 74 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64  st = whereCostAd
30bb0 64 28 72 43 6f 73 74 2c 20 72 53 6f 72 74 43 6f  d(rCost, rSortCo
30bc0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  st);.           
30bd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
30be0 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 2f        default: /
30bf0 2a 20 43 61 6e 6e 6f 74 20 74 65 6c 6c 20 79 65  * Cannot tell ye
30c00 74 2e 20 20 54 72 79 20 61 67 61 69 6e 20 6f 6e  t.  Try again on
30c10 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   the next iterat
30c20 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ion */.         
30c30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
30c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30c50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
30c60 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d   revMask = pFrom
30c70 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20  ->revLoop;.     
30c80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
30c90 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
30ca0 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65  pWLoop should be
30cb0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6d 78   added to the mx
30cc0 43 68 6f 69 63 65 20 62 65 73 74 20 73 6f 20 66  Choice best so f
30cd0 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  ar */.        fo
30ce0 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b  r(jj=0, pTo=aTo;
30cf0 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70   jj<nTo; jj++, p
30d00 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  To++){.         
30d10 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f   if( pTo->maskLo
30d20 6f 70 3d 3d 6d 61 73 6b 4e 65 77 20 26 26 20 70  op==maskNew && p
30d30 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c  To->isOrderedVal
30d40 69 64 3d 3d 69 73 4f 72 64 65 72 65 64 56 61 6c  id==isOrderedVal
30d50 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
30d60 20 20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d    testcase( jj==
30d70 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  nTo-1 );.       
30d80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
30d90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30da0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a  }.        if( jj
30db0 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20  >=nTo ){.       
30dc0 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68     if( nTo>=mxCh
30dd0 6f 69 63 65 20 26 26 20 72 43 6f 73 74 3e 3d 6d  oice && rCost>=m
30de0 78 43 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20  xCost ){.#ifdef 
30df0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
30e00 45 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ED.            i
30e10 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
30e20 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
30e30 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30e40 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b  3DebugPrintf("Sk
30e50 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 33 64  ip   %s cost=%3d
30e60 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
30e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e80 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
30e90 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
30ea0 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20  op), rCost,.    
30eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
30ec0 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28  OrderedValid ? (
30ed0 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20  isOrdered ? 'Y' 
30ee0 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20  : 'N') : '?');. 
30ef0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e             }.#en
30f00 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
30f10 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
30f20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30f30 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 50 61 74  /* Add a new Pat
30f40 68 20 74 6f 20 74 68 65 20 61 54 6f 5b 5d 20 73  h to the aTo[] s
30f50 65 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  et */.          
30f60 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65  if( nTo<mxChoice
30f70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30f80 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20  /* Increase the 
30f90 73 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20  size of the aTo 
30fa0 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20  set by one */.  
30fb0 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e            jj = n
30fc0 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  To++;.          
30fd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
30fe0 20 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72     /* New path r
30ff0 65 70 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f  eplaces the prio
31000 72 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20  r worst to keep 
31010 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68  count below mxCh
31020 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  oice */.        
31030 20 20 20 20 66 6f 72 28 6a 6a 3d 6e 54 6f 2d 31      for(jj=nTo-1
31040 3b 20 61 54 6f 5b 6a 6a 5d 2e 72 43 6f 73 74 3c  ; aTo[jj].rCost<
31050 6d 78 43 6f 73 74 3b 20 6a 6a 2d 2d 29 7b 20 61  mxCost; jj--){ a
31060 73 73 65 72 74 28 6a 6a 3e 30 29 3b 20 7d 0a 20  ssert(jj>0); }. 
31070 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31080 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b       pTo = &aTo[
31090 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52  jj];.#ifdef WHER
310a0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
310b0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
310c0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
310d0 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
310e0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
310f0 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73 20  intf("New    %s 
31100 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d  cost=%-3d order=
31110 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
31120 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
31130 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
31140 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
31150 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
31160 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69     isOrderedVali
31170 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f  d ? (isOrdered ?
31180 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f   'Y' : 'N') : '?
31190 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ');.          }.
311a0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
311b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
311c0 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d  if( pTo->rCost<=
311d0 72 43 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20  rCost ){.#ifdef 
311e0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
311f0 45 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ED.            i
31200 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
31210 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
31220 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31230 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
31240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31250 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d  "Skip   %s cost=
31260 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  %-3d order=%c",.
31270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31280 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
31290 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
312a0 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20  Loop), rCost,.  
312b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
312c0 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f  isOrderedValid ?
312d0 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59   (isOrdered ? 'Y
312e0 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b  ' : 'N') : '?');
312f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
31300 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
31310 66 28 22 20 20 20 76 73 20 25 73 20 63 6f 73 74  f("   vs %s cost
31320 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  =%-3d order=%c\n
31330 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
31340 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
31350 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c  me(pTo, iLoop+1,
31360 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c   0), pTo->rCost,
31370 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31380 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
31390 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69  dValid ? (pTo->i
313a0 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a  sOrdered ? 'Y' :
313b0 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20   'N') : '?');.  
313c0 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
313d0 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  if.            t
313e0 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43  estcase( pTo->rC
313f0 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20  ost==rCost );.  
31400 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
31410 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
31420 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
31430 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  se( pTo->rCost==
31440 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20  rCost+1 );.     
31450 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 61 6e       /* A new an
31460 64 20 62 65 74 74 65 72 20 73 63 6f 72 65 20 66  d better score f
31470 6f 72 20 61 20 70 72 65 76 69 6f 75 73 6c 79 20  or a previously 
31480 63 72 65 61 74 65 64 20 65 71 75 69 76 61 6c 65  created equivale
31490 6e 74 20 70 61 74 68 20 2a 2f 0a 23 69 66 64 65  nt path */.#ifde
314a0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
314b0 42 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20 69  BLED.          i
314c0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
314d0 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
314e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
314f0 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
31500 20 20 20 20 20 20 20 20 20 20 20 20 22 55 70 64              "Upd
31510 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  ate %s cost=%-3d
31520 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
31530 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
31540 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
31550 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
31560 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20   rCost,.        
31570 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
31580 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65  dValid ? (isOrde
31590 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29  red ? 'Y' : 'N')
315a0 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
315b0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
315c0 67 50 72 69 6e 74 66 28 22 20 20 77 61 73 20 25  gPrintf("  was %
315d0 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65  s cost=%-3d orde
315e0 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20  r=%c\n",.       
315f0 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
31600 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f  thName(pTo, iLoo
31610 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43  p+1, 0), pTo->rC
31620 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ost,.           
31630 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
31640 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d  redValid ? (pTo-
31650 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27  >isOrdered ? 'Y'
31660 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a   : 'N') : '?');.
31670 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
31680 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  if.        }.   
31690 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69       /* pWLoop i
316a0 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64  s a winner.  Add
316b0 20 69 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f   it to the set o
316c0 66 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f  f best so far */
316d0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61  .        pTo->ma
316e0 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e  skLoop = pFrom->
316f0 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f  maskLoop | pWLoo
31700 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
31710 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f       pTo->revLoo
31720 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20  p = revMask;.   
31730 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d       pTo->nRow =
31740 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70   pFrom->nRow + p
31750 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20  WLoop->nOut;.   
31760 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20       pTo->rCost 
31770 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  = rCost;.       
31780 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56   pTo->isOrderedV
31790 61 6c 69 64 20 3d 20 69 73 4f 72 64 65 72 65 64  alid = isOrdered
317a0 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20 70  Valid;.        p
317b0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20  To->isOrdered = 
317c0 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
317d0 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61     memcpy(pTo->a
317e0 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  Loop, pFrom->aLo
317f0 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65  op, sizeof(Where
31800 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20  Loop*)*iLoop);. 
31810 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f         pTo->aLoo
31820 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f  p[iLoop] = pWLoo
31830 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  p;.        if( n
31840 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a  To>=mxChoice ){.
31850 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74            mxCost
31860 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b   = aTo[0].rCost;
31870 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
31880 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d  j=1, pTo=&aTo[1]
31890 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a  ; jj<mxChoice; j
318a0 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  j++, pTo++){.   
318b0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
318c0 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 29  ->rCost>mxCost )
318d0 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72   mxCost = pTo->r
318e0 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
318f0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
31900 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65    }.    }..#ifde
31910 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
31920 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c  BLED.    if( sql
31930 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3e 3d  ite3WhereTrace>=
31940 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
31950 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d  e3DebugPrintf("-
31960 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20  --- after round 
31970 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f  %d ----\n", iLoo
31980 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  p);.      for(ii
31990 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c  =0, pTo=aTo; ii<
319a0 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b  nTo; ii++, pTo++
319b0 29 7b 0a 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 22 20  e3DebugPrintf(" 
319d0 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f  %s cost=%-3d nro
319e0 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22  w=%-3d order=%c"
319f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 77 68 65  ,.           whe
31a00 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
31a10 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
31a20 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52  ->rCost, pTo->nR
31a30 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ow,.           p
31a40 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c  To->isOrderedVal
31a50 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  id ? (pTo->isOrd
31a60 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
31a70 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
31a80 20 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64    if( pTo->isOrd
31a90 65 72 65 64 56 61 6c 69 64 20 26 26 20 70 54 6f  eredValid && pTo
31aa0 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20  ->isOrdered ){. 
31ab0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31ac0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 72 65  DebugPrintf(" re
31ad0 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f  v=0x%llx\n", pTo
31ae0 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20  ->revLoop);.    
31af0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31b00 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
31b10 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
31b20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31b30 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
31b40 20 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72     /* Swap the r
31b50 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e  oles of aFrom an
31b60 64 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65  d aTo for the ne
31b70 78 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  xt generation */
31b80 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f  .    pFrom = aTo
31b90 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f  ;.    aTo = aFro
31ba0 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70  m;.    aFrom = p
31bb0 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20  From;.    nFrom 
31bc0 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66  = nTo;.  }..  if
31bd0 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20  ( nFrom==0 ){.  
31be0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
31bf0 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75  g(pParse, "no qu
31c00 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a  ery solution");.
31c10 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
31c20 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20  e(db, pSpace);. 
31c30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
31c40 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20  _ERROR;.  }.  . 
31c50 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77   /* Find the low
31c60 65 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20  est cost path.  
31c70 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65  pFrom will be le
31c80 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ft pointing to t
31c90 68 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46  hat path */.  pF
31ca0 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 61  rom = aFrom;.  a
31cb0 73 73 65 72 74 28 20 6e 46 72 6f 6d 3d 3d 31 20  ssert( nFrom==1 
31cc0 29 3b 0a 23 69 66 20 30 20 2f 2a 20 54 68 65 20  );.#if 0 /* The 
31cd0 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6e 65 65  following is nee
31ce0 64 65 64 20 69 66 20 6e 46 72 6f 6d 20 69 73 20  ded if nFrom is 
31cf0 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 31  ever more than 1
31d00 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20   */.  for(ii=1; 
31d10 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b  ii<nFrom; ii++){
31d20 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
31d30 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e  rCost>aFrom[ii].
31d40 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20  rCost ) pFrom = 
31d50 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a  &aFrom[ii];.  }.
31d60 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
31d70 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
31d80 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c  =nLoop );.  /* L
31d90 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  oad the lowest c
31da0 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57  ost path into pW
31db0 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c  Info */.  for(iL
31dc0 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f  oop=0; iLoop<nLo
31dd0 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
31de0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
31df0 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  evel = pWInfo->a
31e00 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c   + iLoop;.    pL
31e10 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70  evel->pWLoop = p
31e20 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61  WLoop = pFrom->a
31e30 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20  Loop[iLoop];.   
31e40 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d   pLevel->iFrom =
31e50 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20   pWLoop->iTab;. 
31e60 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43     pLevel->iTabC
31e70 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ur = pWInfo->pTa
31e80 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
31e90 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b  >iFrom].iCursor;
31ea0 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e  .  }.  if( (pWIn
31eb0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
31ec0 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
31ed0 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28  INCT)!=0.   && (
31ee0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
31ef0 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
31f00 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20  NCTBY)==0.   && 
31f10 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
31f20 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  t==WHERE_DISTINC
31f30 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f  T_NOOP.   && nRo
31f40 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69  wEst.  ){.    Bi
31f50 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20  tmask notUsed;. 
31f60 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72     int rc = wher
31f70 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
31f80 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57  derBy(pWInfo, pW
31f90 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
31fa0 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20  , pFrom,.       
31fb0 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
31fc0 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f  DISTINCTBY, nLoo
31fd0 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
31fe0 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74  p[nLoop-1], &not
31ff0 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  Used);.    if( r
32000 63 3d 3d 31 20 29 20 70 57 49 6e 66 6f 2d 3e 65  c==1 ) pWInfo->e
32010 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
32020 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
32030 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72  D;.  }.  if( pFr
32040 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 7b  om->isOrdered ){
32050 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
32060 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
32070 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29  ERE_DISTINCTBY )
32080 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
32090 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
320a0 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
320b0 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ED;.    }else{. 
320c0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 42       pWInfo->bOB
320d0 53 61 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  Sat = 1;.      p
320e0 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
320f0 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b   pFrom->revLoop;
32100 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 49  .    }.  }.  pWI
32110 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70  nfo->nRowOut = p
32120 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f  From->nRow;..  /
32130 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79  * Free temporary
32140 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75   memory and retu
32150 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20  rn success */.  
32160 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
32170 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74  , pSpace);.  ret
32180 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
32190 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65  ../*.** Most que
321a0 72 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20  ries use only a 
321b0 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68  single table (th
321c0 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73  ey are not joins
321d0 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69  ) and have.** si
321e0 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69  mple == constrai
321f0 6e 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65  nts against inde
32200 78 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69  xed fields.  Thi
32210 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
32220 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68  ts.** to plan th
32230 6f 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73  ose simple cases
32240 20 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73   using much less
32250 20 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74   ceremony than t
32260 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75  he.** general-pu
32270 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e  rpose query plan
32280 6e 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79  ner, and thereby
32290 20 79 69 65 6c 64 20 66 61 73 74 65 72 20 73 71   yield faster sq
322a0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a  lite3_prepare().
322b0 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65  ** times for the
322c0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a   common case..**
322d0 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
322e0 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ero on success, 
322f0 69 66 20 74 68 69 73 20 71 75 65 72 79 20 63 61  if this query ca
32300 6e 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20  n be handled by 
32310 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c  this.** no-frill
32320 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  s query planner.
32330 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66    Return zero if
32340 20 74 68 69 73 20 71 75 65 72 79 20 6e 65 65 64   this query need
32350 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61  s the .** genera
32360 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20  l-purpose query 
32370 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74  planner..*/.stat
32380 69 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72  ic int whereShor
32390 74 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75  tCut(WhereLoopBu
323a0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29  ilder *pBuilder)
323b0 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
323c0 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  WInfo;.  struct 
323d0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
323e0 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  tem;.  WhereClau
323f0 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
32400 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57  Term *pTerm;.  W
32410 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
32420 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69  .  int iCur;.  i
32430 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70  nt j;.  Table *p
32440 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
32450 64 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20  dx;.  .  pWInfo 
32460 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
32470 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  fo;.  if( pWInfo
32480 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
32490 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
324a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
324b0 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70  ssert( pWInfo->p
324c0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31  TabList->nSrc>=1
324d0 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57   );.  pItem = pW
324e0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
324f0 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65  a;.  pTab = pIte
32500 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49  m->pTab;.  if( I
32510 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
32520 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
32530 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 29   pItem->zIndex )
32540 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75   return 0;.  iCu
32550 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  r = pItem->iCurs
32560 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49  or;.  pWC = &pWI
32570 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f  nfo->sWC;.  pLoo
32580 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
32590 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  ew;.  pLoop->wsF
325a0 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 54 65 72  lags = 0;.  pTer
325b0 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
325c0 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57  , iCur, -1, 0, W
325d0 4f 5f 45 51 2c 20 30 29 3b 0a 20 20 69 66 28 20  O_EQ, 0);.  if( 
325e0 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 70 4c 6f  pTerm ){.    pLo
325f0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  op->wsFlags = WH
32600 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48  ERE_COLUMN_EQ|WH
32610 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e  ERE_IPK|WHERE_ON
32620 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  EROW;.    pLoop-
32630 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65  >aLTerm[0] = pTe
32640 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e  rm;.    pLoop->n
32650 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70  LTerm = 1;.    p
32660 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
32670 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55  q = 1;.    /* TU
32680 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20  NING: Cost of a 
32690 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20  rowid lookup is 
326a0 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d  10 */.    pLoop-
326b0 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20  >rRun = 33;  /* 
326c0 33 33 3d 3d 77 68 65 72 65 43 6f 73 74 28 31 30  33==whereCost(10
326d0 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ) */.  }else{.  
326e0 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
326f0 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
32700 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
32710 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  {.      if( pIdx
32720 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f  ->onError==OE_No
32730 6e 65 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72  ne || pIdx->pPar
32740 74 49 64 78 57 68 65 72 65 21 3d 30 20 29 20 63  tIdxWhere!=0 ) c
32750 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
32760 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
32770 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
32780 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66         pTerm = f
32790 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
327a0 72 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  r, pIdx->aiColum
327b0 6e 5b 6a 5d 2c 20 30 2c 20 57 4f 5f 45 51 2c 20  n[j], 0, WO_EQ, 
327c0 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69  pIdx);.        i
327d0 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72  f( pTerm==0 ) br
327e0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 77 68 65  eak;.        whe
327f0 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 57 49  reLoopResize(pWI
32800 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  nfo->pParse->db,
32810 20 70 4c 6f 6f 70 2c 20 6a 29 3b 0a 20 20 20 20   pLoop, j);.    
32820 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
32830 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[j] = pTerm;.  
32840 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
32850 6a 21 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  j!=pIdx->nColumn
32860 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
32870 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
32880 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
32890 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57  _EQ|WHERE_ONEROW
328a0 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a  |WHERE_INDEXED;.
328b0 20 20 20 20 20 20 69 66 28 20 28 70 49 74 65 6d        if( (pItem
328c0 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c  ->colUsed & ~col
328d0 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78  umnsInIndex(pIdx
328e0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
328f0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
32900 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  |= WHERE_IDX_ONL
32910 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  Y;.      }.     
32920 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d   pLoop->nLTerm =
32930 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d   j;.      pLoop-
32940 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a  >u.btree.nEq = j
32950 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  ;.      pLoop->u
32960 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
32970 70 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54  pIdx;.      /* T
32980 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61  UNING: Cost of a
32990 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f   unique index lo
329a0 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20  okup is 15 */.  
329b0 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20      pLoop->rRun 
329c0 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 77 68  = 39;  /* 39==wh
329d0 65 72 65 43 6f 73 74 28 31 35 29 20 2a 2f 0a 20  ereCost(15) */. 
329e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
329f0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f  }.  }.  if( pLoo
32a00 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20  p->wsFlags ){.  
32a10 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20    pLoop->nOut = 
32a20 28 57 68 65 72 65 43 6f 73 74 29 31 3b 0a 20 20  (WhereCost)1;.  
32a30 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70    pWInfo->a[0].p
32a40 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20  WLoop = pLoop;. 
32a50 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65     pLoop->maskSe
32a60 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57  lf = getMask(&pW
32a70 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
32a80 69 43 75 72 29 3b 0a 20 20 20 20 70 57 49 6e 66  iCur);.    pWInf
32a90 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72 20  o->a[0].iTabCur 
32aa0 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49 6e  = iCur;.    pWIn
32ab0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b  fo->nRowOut = 1;
32ac0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
32ad0 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e  >pOrderBy ) pWIn
32ae0 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 20 31 3b  fo->bOBSat =  1;
32af0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
32b00 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
32b10 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
32b20 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  T ){.      pWInf
32b30 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
32b40 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
32b50 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64  IQUE;.    }.#ifd
32b60 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
32b70 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d      pLoop->cId =
32b80 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20   '0';.#endif.   
32b90 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
32ba0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
32bb0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65  .** Generate the
32bc0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
32bd0 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20  e loop used for 
32be0 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
32bf0 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20  cessing..** The 
32c00 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
32c10 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
32c20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65  opaque structure
32c30 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
32c40 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65  * information ne
32c50 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  eded to terminat
32c60 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74  e the loop.  Lat
32c70 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  er, the calling 
32c80 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c  routine.** shoul
32c90 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  d invoke sqlite3
32ca0 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20  WhereEnd() with 
32cb0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
32cc0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
32cd0 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  n.** in order to
32ce0 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48   complete the WH
32cf0 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
32d00 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssing..**.** If 
32d10 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
32d20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
32d30 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  turns NULL..**.*
32d40 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61  * The basic idea
32d50 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74   is to do a nest
32d60 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f  ed loop, one loo
32d70 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  p for each table
32d80 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20   in.** the FROM 
32d90 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65  clause of a sele
32da0 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64  ct.  (INSERT and
32db0 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
32dc0 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61  ts are the.** sa
32dd0 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77  me as a SELECT w
32de0 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ith only a singl
32df0 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e table in the F
32e00 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f  ROM clause.)  Fo
32e10 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66  r.** example, if
32e20 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73   the SQL is this
32e30 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45  :.**.**       SE
32e40 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
32e50 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e  t2, t3 WHERE ...
32e60 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65  ;.**.** Then the
32e70 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
32e80 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20  is conceptually 
32e90 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  like the followi
32ea0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66  ng:.**.**      f
32eb0 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
32ec0 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20  1 do       \    
32ed0 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
32ee0 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  *        foreach
32ef0 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20   row2 in t2 do  
32f00 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
32f10 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a  e3WhereBegin().*
32f20 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  *          forea
32f30 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f  ch row3 in t3 do
32f40 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20     /.**         
32f50 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
32f60 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
32f70 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20             \    
32f80 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
32f90 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20  *        end    
32fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32fb0 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
32fc0 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20  e3WhereEnd().** 
32fd0 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
32fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ff0 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68   /.**.** Note th
33000 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67  at the loops mig
33010 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64  ht not be nested
33020 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e   in the order in
33030 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61   which they.** a
33040 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
33050 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69  M clause if a di
33060 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73  fferent order is
33070 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20   better able to 
33080 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69  make.** use of i
33090 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c  ndices.  Note al
330a0 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
330b0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70   IN operator app
330c0 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57  ears in.** the W
330d0 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20  HERE clause, it 
330e0 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
330f0 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65  additional neste
33100 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73  d loops for.** s
33110 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
33120 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68  all values on th
33130 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
33140 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a  e of the IN..**.
33150 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72  ** There are Btr
33160 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ee cursors assoc
33170 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
33180 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20  table.  t1 uses 
33190 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
331a0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
331b0 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65  iCursor.  t2 use
331c0 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61  s the cursor pTa
331d0 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72  bList->a[1].iCur
331e0 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66  sor..** And so f
331f0 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74  orth.  This rout
33200 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
33210 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65  de to open those
33220 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a   VDBE cursors.**
33230 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72   and sqlite3Wher
33240 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73  eEnd() generates
33250 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f   the code to clo
33260 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  se them..**.** T
33270 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c  he code that sql
33280 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
33290 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65   generates leave
332a0 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61  s the cursors na
332b0 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69  med.** in pTabLi
332c0 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  st pointing at t
332d0 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65  heir appropriate
332e0 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b   entries.  The [
332f0 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e  ...] code.** can
33300 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61   use OP_Column a
33310 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f  nd OP_Rowid opco
33320 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72  des on these cur
33330 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a  sors to extract.
33340 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
33350 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20   various tables 
33360 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  of the loop..**.
33370 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20  ** If the WHERE 
33380 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c  clause is empty,
33390 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f   the foreach loo
333a0 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61  ps must each sca
333b0 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72  n their.** entir
333c0 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20  e tables.  Thus 
333d0 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
333e0 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70   is an O(N^3) op
333f0 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66  eration.  But if
33400 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68  .** the tables h
33410 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  ave indices and 
33420 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20  there are terms 
33430 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
33440 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65  use that.** refe
33450 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63  r to those indic
33460 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74  es, a complete t
33470 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65  able scan can be
33480 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65   avoided and the
33490 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75  .** code will ru
334a0 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20  n much faster.  
334b0 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b  Most of the work
334c0 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
334d0 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   is checking.** 
334e0 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
334f0 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74  are indices that
33500 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
33510 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f  speed up the loo
33520 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f  p..**.** Terms o
33530 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
33540 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64  se are also used
33550 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20   to limit which 
33560 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  rows actually.**
33570 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20   make it to the 
33580 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64  "..." in the mid
33590 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  dle of the loop.
335a0 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f    After each "fo
335b0 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73  reach",.** terms
335c0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
335d0 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e  ause that use on
335e0 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74  ly terms in that
335f0 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a   loop and outer.
33600 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61  ** loops are eva
33610 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61  luated and if fa
33620 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  lse a jump is ma
33630 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75  de around all su
33640 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65  bsequent.** inne
33650 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75  r loops (or arou
33660 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20  nd the "..." if 
33670 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20  the test occurs 
33680 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72  within the inner
33690 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a  -.** most loop).
336a0 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e  **.** OUTER JOIN
336b0 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72  S.**.** An outer
336c0 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20   join of tables 
336d0 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e  t1 and t2 is con
336e0 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61  ceptally coded a
336f0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
33700 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
33710 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20   in t1 do.**    
33720 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20    flag = 0.**   
33730 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
33740 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20  in t2 do.**     
33750 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20     start:.**    
33760 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
33770 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a        flag = 1.*
33780 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20  *      end.**   
33790 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68     if flag==0 th
337a0 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76  en.**        mov
337b0 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f  e the row2 curso
337c0 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a  r to a null row.
337d0 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  **        goto s
337e0 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a  tart.**      fi.
337f0 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20  **    end.**.** 
33800 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20  ORDER BY CLAUSE 
33810 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a  PROCESSING.**.**
33820 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70   pOrderBy is a p
33830 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52  ointer to the OR
33840 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f  DER BY clause (o
33850 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  r the GROUP BY c
33860 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20  lause.** if the 
33870 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c  WHERE_GROUPBY fl
33880 61 67 20 69 73 20 73 65 74 20 69 6e 20 77 63 74  ag is set in wct
33890 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45  rlFlags) of a SE
338a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
338b0 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
338c0 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  e.  If there is 
338d0 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
338e0 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  se or if this ro
338f0 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
33900 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54  ed from an UPDAT
33910 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
33920 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64  ement, then pOrd
33930 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f  erBy is NULL..*/
33940 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69  .WhereInfo *sqli
33950 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20  te3WhereBegin(. 
33960 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
33970 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
33980 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
33990 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
339a0 69 73 74 2c 20 20 20 20 2f 2a 20 46 52 4f 4d 20  ist,    /* FROM 
339b0 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f  clause: A list o
339c0 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  f all tables to 
339d0 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
339e0 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
339f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
33a00 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
33a10 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
33a20 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52  y,   /* An ORDER
33a30 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e   BY clause, or N
33a40 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
33a50 74 20 2a 70 52 65 73 75 6c 74 53 65 74 2c 20 2f  t *pResultSet, /
33a60 2a 20 52 65 73 75 6c 74 20 73 65 74 20 6f 66 20  * Result set of 
33a70 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 75  the query */.  u
33a80 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20  16 wctrlFlags,  
33a90 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
33aa0 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73  he WHERE_* flags
33ab0 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69   defined in sqli
33ac0 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74  teInt.h */.  int
33ad0 20 69 49 64 78 43 75 72 20 20 20 20 20 20 20 20   iIdxCur        
33ae0 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f     /* If WHERE_O
33af0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20  NETABLE_ONLY is 
33b00 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f  set, index curso
33b10 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  r number */.){. 
33b20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b   int nByteWInfo;
33b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
33b40 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  um. bytes alloca
33b50 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66  ted for WhereInf
33b60 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e  o struct */.  in
33b70 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20  t nTabList;     
33b80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
33b90 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
33ba0 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20  n pTabList */.  
33bb0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
33bc0 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69  o;         /* Wi
33bd0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65  ll become the re
33be0 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
33bf0 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
33c00 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
33c10 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54  e->pVdbe;   /* T
33c20 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62  he virtual datab
33c30 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20  ase engine */.  
33c40 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
33c50 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  ;          /* Cu
33c60 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
33c70 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65  ot yet positione
33c80 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  d */.  WhereLoop
33c90 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20 20 20  Builder sWLB;   
33ca0 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
33cb0 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20  op builder */.  
33cc0 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
33cd0 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68  askSet;    /* Th
33ce0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73  e expression mas
33cf0 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65  k set */.  Where
33d00 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
33d10 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
33d20 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66  e level in pWInf
33d30 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  o->a[] */.  Wher
33d40 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
33d50 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
33d60 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68  r to a single Wh
33d70 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
33d80 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  /.  int ii;     
33d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33da0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
33db0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
33dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33dd0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
33de0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ction */.  int r
33df0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
33e00 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
33e10 63 6f 64 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56  code */...  /* V
33e20 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69  ariable initiali
33e30 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d  zation */.  db =
33e40 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d   pParse->db;.  m
33e50 65 6d 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20  emset(&sWLB, 0, 
33e60 73 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 20  sizeof(sWLB));. 
33e70 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d   sWLB.pOrderBy =
33e80 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a   pOrderBy;..  /*
33e90 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49 53   Disable the DIS
33ea0 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69  TINCT optimizati
33eb0 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73  on if SQLITE_Dis
33ec0 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20  tinctOpt is set 
33ed0 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  via.  ** sqlite3
33ee0 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54  _test_ctrl(SQLIT
33ef0 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
33f00 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f  IZATIONS,...) */
33f10 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
33f20 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
33f30 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f  SQLITE_DistinctO
33f40 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72 6c  pt) ){.    wctrl
33f50 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f  Flags &= ~WHERE_
33f60 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20  WANT_DISTINCT;. 
33f70 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d   }..  /* The num
33f80 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
33f90 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
33fa0 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74   is limited by t
33fb0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  he number of.  *
33fc0 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d  * bits in a Bitm
33fd0 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ask .  */.  test
33fe0 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e  case( pTabList->
33ff0 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69  nSrc==BMS );.  i
34000 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
34010 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c  c>BMS ){.    sql
34020 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
34030 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64  rse, "at most %d
34040 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69   tables in a joi
34050 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65  n", BMS);.    re
34060 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
34070 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
34080 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74  normally generat
34090 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  es a nested loop
340a0 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
340b0 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73  in .  ** pTabLis
340c0 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57  t.  But if the W
340d0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
340e0 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  LY flag is set, 
340f0 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20  then we should. 
34100 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74   ** only generat
34110 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66  e code for the f
34120 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54  irst table in pT
34130 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d  abList and assum
34140 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20  e that.  ** any 
34150 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
34160 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65  ed with subseque
34170 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e  nt tables are un
34180 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
34190 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28  /.  nTabList = (
341a0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
341b0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
341c0 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74  ) ? 1 : pTabList
341d0 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c  ->nSrc;..  /* Al
341e0 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
341f0 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49  alize the WhereI
34200 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
34210 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
34220 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  he.  ** return v
34230 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61  alue. A single a
34240 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65  llocation is use
34250 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57  d to store the W
34260 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74  hereInfo.  ** st
34270 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e  ruct, the conten
34280 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e  ts of WhereInfo.
34290 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c  a[], the WhereCl
342a0 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  ause structure. 
342b0 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72   ** and the Wher
342c0 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
342d0 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43  re. Since WhereC
342e0 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
342f0 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69  n 8-byte.  ** fi
34300 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73  eld (type Bitmas
34310 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c  k) it must be al
34320 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79  igned on an 8-by
34330 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20  te boundary on. 
34340 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65   ** some archite
34350 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68  ctures. Hence th
34360 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77  e ROUND8() below
34370 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49  ..  */.  nByteWI
34380 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  nfo = ROUND8(siz
34390 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28  eof(WhereInfo)+(
343a0 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65  nTabList-1)*size
343b0 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
343c0 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69  .  pWInfo = sqli
343d0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
343e0 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b  db, nByteWInfo +
343f0 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
34400 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  p));.  if( db->m
34410 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
34420 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
34430 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
34440 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20    pWInfo = 0;.  
34450 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
34460 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57  nError;.  }.  pW
34470 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e  Info->nLevel = n
34480 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66  TabList;.  pWInf
34490 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72  o->pParse = pPar
344a0 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54  se;.  pWInfo->pT
344b0 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  abList = pTabLis
344c0 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  t;.  pWInfo->pOr
344d0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
344e0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73  ;.  pWInfo->pRes
344f0 75 6c 74 53 65 74 20 3d 20 70 52 65 73 75 6c 74  ultSet = pResult
34500 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  Set;.  pWInfo->i
34510 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
34520 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
34530 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  .  pWInfo->wctrl
34540 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61  Flags = wctrlFla
34550 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61  gs;.  pWInfo->sa
34560 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  vedNQueryLoop = 
34570 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
34580 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d  op;.  pMaskSet =
34590 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53   &pWInfo->sMaskS
345a0 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66  et;.  sWLB.pWInf
345b0 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57  o = pWInfo;.  sW
345c0 4c 42 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f  LB.pWC = &pWInfo
345d0 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e  ->sWC;.  sWLB.pN
345e0 65 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a  ew = (WhereLoop*
345f0 29 28 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f  )(((char*)pWInfo
34600 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20  )+nByteWInfo);. 
34610 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
34620 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57  YTE_ALIGNMENT(sW
34630 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68  LB.pNew) );.  wh
34640 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42  ereLoopInit(sWLB
34650 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53  .pNew);.#ifdef S
34660 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57  QLITE_DEBUG.  sW
34670 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27  LB.pNew->cId = '
34680 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  *';.#endif..  /*
34690 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45   Split the WHERE
346a0 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70   clause into sep
346b0 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73  arate subexpress
346c0 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a  ions where each.
346d0 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69    ** subexpressi
346e0 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
346f0 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  by an AND operat
34700 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d  or..  */.  initM
34710 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29  askSet(pMaskSet)
34720 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49  ;.  whereClauseI
34730 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  nit(&pWInfo->sWC
34740 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c  , pWInfo);.  sql
34750 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73  ite3ExprCodeCons
34760 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57  tants(pParse, pW
34770 68 65 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70  here);.  whereSp
34780 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  lit(&pWInfo->sWC
34790 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44  , pWhere, TK_AND
347a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65  );.  sqlite3Code
347b0 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
347c0 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73  rse, -1); /* Ins
347d0 65 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  ert the cookie v
347e0 65 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a  erifier Goto */.
347f0 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61      .  /* Specia
34800 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20  l case: a WHERE 
34810 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63  clause that is c
34820 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61  onstant.  Evalua
34830 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72  te the.  ** expr
34840 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65  ession and eithe
34850 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20  r jump over all 
34860 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66  of the code or f
34870 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20  all thru..  */. 
34880 20 69 66 28 20 70 57 68 65 72 65 20 26 26 20 28   if( pWhere && (
34890 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73  nTabList==0 || s
348a0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
348b0 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65  tantNotJoin(pWhe
348c0 72 65 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  re)) ){.    sqli
348d0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
348e0 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70  Parse, pWhere, p
348f0 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53  WInfo->iBreak, S
34900 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
34910 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  );.    pWhere = 
34920 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65  0;.  }..  /* Spe
34930 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52  cial case: No FR
34940 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  OM clause.  */. 
34950 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30   if( nTabList==0
34960 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64   ){.    if( pOrd
34970 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 62  erBy ) pWInfo->b
34980 4f 42 53 61 74 20 3d 20 31 3b 0a 20 20 20 20 69  OBSat = 1;.    i
34990 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
349a0 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
349b0 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49  NCT ){.      pWI
349c0 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
349d0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
349e0 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20  UNIQUE;.    }.  
349f0 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61  }..  /* Assign a
34a00 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69   bit from the bi
34a10 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74  tmask to every t
34a20 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  erm in the FROM 
34a30 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
34a40 2a 20 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67  * When assigning
34a50 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20   bitmask values 
34a60 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63  to FROM clause c
34a70 75 72 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20  ursors, it must 
34a80 62 65 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65  be.  ** the case
34a90 20 74 68 61 74 20 69 66 20 58 20 69 73 20 74 68   that if X is th
34aa0 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68  e bitmask for th
34ab0 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75  e N-th FROM clau
34ac0 73 65 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a  se term then.  *
34ad0 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  * the bitmask fo
34ae0 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73  r all FROM claus
34af0 65 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c  e terms to the l
34b00 65 66 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20  eft of the N-th 
34b10 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d  term.  ** is (X-
34b20 31 29 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73  1).   An express
34b30 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ion from the ON 
34b40 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54  clause of a LEFT
34b50 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20   JOIN can use.  
34b60 2a 2a 20 69 74 73 20 45 78 70 72 2e 69 52 69 67  ** its Expr.iRig
34b70 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75  htJoinTable valu
34b80 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69  e to find the bi
34b90 74 6d 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67  tmask of the rig
34ba0 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66  ht table.  ** of
34bb0 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74   the join.  Subt
34bc0 72 61 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d  racting one from
34bd0 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
34be0 20 62 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61   bitmask gives a
34bf0 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f  .  ** bitmask fo
34c00 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
34c10 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
34c20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74  join.  Knowing t
34c30 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20  he bitmask.  ** 
34c40 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74  for all tables t
34c50 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20  o the left of a 
34c60 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70  left join is imp
34c70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20  ortant.  Ticket 
34c80 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  #3015..  **.  **
34c90 20 4e 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61   Note that bitma
34ca0 73 6b 73 20 61 72 65 20 63 72 65 61 74 65 64 20  sks are created 
34cb0 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74  for all pTabList
34cc0 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e  ->nSrc tables in
34cd0 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20  .  ** pTabList, 
34ce0 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69 72  not just the fir
34cf0 73 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c  st nTabList tabl
34d00 65 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73  es.  nTabList is
34d10 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65   normally.  ** e
34d20 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74  qual to pTabList
34d30 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74  ->nSrc but might
34d40 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f   be shortened to
34d50 20 31 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57   1 if the.  ** W
34d60 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
34d70 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  LY flag is set..
34d80 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b    */.  for(ii=0;
34d90 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53   ii<pTabList->nS
34da0 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63  rc; ii++){.    c
34db0 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53  reateMask(pMaskS
34dc0 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
34dd0 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ii].iCursor);.  
34de0 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
34df0 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  .  {.    Bitmask
34e00 20 74 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a   toTheLeft = 0;.
34e10 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
34e20 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
34e30 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69   ii++){.      Bi
34e40 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73  tmask m = getMas
34e50 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
34e60 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72  List->a[ii].iCur
34e70 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  sor);.      asse
34e80 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65  rt( (m-1)==toThe
34e90 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f  Left );.      to
34ea0 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20  TheLeft |= m;.  
34eb0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
34ec0 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c    /* Analyze all
34ed0 20 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65   of the subexpre
34ee0 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68  ssions.  Note th
34ef0 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29  at exprAnalyze()
34f00 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20   might.  ** add 
34f10 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
34f20 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  s onto the end o
34f30 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
34f40 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20  se.  We do not. 
34f50 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c   ** want to anal
34f60 79 7a 65 20 74 68 65 73 65 20 76 69 72 74 75 61  yze these virtua
34f70 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72  l terms, so star
34f80 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74  t analyzing at t
34f90 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20  he end.  ** and 
34fa0 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20  work forward so 
34fb0 74 68 61 74 20 74 68 65 20 61 64 64 65 64 20 76  that the added v
34fc0 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65  irtual terms are
34fd0 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65 64   never processed
34fe0 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61  ..  */.  exprAna
34ff0 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74  lyzeAll(pTabList
35000 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b  , &pWInfo->sWC);
35010 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
35020 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
35030 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
35040 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ror;.  }..  /* I
35050 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 28  f the ORDER BY (
35060 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61  or GROUP BY) cla
35070 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 72 65 66  use contains ref
35080 65 72 65 6e 63 65 73 20 74 6f 20 67 65 6e 65 72  erences to gener
35090 61 6c 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  al.  ** expressi
350a0 6f 6e 73 2c 20 74 68 65 6e 20 77 65 20 77 6f 6e  ons, then we won
350b0 27 74 20 62 65 20 61 62 6c 65 20 74 6f 20 73 61  't be able to sa
350c0 74 69 73 66 79 20 69 74 20 75 73 69 6e 67 20 69  tisfy it using i
350d0 6e 64 69 63 65 73 2c 20 73 6f 0a 20 20 2a 2a 20  ndices, so.  ** 
350e0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64 69 73  go ahead and dis
350f0 61 62 6c 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a  able it now..  *
35100 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
35110 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
35120 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
35130 54 49 4e 43 54 29 21 3d 30 20 29 7b 0a 20 20 20  TINCT)!=0 ){.   
35140 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
35150 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
35160 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
35170 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65   *pExpr = sqlite
35180 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
35190 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d  (pOrderBy->a[ii]
351a0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  .pExpr);.      i
351b0 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
351c0 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
351d0 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65     pWInfo->pOrde
351e0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 20 3d  rBy = pOrderBy =
351f0 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   0;.        brea
35200 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  k;.      }else i
35210 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
35220 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62  n<0 ){.        b
35230 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
35240 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77    }.  }..  if( w
35250 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
35260 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
35270 29 7b 0a 20 20 20 20 69 66 28 20 69 73 44 69 73  ){.    if( isDis
35280 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70  tinctRedundant(p
35290 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
352a0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70   &pWInfo->sWC, p
352b0 52 65 73 75 6c 74 53 65 74 29 20 29 7b 0a 20 20  ResultSet) ){.  
352c0 20 20 20 20 2f 2a 20 54 68 65 20 44 49 53 54 49      /* The DISTI
352d0 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69 73 20 70  NCT marking is p
352e0 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72  ointless.  Ignor
352f0 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70  e it. */.      p
35300 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
35310 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
35320 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65  T_UNIQUE;.    }e
35330 6c 73 65 20 69 66 28 20 70 4f 72 64 65 72 42 79  lse if( pOrderBy
35340 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
35350 54 72 79 20 74 6f 20 4f 52 44 45 52 20 42 59 20  Try to ORDER BY 
35360 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74  the result set t
35370 6f 20 6d 61 6b 65 20 64 69 73 74 69 6e 63 74 20  o make distinct 
35380 70 72 6f 63 65 73 73 69 6e 67 20 65 61 73 69 65  processing easie
35390 72 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66  r */.      pWInf
353a0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d  o->wctrlFlags |=
353b0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
353c0 59 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  Y;.      pWInfo-
353d0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 52 65 73  >pOrderBy = pRes
353e0 75 6c 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20  ultSet;.    }.  
353f0 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  }..  /* Construc
35400 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  t the WhereLoop 
35410 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 48 45  objects */.  WHE
35420 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 28  RETRACE(0xffff,(
35430 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53  "*** Optimizer S
35440 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20  tart ***\n"));. 
35450 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31   if( nTabList!=1
35460 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75   || whereShortCu
35470 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20  t(&sWLB)==0 ){. 
35480 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
35490 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a  pAddAll(&sWLB);.
354a0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
354b0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
354c0 72 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 44 69 73  r;.  .    /* Dis
354d0 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20  play all of the 
354e0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
354f0 73 20 69 66 20 77 68 65 72 65 74 72 61 63 65 20  s if wheretrace 
35500 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 23 69  is enabled */.#i
35510 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
35520 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20  ENABLED.    if( 
35530 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
35540 65 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  e ){.      Where
35550 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20 20 69  Loop *p;.      i
35560 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 74 61 74  nt i;.      stat
35570 69 63 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d  ic char zLabel[]
35580 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62   = "0123456789ab
35590 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
355a0 73 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20  stuvwyxz".      
355b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
355c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
355d0 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
355e0 4f 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20  OPQRSTUVWYXZ";. 
355f0 20 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66       for(p=pWInf
35600 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20  o->pLoops, i=0; 
35610 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f  p; p=p->pNextLoo
35620 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p, i++){.       
35630 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c   p->cId = zLabel
35640 5b 69 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c  [i%sizeof(zLabel
35650 29 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  )];.        wher
35660 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 54  eLoopPrint(p, pT
35670 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  abList);.      }
35680 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
35690 0a 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f  .    wherePathSo
356a0 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b  lver(pWInfo, 0);
356b0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
356c0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
356d0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
356e0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
356f0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
35700 20 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f       wherePathSo
35710 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49  lver(pWInfo, pWI
35720 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b  nfo->nRowOut+1);
35730 0a 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  .       if( db->
35740 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
35750 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
35760 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
35770 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
35780 64 65 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d  derBy==0 && (db-
35790 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
357a0 52 65 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30  ReverseOrder)!=0
357b0 20 29 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d   ){.     pWInfo-
357c0 3e 72 65 76 4d 61 73 6b 20 3d 20 28 42 69 74 6d  >revMask = (Bitm
357d0 61 73 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a 20 20  ask)(-1);.  }.  
357e0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
357f0 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61   || NEVER(db->ma
35800 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20  llocFailed) ){. 
35810 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
35820 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66  inError;.  }.#if
35830 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
35840 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
35850 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
35860 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  {.    int ii;.  
35870 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
35880 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74  intf("---- Solut
35890 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57  ion nRow=%d", pW
358a0 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a  Info->nRowOut);.
358b0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
358c0 62 4f 42 53 61 74 20 29 7b 0a 20 20 20 20 20 20  bOBSat ){.      
358d0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
358e0 74 66 28 22 20 4f 52 44 45 52 42 59 3d 30 78 25  tf(" ORDERBY=0x%
358f0 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 72 65  llx", pWInfo->re
35900 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  vMask);.    }.  
35910 20 20 73 77 69 74 63 68 28 20 70 57 49 6e 66 6f    switch( pWInfo
35920 2d 3e 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  ->eDistinct ){. 
35930 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
35940 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a  DISTINCT_UNIQUE:
35950 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
35960 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
35970 20 44 49 53 54 49 4e 43 54 3d 75 6e 69 71 75 65   DISTINCT=unique
35980 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ");.        brea
35990 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
359a0 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
359b0 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a  INCT_ORDERED: {.
359c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
359d0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49  ebugPrintf("  DI
359e0 53 54 49 4e 43 54 3d 6f 72 64 65 72 65 64 22 29  STINCT=ordered")
359f0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
35a00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
35a10 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
35a20 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a  CT_UNORDERED: {.
35a30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
35a40 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49  ebugPrintf("  DI
35a50 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64  STINCT=unordered
35a60 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ");.        brea
35a70 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
35a80 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
35a90 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
35aa0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
35ab0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
35ac0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65  ii++){.      whe
35ad0 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e  reLoopPrint(pWIn
35ae0 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70  fo->a[ii].pWLoop
35af0 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20  , pTabList);.   
35b00 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
35b10 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d  /* Attempt to om
35b20 69 74 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74  it tables from t
35b30 68 65 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20  he join that do 
35b40 6e 6f 74 20 65 66 66 65 63 74 20 74 68 65 20 72  not effect the r
35b50 65 73 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20 70  esult */.  if( p
35b60 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32  WInfo->nLevel>=2
35b70 0a 20 20 20 26 26 20 70 52 65 73 75 6c 74 53 65  .   && pResultSe
35b80 74 21 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d  t!=0.   && Optim
35b90 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
35ba0 62 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f  b, SQLITE_OmitNo
35bb0 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20  opJoin).  ){.   
35bc0 20 42 69 74 6d 61 73 6b 20 74 61 62 55 73 65 64   Bitmask tabUsed
35bd0 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65   = exprListTable
35be0 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
35bf0 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20  pResultSet);.   
35c00 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20   if( pOrderBy ) 
35c10 74 61 62 55 73 65 64 20 7c 3d 20 65 78 70 72 4c  tabUsed |= exprL
35c20 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
35c30 61 73 6b 53 65 74 2c 20 70 4f 72 64 65 72 42 79  askSet, pOrderBy
35c40 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57  );.    while( pW
35c50 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20  Info->nLevel>=2 
35c60 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
35c70 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64  rm *pTerm, *pEnd
35c80 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20  ;.      pLoop = 
35c90 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f  pWInfo->a[pWInfo
35ca0 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f  ->nLevel-1].pWLo
35cb0 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  op;.      if( (p
35cc0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
35cd0 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e  >a[pLoop->iTab].
35ce0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
35cf0 46 54 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  FT)==0 ) break;.
35d00 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c        if( (wctrl
35d10 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
35d20 4e 54 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a  NT_DISTINCT)==0.
35d30 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70         && (pLoop
35d40 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
35d50 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20  E_ONEROW)==0.   
35d60 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72     ){.        br
35d70 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
35d80 20 20 20 69 66 28 20 28 74 61 62 55 73 65 64 20     if( (tabUsed 
35d90 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
35da0 66 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  f)!=0 ) break;. 
35db0 20 20 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42       pEnd = sWLB
35dc0 2e 70 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70  .pWC->a + sWLB.p
35dd0 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20  WC->nTerm;.     
35de0 20 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e   for(pTerm=sWLB.
35df0 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45  pWC->a; pTerm<pE
35e00 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
35e10 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
35e20 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c  ->prereqAll & pL
35e30 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d  oop->maskSelf)!=
35e40 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45  0.         && !E
35e50 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
35e60 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
35e70 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20  FromJoin).      
35e80 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62    ){.          b
35e90 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
35ea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
35eb0 28 20 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 62  ( pTerm<pEnd ) b
35ec0 72 65 61 6b 3b 0a 20 20 20 20 20 20 57 48 45 52  reak;.      WHER
35ed0 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28  ETRACE(0xffff, (
35ee0 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63  "-> drop loop %c
35ef0 20 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c   not used\n", pL
35f00 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20  oop->cId));.    
35f10 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c    pWInfo->nLevel
35f20 2d 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69  --;.      nTabLi
35f30 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  st--;.    }.  }.
35f40 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
35f50 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  fff,("*** Optimi
35f60 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a  zer Finished ***
35f70 5c 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d  \n"));.  pWInfo-
35f80 3e 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c  >pParse->nQueryL
35f90 6f 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e  oop += pWInfo->n
35fa0 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66  RowOut;..  /* If
35fb0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
35fc0 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
35fd0 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  TE statement tha
35fe0 74 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a  t is requesting.
35ff0 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e    ** to use a on
36000 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d  e-pass algorithm
36010 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  , determine if t
36020 68 69 73 20 69 73 20 61 70 70 72 6f 70 72 69 61  his is appropria
36030 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65  te..  ** The one
36040 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20  -pass algorithm 
36050 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68  only works if th
36060 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
36070 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
36080 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  the statement to
36090 20 75 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65   update a single
360a0 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   row..  */.  ass
360b0 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73  ert( (wctrlFlags
360c0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
360d0 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20  _DESIRED)==0 || 
360e0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
360f0 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72  1 );.  if( (wctr
36100 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
36110 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21  NEPASS_DESIRED)!
36120 3d 30 20 0a 20 20 20 26 26 20 28 70 57 49 6e 66  =0 .   && (pWInf
36130 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e  o->a[0].pWLoop->
36140 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
36150 4f 4e 45 52 4f 57 29 21 3d 30 20 29 7b 0a 20 20  ONEROW)!=0 ){.  
36160 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50    pWInfo->okOneP
36170 61 73 73 20 3d 20 31 3b 0a 20 20 20 20 70 57 49  ass = 1;.    pWI
36180 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70  nfo->a[0].pWLoop
36190 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48  ->wsFlags &= ~WH
361a0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
361b0 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c  }..  /* Open all
361c0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
361d0 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20  TabList and any 
361e0 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65 64  indices selected
361f0 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68   for.  ** search
36200 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73  ing those tables
36210 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64  ..  */.  notRead
36220 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  y = ~(Bitmask)0;
36230 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65  .  for(ii=0, pLe
36240 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69  vel=pWInfo->a; i
36250 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b  i<nTabList; ii++
36260 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
36270 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
36280 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70    /* Table to op
36290 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44  en */.    int iD
362a0 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  b;         /* In
362b0 64 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20  dex of database 
362c0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65  containing table
362d0 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 74  /index */.    st
362e0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
362f0 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20  m *pTabItem;..  
36300 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54    pTabItem = &pT
36310 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
36320 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54  ->iFrom];.    pT
36330 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70  ab = pTabItem->p
36340 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  Tab;.    iDb = s
36350 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
36360 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
36370 63 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f  chema);.    pLoo
36380 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
36390 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61  op;.    if( (pTa
363a0 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
363b0 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c  _Ephemeral)!=0 |
363c0 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
363d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  ){.      /* Do n
363e0 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65  othing */.    }e
363f0 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  lse.#ifndef SQLI
36400 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
36410 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c  ABLE.    if( (pL
36420 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
36430 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
36440 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  E)!=0 ){.      c
36450 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61 62  onst char *pVTab
36460 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
36470 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c  )sqlite3GetVTabl
36480 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
36490 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54     int iCur = pT
364a0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
364b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
364c0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56  beAddOp4(v, OP_V
364d0 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30  Open, iCur, 0, 0
364e0 2c 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42  , pVTab, P4_VTAB
364f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
36500 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
36510 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f   ){.      /* noo
36520 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23  p */.    }else.#
36530 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70  endif.    if( (p
36540 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
36550 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
36560 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
36570 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
36580 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f  RE_OMIT_OPEN_CLO
36590 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  SE)==0 ){.      
365a0 69 6e 74 20 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  int op = pWInfo-
365b0 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f  >okOnePass ? OP_
365c0 4f 70 65 6e 57 72 69 74 65 20 3a 20 4f 50 5f 4f  OpenWrite : OP_O
365d0 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 73  penRead;.      s
365e0 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
365f0 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d  pParse, pTabItem
36600 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20  ->iCursor, iDb, 
36610 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20  pTab, op);.     
36620 20 74 65 73 74 63 61 73 65 28 20 21 70 57 49 6e   testcase( !pWIn
36630 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26  fo->okOnePass &&
36640 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
36650 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
36660 63 61 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f  case( !pWInfo->o
36670 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62  kOnePass && pTab
36680 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ->nCol==BMS );. 
36690 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f       if( !pWInfo
366a0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70  ->okOnePass && p
366b0 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b  Tab->nCol<BMS ){
366c0 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
366d0 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63   b = pTabItem->c
366e0 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20  olUsed;.        
366f0 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20  int n = 0;.     
36700 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e     for(; b; b=b>
36710 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20  >1, n++){}.     
36720 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
36730 61 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65  angeP4(v, sqlite
36740 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
36750 28 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20  (v)-1, .        
36760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36770 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54      SQLITE_INT_T
36780 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54  O_PTR(n), P4_INT
36790 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  32);.        ass
367a0 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43  ert( n<=pTab->nC
367b0 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ol );.      }.  
367c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
367d0 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
367e0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
367f0 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
36800 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
36810 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
36820 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
36830 44 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  DEX.    if( (pLo
36840 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
36850 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
36860 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
36870 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e  tructAutomaticIn
36880 64 65 78 28 70 50 61 72 73 65 2c 20 26 70 57 49  dex(pParse, &pWI
36890 6e 66 6f 2d 3e 73 57 43 2c 20 70 54 61 62 49 74  nfo->sWC, pTabIt
368a0 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c  em, notReady, pL
368b0 65 76 65 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  evel);.    }else
368c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
368d0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
368e0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
368f0 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
36900 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Ix = pLoop->u.bt
36910 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
36920 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20    KeyInfo *pKey 
36930 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
36940 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
36950 78 29 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58  x);.      /* FIX
36960 4d 45 3a 20 20 41 73 20 61 6e 20 6f 70 74 69 6d  ME:  As an optim
36970 69 7a 61 74 69 6f 6e 20 75 73 65 20 70 54 61 62  ization use pTab
36980 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 69 66  Item->iCursor if
36990 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
369a0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 49 6e  */.      int iIn
369b0 64 65 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  dexCur = pLevel-
369c0 3e 69 49 64 78 43 75 72 20 3d 20 69 49 64 78 43  >iIdxCur = iIdxC
369d0 75 72 20 3f 20 69 49 64 78 43 75 72 20 3a 20 70  ur ? iIdxCur : p
369e0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
369f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78       assert( pIx
36a00 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
36a10 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
36a20 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78    assert( iIndex
36a30 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  Cur>=0 );.      
36a40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
36a50 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  4(v, OP_OpenRead
36a60 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78  , iIndexCur, pIx
36a70 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20  ->tnum, iDb,.   
36a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a90 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
36aa0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
36ab0 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 56 64 62  DOFF);.      Vdb
36ac0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
36ad0 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b  ", pIx->zName));
36ae0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
36af0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
36b00 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
36b10 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d  .    notReady &=
36b20 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66   ~getMask(&pWInf
36b30 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 54 61  o->sMaskSet, pTa
36b40 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  bItem->iCursor);
36b50 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  .  }.  pWInfo->i
36b60 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
36b70 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
36b80 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
36b90 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
36ba0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
36bb0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
36bc0 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68  he code to do th
36bd0 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20  e search.  Each 
36be0 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
36bf0 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62   for.  ** loop b
36c00 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63  elow generates c
36c10 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ode for a single
36c20 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20   nested loop of 
36c30 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67  the VM.  ** prog
36c40 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52  ram..  */.  notR
36c50 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b  eady = ~(Bitmask
36c60 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  )0;.  for(ii=0; 
36c70 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b  ii<nTabList; ii+
36c80 2b 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d  +){.    pLevel =
36c90 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b   &pWInfo->a[ii];
36ca0 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53  .    explainOneS
36cb0 63 61 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  can(pParse, pTab
36cc0 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69  List, pLevel, ii
36cd0 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c  , pLevel->iFrom,
36ce0 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20   wctrlFlags);.  
36cf0 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f 64    notReady = cod
36d00 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57  eOneLoopStart(pW
36d10 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52 65 61  Info, ii, notRea
36d20 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  dy);.    pWInfo-
36d30 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65  >iContinue = pLe
36d40 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20  vel->addrCont;. 
36d50 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a   }..  /* Done. *
36d60 2f 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  /.  return pWInf
36d70 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  o;..  /* Jump he
36d80 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  re if malloc fai
36d90 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e  ls */.whereBegin
36da0 45 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49  Error:.  if( pWI
36db0 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73  nfo ){.    pPars
36dc0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
36dd0 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
36de0 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65  eryLoop;.    whe
36df0 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70  reInfoFree(db, p
36e00 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  WInfo);.  }.  re
36e10 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
36e20 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e   Generate the en
36e30 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c  d of the WHERE l
36e40 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e  oop.  See commen
36e50 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65  ts on .** sqlite
36e60 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f  3WhereBegin() fo
36e70 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
36e80 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  ormation..*/.voi
36e90 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  d sqlite3WhereEn
36ea0 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  d(WhereInfo *pWI
36eb0 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  nfo){.  Parse *p
36ec0 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
36ed0 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a  pParse;.  Vdbe *
36ee0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
36ef0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  e;.  int i;.  Wh
36f00 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
36f10 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
36f20 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74 20  Loop;.  SrcList 
36f30 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e  *pTabList = pWIn
36f40 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
36f50 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
36f60 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
36f70 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65  Generate loop te
36f80 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a  rmination code..
36f90 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78    */.  sqlite3Ex
36fa0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
36fb0 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57  rse);.  for(i=pW
36fc0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20  Info->nLevel-1; 
36fd0 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
36fe0 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
36ff0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f  ->a[i];.    pLoo
37000 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
37010 6f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  op;.    sqlite3V
37020 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
37030 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43  v, pLevel->addrC
37040 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ont);.    if( pL
37050 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f  evel->op!=OP_Noo
37060 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
37070 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
37080 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76  pLevel->op, pLev
37090 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e  el->p1, pLevel->
370a0 70 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  p2);.      sqlit
370b0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
370c0 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20  , pLevel->p5);. 
370d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f     }.    if( pLo
370e0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
370f0 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70  ERE_IN_ABLE && p
37100 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e  Level->u.in.nIn>
37110 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  0 ){.      struc
37120 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20  t InLoop *pIn;. 
37130 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
37140 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
37150 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
37160 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20  vel->addrNxt);. 
37170 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65       for(j=pLeve
37180 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e  l->u.in.nIn, pIn
37190 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  =&pLevel->u.in.a
371a0 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30  InLoop[j-1]; j>0
371b0 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20  ; j--, pIn--){. 
371c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
371d0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49  beJumpHere(v, pI
371e0 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b  n->addrInTop+1);
371f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
37200 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 49  VdbeAddOp2(v, pI
37210 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70  n->eEndLoopOp, p
37220 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61  In->iCur, pIn->a
37230 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20  ddrInTop);.     
37240 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
37250 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61  mpHere(v, pIn->a
37260 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20  ddrInTop-1);.   
37270 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
37280 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65  e3DbFree(db, pLe
37290 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
372a0 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  p);.    }.    sq
372b0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
372c0 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
372d0 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69  >addrBrk);.    i
372e0 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
372f0 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e  Join ){.      in
37300 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64  t addr;.      ad
37310 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
37320 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50  AddOp1(v, OP_IfP
37330 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  os, pLevel->iLef
37340 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 61 73  tJoin);.      as
37350 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  sert( (pLoop->ws
37360 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
37370 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20  X_ONLY)==0.     
37380 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d        || (pLoop-
37390 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
373a0 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a  _INDEXED)!=0 );.
373b0 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70        if( (pLoop
373c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
373d0 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
373e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
373f0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
37400 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c  P_NullRow, pTabL
37410 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
37420 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
37430 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
37440 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
37450 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  EXED ){.        
37460 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
37470 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
37480 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
37490 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
374a0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d   if( pLevel->op=
374b0 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20  =OP_Return ){.  
374c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
374d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
374e0 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c  sub, pLevel->p1,
374f0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
37500 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
37510 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
37520 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
37530 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65  P_Goto, 0, pLeve
37540 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20  l->addrFirst);. 
37550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
37560 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
37570 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d  (v, addr);.    }
37580 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22  .  }..  /* The "
37590 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20  break" point is 
375a0 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20  here, just past 
375b0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
375c0 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20  uter loop..  ** 
375d0 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73  Set it..  */.  s
375e0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
375f0 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f  eLabel(v, pWInfo
37600 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a  ->iBreak);..  /*
37610 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68   Close all of th
37620 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77  e cursors that w
37630 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71  ere opened by sq
37640 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e  lite3WhereBegin.
37650 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
37660 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d  pWInfo->nLevel<=
37670 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
37680 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65  ;.  for(i=0, pLe
37690 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69  vel=pWInfo->a; i
376a0 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b  <pWInfo->nLevel;
376b0 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b   i++, pLevel++){
376c0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
376d0 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
376e0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
376f0 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
37700 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
37710 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65  From];.    Table
37720 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65   *pTab = pTabIte
37730 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73  m->pTab;.    ass
37740 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
37750 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
37760 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
37770 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
37780 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
37790 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  al)==0.     && p
377a0 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a  Tab->pSelect==0.
377b0 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
377c0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
377d0 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c  ERE_OMIT_OPEN_CL
377e0 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  OSE)==0.    ){. 
377f0 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20 70 4c       int ws = pL
37800 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  oop->wsFlags;.  
37810 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d      if( !pWInfo-
37820 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 28 77  >okOnePass && (w
37830 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
37840 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
37850 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
37860 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
37870 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
37880 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
37890 20 20 20 69 66 28 20 28 77 73 20 26 20 57 48 45     if( (ws & WHE
378a0 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 26  RE_INDEXED)!=0 &
378b0 26 20 28 77 73 20 26 20 28 57 48 45 52 45 5f 49  & (ws & (WHERE_I
378c0 50 4b 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e  PK|WHERE_AUTO_IN
378d0 44 45 58 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  DEX))==0 ){.    
378e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
378f0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
37900 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  e, pLevel->iIdxC
37910 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ur);.      }.   
37920 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
37930 69 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20  is scan uses an 
37940 69 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44 42 45  index, make VDBE
37950 20 63 6f 64 65 20 73 75 62 73 74 69 74 75 74 69   code substituti
37960 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74 61  ons to read data
37970 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  .    ** from the
37980 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f   index instead o
37990 66 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  f from the table
379a0 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e   where possible.
379b0 20 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a    In some cases.
379c0 20 20 20 20 2a 2a 20 74 68 69 73 20 6f 70 74 69      ** this opti
379d0 6d 69 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e 74  mization prevent
379e0 73 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  s the table from
379f0 20 65 76 65 72 20 62 65 69 6e 67 20 72 65 61 64   ever being read
37a00 2c 20 77 68 69 63 68 20 63 61 6e 0a 20 20 20 20  , which can.    
37a10 2a 2a 20 79 69 65 6c 64 20 61 20 73 69 67 6e 69  ** yield a signi
37a20 66 69 63 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e  ficant performan
37a30 63 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a  ce boost..    **
37a40 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74   .    ** Calls t
37a50 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  o the code gener
37a60 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20  ator in between 
37a70 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
37a80 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c  n and.    ** sql
37a90 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c  ite3WhereEnd wil
37aa0 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63  l have created c
37ab0 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  ode that referen
37ac0 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20  ces the table.  
37ad0 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20    ** directly.  
37ae0 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20  This loop scans 
37af0 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f  all that code lo
37b00 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65  oking for opcode
37b10 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65  s.    ** that re
37b20 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c  ference the tabl
37b30 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74  e and converts t
37b40 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73  hem into opcodes
37b50 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66   that.    ** ref
37b60 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78  erence the index
37b70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
37b80 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
37b90 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44  & (WHERE_INDEXED
37ba0 7c 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29  |WHERE_IDX_ONLY)
37bb0 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d   ){.      pIdx =
37bc0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
37bd0 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73  pIndex;.    }els
37be0 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46  e if( pLoop->wsF
37bf0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
37c00 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70  TI_OR ){.      p
37c10 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e  Idx = pLevel->u.
37c20 70 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20  pCovidx;.    }. 
37c30 20 20 20 69 66 28 20 70 49 64 78 20 26 26 20 21     if( pIdx && !
37c40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
37c50 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c   ){.      int k,
37c60 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20   j, last;.      
37c70 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20  VdbeOp *pOp;..  
37c80 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
37c90 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57  3VdbeGetOp(v, pW
37ca0 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20  Info->iTop);.   
37cb0 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65     last = sqlite
37cc0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
37cd0 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  (v);.      for(k
37ce0 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b  =pWInfo->iTop; k
37cf0 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b  <last; k++, pOp+
37d00 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
37d10 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d  pOp->p1!=pLevel-
37d20 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69  >iTabCur ) conti
37d30 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
37d40 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
37d50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  _Column ){.     
37d60 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
37d70 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a  pIdx->nColumn; j
37d80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
37d90 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49   if( pOp->p2==pI
37da0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20  dx->aiColumn[j] 
37db0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
37dc0 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20   pOp->p2 = j;.  
37dd0 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d              pOp-
37de0 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
37df0 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
37e00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
37e10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37e20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
37e30 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
37e40 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
37e50 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20  IDX_ONLY)==0 || 
37e60 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  j<pIdx->nColumn 
37e70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
37e80 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
37e90 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20  ==OP_Rowid ){.  
37ea0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
37eb0 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
37ec0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  r;.          pOp
37ed0 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64  ->opcode = OP_Id
37ee0 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  xRowid;.        
37ef0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
37f00 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20    }..  /* Final 
37f10 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70  cleanup.  */.  p
37f20 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
37f30 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  p = pWInfo->save
37f40 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77  dNQueryLoop;.  w
37f50 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c  hereInfoFree(db,
37f60 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75   pWInfo);.  retu
37f70 72 6e 3b 0a 7d 0a                                rn;.}.